При обнаружении новой уязвимости есть необходимость чётко указать, в каком именно программного продукте, библиотеке или даже устройстве она нашлась и актуальна. Самым распространённым, при этом уже устаревшим и, к сожалению, далёким от совершенства решением этой задачи на данный момент является 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
Атрибут part указывает на тип: софт это и какой (приложение, ОС), или железо. Остальные кусочки прокладывают путь от производителя до максимально точного указания версии.
Второй важной частью CPE является словарь, CPE dictionary. Именно в нём в первую очередь формируется стандартизированное соответствие названия софта с CPE.
Главная проблема CPE, к сожалению, остаётся в том, что для адекватного сопоставления уязвимости с софтом он ненадёжен. Если речь идёт про OSS:
словари неполные;
часто названия не соответствуют, например, используемым в пакетных индексах;
в подавляющем большинстве словарных значений не указан язык программирования;
могут использоваться разные значения vendor и product для одного и того же софта разных версий.
Всё это и другие проблемы приводят к ложноотрицательным и ложноположительным срабатываниям. Поэтому разработчики систем композиционного анализа прибегают к алгоритмическим (NLP, ML) и rule-based подходам повышения точности идентификации в комбинации с PURL-кодификацией пакетов.
Стандарт CPE уже несколько лет пытаются похоронить, но адекватной распространённой замены пока нет.
Про очень близкий по смыслу стандарт PURL мы писали ранее.