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 мы писали ранее.