Блог CodeScoring

Что такое CPE

При обнаружении новой уязвимости есть необходимость чётко указать, в каком именно программного продукте, библиотеке или даже устройстве она нашлась и актуальна. Самым распространённым, при этом уже устаревшим и, к сожалению, далёким от совершенства решением этой задачи на данный момент является Common Platform Enumeration, CPE.

CPE — это стандарт для машиночитаемого именования и идентификации всех видов программного обеспечения (софта) и устройств. Как у любого стандарта, у CPE есть несколько версий. Наиболее актуальной на данный момент является версия 2.3.

Две самые главные части этой версии стандарта это: схема именования и словарь.

Схема именования определяет набор атрибутов, которые идентифицируют софт или железку: part, vendor, product, version, update, edition, language, sw edition, target sw, target hw, and other.

Все атрибуты должны быть указаны в строке специального вида в виде точного значения, либо специального значения NA (не определено) или ANY (любое значение, также обозначается символом *). Примеры строк:

  • cpe:2.3:a:microsoft:internet_explorer:8.0.6001:beta:*:*:*:*:*:* — Microsoft Internet Explorer 8.0.6001 Beta
  • cpe:2.3:a:djangoproject:django:2.2.9:*:*:*:*:*:*:* — фреймворк Django 2.2.9
  • cpe:2.3:a:facebook:react:16.0.0:beta5:*:*:*:*:*:* — фреймворк React 16.0.0-beta5

Атрибут part указывает на тип: софт это и какой (приложение, ОС), или железо. Остальные кусочки прокладывают путь от производителя до максимально точного указания версии.

Второй важной частью CPE является словарь, CPE dictionary. Именно в нём в первую очередь формируется стандартизированное соответствие названия софта с CPE.

Главная проблема CPE, к сожалению, остаётся в том, что для адекватного сопоставления уязвимости с софтом он ненадёжен. Если речь идёт про OSS:

  • словари неполные;
  • часто названия не соответствуют, например, используемым в пакетных индексах;
  • в подавляющем большинстве словарных значений не указан язык программирования;
  • могут использоваться разные значения vendor и product для одного и того же софта разных версий.

Всё это и другие проблемы приводят к ложноотрицательным и ложноположительным срабатываниям. Поэтому разработчики систем композиционного анализа прибегают к алгоритмическим (NLP, ML) и rule-based подходам повышения точности идентификации в комбинации с PURL-кодификацией пакетов.

Стандарт CPE уже несколько лет пытаются похоронить, но адекватной распространённой замены пока нет.

Про очень близкий по смыслу стандарт PURL мы писали ранее.