Хакер - Баги, которые от нас скрывают. Выбираем лучший сайт для поиска уязвимостей
hacker_frei
Виталий Меньшов
Содержание статьи
- Штатный поисковик NVD
- CVE Details
- Vulners
- Итоги
Существует всего несколько сайтов, которые можно использовать, чтобы искать уязвимости. В этой статье я проверю, насколько хорошо они справляются со своей задачей и находят уязвимости, получившие номер CVE. По результатам решим, какой или какие поисковики лучше использовать в первую очередь.
Я в основном занимаюсь встраиваемыми самосборными операционными системами на основе 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:linux_kernel) и его версию.

Результат — 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.0-2019.xml — это как раз описание всех CVE 2019 года в формате XML. Кстати, поле pub_date содержит значение 2019-10-15T03:00:00, то есть фактически NIST продолжил обновлять XML еще какое‑то время после дедлайна.
Так вот, значение полей vulnerable-software-list поразительным образом полностью соответствует тому, что мы видим на cvedetail.com.


Дело в том, что разработчики NVD раньше экспериментировали и для части записей пытались указать все уязвимые версии, а для части просто указывали диапазон версий (последнюю уязвимую версию). CVE Details просто не умеет анализировать эти диапазоны версий.
Для CVE-2019-17133 действительно изначально указан диапазон версий. Если скачать еще один файл — nvdcve-2019.xml (то же самое описание, но с использованием формата полей версии 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 году некоторые мои знакомые продолжали им пользоваться, стараясь не замечать всех накопившихся недостатков.
Кстати, удивительно, но как только я уже было закончил работать над этой статьей, сайт CVE Details впервые за последние полтора года обновился!

Но, к сожалению, с этим обновлением была удалена даже имеющаяся поддержка версий. И теперь, например, и CVE-2019-17133, и CVE-2019-17351 выглядят вот так.


Боюсь, теперь пользоваться CVE Details для сколько‑нибудь эффективного поиска по версиям будет совсем невозможно.
VULNERS
Думаю, об этом поисковике уже слышал каждый, кто в теме. Мне самому он близок из‑за открытости, которую пропагандируют его авторы. В открытом доступе как отдельные средства для поиска уязвимостей, так и сама база (правда, теперь только для исследователей).
INFO
«Хакер» подробно писал о Vulners дважды: в статьях «Vulners — Гугл для хакера» и «Ищем эксплоиты из Python, сканим уязвимые серверы и автоматизируем пентест».
Как ты понял, уже изначально я был предвзят и рассматривал Vulners как явного лидера.
Попробуем поискать уязвимости нашего подопытного ядра версии 4.14.194, оставляем только записи NVD. Результат действительно удивляет: всего одна уязвимость!

Наверное, опять что‑то не так делаю. Попробую повторить все то же самое, но через Vulners API Python wrapper. Запустим скрипт для поиска по идентификатору CPE:
import vulners
import json
vulners_api = vulners.Vulners(api_key="Здесь_должен_быть_ключ")
cpe_results = vulners_api.cpeVulnerabilities("cpe:/o:linux:linux_kernel:4.14.194")
cpe_NVD_list = cpe_results.get('NVD')
print("cpe:/o:linux:linux_kernel:4.14.194")
print(json.dumps(cpe_NVD_list, indent=2, sort_keys=False))
Для получения бесплатного ключа нужно зарегистрироваться на сайте, и вот результат, но опять жиденький — всего 55 уязвимостей.
Пробовал искать и по‑другому.

Но так получалось еще хуже.

Видимо, первый вариант поиска был самым верным, сравним с результатами веб‑поисковика NVD.

Возьмем, например, CVE-2018-7754 и CVE-2018-7755. Первая — в обоих списках, вторая только в NVD. Сравним их между собой.

По первому впечатлению особой разницы не видно, linux_kernel есть и там и там.
Сравнил еще описания этих двух уязвимостей в JSON, есть возможность загрузить их на сайте для выбранных уязвимостей (см. пример и рисунок ниже).

Но, честно говоря, существенной разницы между описаниями CVE-2018-7754 и CVE-2018-7755 не нашел (диапазоны уязвимых версий есть и в добавленных полях affectedSoftware, и во взятых с NVD cpeConfiguration).
Попробую связаться с разработчиками Vulners. Может, они что‑то подскажут!
ИТОГИ
Мы рассмотрели поиск уязвимостей по NVD для дистрибутивов, где единственный мейнтейнер — это, возможно, ты сам и где поиск уязвимостей еще не поставлен на поток как в Red Hat или Ubuntu.
По результатам сравнения должен сделать вывод, что на данный момент лучше всего для не «пакетированных» дистрибутивов пользоваться штатным поиском NVD, но именно веб‑версией, она выдает лучшие результаты.
А задавать любую версию, даже ту, которой нет в CPE, можно непосредственно в URL-строке, например так (номер версии — в самом конце):
https://nvd.nist.gov/vuln/search/results?form_type=Advanced&results_type=overview&search_type=all&cpe_vendor=cpe%3A%2F%3Alinux&cpe_product=cpe%3A%2F%3Alinux%3Alinux_kernel&cpe_version=cpe%3A%2F%3Alinux%3Alinux_kernel%3A4.14.999
А для широко применяемых дистрибутивов ОС, я думаю, Vulners будет лучшим вариантом.
Развитие событий
Вот что мне удалось узнать у разработчиков Vulners.
Строка поиска на сайте, как я и предположил в переписке, позволяет находить только уязвимости с точным соответствием уязвимой и искомой версии продукта. Можно задавать шаблон искомых версий (1.9*, [86 TO 86.4]). А для поиска тех записей NVD, где указан диапазон уязвимых версий, нужно использовать Python API.
Алгоритм Python API доработали после моего репорта, и сейчас поиск по CPE выдает 470 записей, а сравнение результатов с сайтом NVD практически всегда в пользу Vulners.
Теперь могу смело рекомендовать Vulners.com для поиска по NVD.
На самом деле кое‑какие претензии к поисковикам у меня еще остались. Например, они не найдут уязвимость CVE-2020-16119, для которой нет патча в upstream ядра. Поэтому, возможно, мы еще продолжим этот разговор.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei