Содержание статьи
Я в основном занимаюсь встраиваемыми самосборными операционными системами на основе Linux. Поиск уязвимостей в компонентах этих ОС — нетривиальная задача. В своем докладе на PHDays 10 я говорил о том, что пришлось создать собственное средство для поиска уязвимостей, потому что каждое из имеющихся бесплатных решений меня чем‑нибудь да не устраивает. Но с тех пор прошло много времени, и, когда готовил доклад, я решил проверить, как обстоят дела сейчас. Так и родилась эта статья.
Вопрос об идентификации пакетов, установленных в системе, я обычно решаю вручную или простейшими скриптами. Так что эту сторону вопроса я опущу. Будем просто считать, что у нас уже есть список всего софта — названия продуктов и их версии.
Какие есть варианты поиска уязвимостей для этих компонентов? Будем рассматривать только бесплатные решения — бюджет, как всегда, ограничен:
- штатный поисковик NVD;
- CVE Details — популярен чуть ли не больше самого CVE;
- Vulners — специализированный поисковик по уязвимостям, разработчики которого заявляют, что непрерывно добавляют новые источники и даже используют ИИ для определения критичности уязвимости.
Штатный поисковик NVD
Поиск на сайте NVD кажется хорошим вариантом: кто лучше знает, как искать по базе NVD, если не ее составители? Однако стоит поискать уязвимости в ядре Linux, и оказывается, что не все так радужно.
Допустим, мы используем старое доброе ядро 4.14, не забываем и патчим его до последней на сегодня (11 апреля) версии 4.14.230. Используем расширенный вариант поиска (Search Type: Advanced). Проверить эту версию в поисковике не выйдет. Даже версия 4.14.200 незнакома NVD, а последняя из доступных — 4.14.194 (21 августа 2020 года). NVD об этом честно сообщает в примечании.
Дело в том, что веб‑интерфейс поисковика позволяет использовать только версии продуктов из словаря CPE (Common Platform Enumeration). Если проигнорировать это предупреждение и вбить нужную версию 4.14.230, то по нажатии кнопки search получим более четырех тысяч уязвимостей всех версий ядра Linux.
Не страшно, пусть у нас будет версия 4.14.194.
Поисковик выдал 460 результатов, довольно хорошо для такого большого продукта.
Но попробуем обойти поиск только по известным CPE, ведь NVD предоставляет еще REST API (смотри документацию в PDF).
Формируем следующий поисковый запрос:
https://services.nvd.nist.gov/rest/json/cves/1.0?cpeMatchString=cpe:2.3:o:linux:linux_kernel:4.14.194.&startIndex=0
Результаты выдаются в виде файла JSON, по умолчанию по 20 штук на странице, если не хочется все это объединять, то можно дописать к поисковому запросу такую строку:
&resultsPerPage=1400
Но тут уже надо рассчитывать на удачу, сервер NVD для защиты от DDoS иногда не отвечает на такие жадные запросы. Мне по большей части везло, и удавалось получать до 2000 результатов на странице.
В итоге получаем довольно странный результат — 1315 уязвимостей. Почти на тысячу больше!
Попробуем разобраться. Сохраняем все страницы с результатом поиска. Затем прямо в Notepad++ ищем все идентификаторы CVE в HTML и JSON, сортируем их и сравниваем.
Даже если выборочно проверять уязвимости, которых нет в результатах веб‑поиска, сразу видно их характерные особенности.
Веб‑версия не выводит уязвимости, где искомый продукт помечен как Running on/with, то есть он просто работает совместно с уязвимым. Веб‑версия выдает нам только уязвимости ядра Linux, а REST API — еще и уязвимости всего ПО, что работает на Linux. Здесь, пожалуй, преимущество веб‑поиска налицо. Давай дальше рассматривать результаты веб‑поиска NVD как некий эталон и посмотрим, что покажут другие два сайта.
CVE Details
Это популярный сайт, его статистику можно видеть во многих статьях и докладах. Но можно ли его использовать как поисковик уязвимостей? Конечно! И поначалу я был в восторге от умного сайта, который из полутора тысяч CVE-шек ядра Linux оставил меньше сотни. Только потом оказалось, что и тут все не так просто.
Пробуем искать уязвимости, используем поиск по версии и вводим название ядра согласно CPE (linux:
) и его версию.
Результат — No matches. Как я понимаю, сайт тоже не знает нашу версию. Методом последовательного «даунгрейда» удалось выяснить, что самая старшая поддерживаемая версия интересующей нас ветви — это 4.14.141. Смотрим на результат: чуть больше 50 уязвимостей.
Это гораздо меньше, чем выдает NVD (470 для версии 4.14.141). Сравним перечни найденных уязвимостей. Различия в результатах поиска продемонстрирую на двух примерах: CVE-2019-17351 и CVE-2019-17133.
Почему‑то такие одинаковые по описанию уязвимости по‑разному обрабатываются. Веб‑поиск NVD находит обе уязвимости, а CVE Details только CVE-2019-17351. CVE-2019-17133 нет в результатах поиска, и нет версии 4.14.141 в перечне уязвимых версий в описании на CVE Details. Причем на сайте NVD уязвимые версии для двух этих CVE отображены одинаково корректно.
Причину такого поведения CVE Details можно найти на странице с описанием принципов работы сайта. Оказывается, сайт берет данные из RSS-рассылки об изменении XML-описания уязвимостей. NVD официально прекратила обновлять XML-описания 9 октября 2019 года и перешла исключительно на использование JSON. Но пропуск уязвимостей с этим не связан. Посмотрим глубже и найдем в архивах интернета файл nvdcve-2.
— это как раз описание всех CVE 2019 года в формате XML. Кстати, поле pub_date
содержит значение 2019-10-15T03:
, то есть фактически NIST продолжил обновлять XML еще какое‑то время после дедлайна.
Так вот, значение полей vulnerable-software-list
поразительным образом полностью соответствует тому, что мы видим на cvedetail.com.
Дело в том, что разработчики NVD раньше экспериментировали и для части записей пытались указать все уязвимые версии, а для части просто указывали диапазон версий (последнюю уязвимую версию). CVE Details просто не умеет анализировать эти диапазоны.
Для CVE-2019-17133 действительно изначально указан диапазон версий. Если скачать еще один файл — nvdcve-2019.
(то же самое описание, но с использованием формата полей версии 1.2, а не 2.0), то там можно увидеть следующее.
Флаг prev
как раз и означает, что уязвимы все предыдущие версии, но почему‑то при переходе с версии 1.2 на 2.0 этот флаг потерялся, и в описании версии 2.0 уже невозможно было различить, где указаны отдельные версии, а где их диапазон. NIST обновлял обе версии описания, но кто же захочет пользоваться версией 1.2, когда есть 2.0? Поэтому здесь CVE Details винить сложно.
Переход NVD на JSON плохо сказался на CVE Details, статистика уязвимостей на сайте красноречива.
Еще за 2019 год CVE Details недосчитался 5000 уязвимостей и не было ни одной уязвимости за 2020–2021 годы, сайт просто перестал обновляться. Но до сих пор у него есть поклонники, и в 2020 году некоторые мои знакомые продолжали им пользоваться, стараясь не замечать всех накопившихся недостатков.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»