На данный момент существует только несколько сайтов для поиска уязвимостей. С помощью данной статьи мне нужно будет проверить их работу на наличие недостатков, а также найти уязвимости под номером CVE. А по результатам этого мы примем решение о том какие лучшие сайты для поиска уязвимостей сайты для поиска уязвимостей следует использовать в первую очередь.
Обычно я решаю проблему определения пакетов, установленных в системе, вручную или с помощью простых скриптов. Так что я опущу эту сторону вопроса. Скажем так, у нас уже есть список всего программного обеспечения — названия продуктов и их версии.
Какие есть варианты по поиску уязвимостей для этих компонентов? В этом случае мы будем рассматривать только бесплатные варианты — Бюджет, как всегда, ограничен:
- штатный поисковик NVD;
- CVE Details — популярен чуть ли не больше самого CVE;
- Vulners — специализированный поисковик по уязвимостям, разработчики которого заявляют, что непрерывно добавляют новые источники и даже используют ИИ для определения критичности уязвимости.
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. Более того, на странице 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 просто означает, что все предыдущие версии уязвимы, но по какой-то причине этот флаг был утерян при переходе с v1.2 на v2.0, а в v2.0 больше нельзя было различать, где какие ревизии были указаны, а где их объем есть. NIST обновил обе версии описания, но кто хочет использовать версию 1.2, когда это 2.0? Так что здесь сложно винить детали CVE.
Переход NVD на JSON плохо сказался на CVE Details, статистика уязвимостей на сайте красноречива.
В 2019 году в деталях CVE отсутствовало 5000 уязвимостей и не было ни одной уязвимости за период 2020-2021 годов, сайт просто перестал обновляться. Но у него все еще есть поклонники, и в 2020 году некоторые из моих друзей продолжили им пользоваться, стараясь не замечать всех накопившихся недостатков.
Кстати, удивительно, но как только я уже было закончил работать над этой статьей, сайт CVE Details впервые за последние полтора года обновился!
Но, к сожалению, с этим обновлением была удалена даже имеющаяся поддержка версий. И теперь, например, и CVE-2019-17133, и CVE-2019-17351 выглядят вот так.
Боюсь, теперь пользоваться CVE Details для сколько‑нибудь эффективного поиска по версиям будет совсем невозможно.
Поисковик NVD
Веб-сайт NVD – хороший вариант для поиска в базе данных NVD. Кто лучше знает, как искать в базе информации NVD, если не ее составитель? А вот найти уязвимости в ядре Linux, как выясняется, не так просто.
Допустим, мы используем старое доброе ядро 4.14, не забудьте и пропатчите его до последней версии 4.14.230 на сегодня (11 апреля). Мы используем опцию расширенного поиска (Тип поиска: Расширенный). Вы не сможете проверить эту версию в поисковой системе. Даже версия 4.14.200 незнакома NVD, а последняя доступная — 4.14.194 (21 августа 2020 г.). NVD честно сообщает об этом в заметке.
Дело в том, что веб-интерфейс поисковой системы позволяет использовать только версии продукта из словаря CPE (Common Platform Enumeration). Если проигнорировать это предупреждение и ввести нужную версию 4.14.230, то, нажав кнопку поиска, мы получим более четырех тысяч уязвимостей всех версий ядра Linux.
Поисковая система выдала 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 уязвимостей.
Результаты поиска через REST API
Попробуем выяснить. Сохраняем все страницы с результатом поиска. Затем мы ищем все идентификаторы CVE в HTML и JSON прямо в Notepad ++, сортируем и сравниваем их.
Даже если выборочно проверять уязвимость, которой нет в результатах веб-поиска, сразу видно ее характерный признак.
В веб-версии не отображаются уязвимости, в которых искомый продукт помечен как Running on/with, то есть просто работает вместе с уязвимым. Веб-версия дает нам только уязвимости ядра Linux, а REST API также дает нам уязвимости во всем программном обеспечении, работающем в Linux. Здесь, пожалуй, налицо преимущество веб-поиска. Давайте рассмотрим результаты веб-поиска NVD в качестве ориентира и посмотрим, что показывают два других сайта.
Vulners
Я думаю, что каждый, кто был в теме, слышал об этой поисковой системе. Я сам к ней близок из-за открытости, которую пропагандируют ее авторы. В открытом доступе и отдельные инструменты для поиска уязвимостей, и сама база данных (но только для исследователей).
Сейчас попробуем поизучать уязвимость нашего подопытного ядра версий 4.14.194, оставив лишь записи NVD. Результат впечатляет: всего одна уязвимость!
Постараюсь воспроизвести все то же самое, но через интерфейс Vulners API Pythон 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
).
Итоги
Мы рассмотрели исследование уязвимостей 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
А вот для широко применяемых дистрибутивов ОС, Vulsner будет лучшим вариантом.