Сервис хранения единой базы уязвимостей#
В Platform V ASOC Control Center реализован Сервис хранения единой базы уязвимостей.
Описание Сервиса хранения единой базы уязвимостей приведено в документе Назначение.
Сервис хранения единой базы уязвимостей позволяет:
Получать данные об уязвимостях из внешних БДУ. Единая база уязвимостей дополняется записями о новых уязвимостях из разных источников. Процесс получения данных из разных источников описан в разделе Обновление единой базы уязвимостей из внешних БДУ.
Дедуплицировать записи об одной уязвимости, полученные из разных источников. Процесс дедупликации описан в разделе Дедупликация.
Сохранять историю происхождения записей.
Обновлять данные об уязвимостях - карточки уязвимостей в единой базе уязвимостей обновляются и дополняются.
Получать оригинальные и агрегированные записи об уязвимостях.
Обновление единой базы уязвимостей из внешних БДУ#
Для поддержания единой базы уязвимостей в актуальном состоянии, реализован механизм загрузки обновлений посредством выполнения запроса через защищенную точку подключения. Для выполнения запроса используется API конкретной БДУ.
Процесс загрузки уязвимостей из внешних источников (БДУ) осуществляется с заданной периодичностью, настраиваемой в
файле конфигурации application.yaml (пример ниже в поле cron).
Для загрузки обновлений через защищенную точку подключения, в конфигурации приложения необходимо задать параметры
приведенные в таблице, в файле application.yaml сервиса.
Параметр |
Описание |
Пример заполнения |
|---|---|---|
|
Название источника |
|
|
Флаг включения/выключения загрузчика из выбранного источника. Доступные значения |
|
|
Расписание запуска загрузки уязвимостей в формате |
|
|
URL БДУ |
|
|
Токен для доступа к БДУ выдается на сайте БДУ |
|
|
Количество результатов получаемых из БДУ за один запрос |
|
|
Начальная дата загрузки уязвимостей из БДУ. Используется при первом запуске для загрузки всех уязвимостей с указанной даты. Значение по умолчанию |
|
|
Максимальное количество повторных попыток выполнения запроса к API БДУ в случае ошибки |
|
|
Задержка между повторными запросами к API БДУ (в миллисекундах) |
|
|
Количество параллельных потоков, используемых для загрузки уязвимостей из NVD |
|
|
Максимальный диапазон дней, за который можно запрашивать данные из NVD за один запрос (ограничение API БДУ) |
|
|
Минимальное количество потоков в пуле потоков (остаются активными, даже если простаивают) |
|
|
Максимальное количество потоков в пуле потоков (дополнительные потоки создаются при перегрузке) |
|
|
Максимальное количество задач, которые могут ожидать в очереди, пока потоки будут доступны |
|
|
Начальная дата загрузки уязвимостей из БДУ GitHub Advisory. Используется при первом запуске |
|
|
Максимальное количество повторных попыток выполнения запроса к API БДУ при ошибке |
|
|
Задержка между повторными запросами к API БДУ (в миллисекундах) |
|
Пример заполнения параметров в application.yaml сервиса хранения единой базы уязвимостей:
sources: #конфигурация передаваемая в класс загрузчика уязвимостей
- name: NVD #название источника
enabled: ${NVD_ENABLED:true} #флаг включения/выключения загрузчика из выбранного источника
cron: ${NVD_CRON:* * 10 * * *} #периодичность запуска загрузки уязвимостей
url: ${NVD_URL:https://services.nvd.nist.gov/rest/json/cves/2.0} #URL БДУ
apiKey: ${NVD_API_KEY:2xx01xxd-dxx6-xxac-9xxe-xx71xxa6xx3x} #токен для доступа к БДУ
resultsPerPage: ${RESULT_PER_PAGE:2000} #Количество результатов получаемых из БДУ за один запрос
nvd:
loader:
start-date: ${LOAD_START_DATE:1988-01-01T00:00:00} #начальная дата загрузки уязвимостей(используется при первом запуске для загрузки всех уязвимостей)
retry-attempts: ${NVD_RETRY_ATTEMPT:3} #количество повторных попыток выполнения запросов
initial-delay: ${NVD_INITIAL_DELAY:2000} #задержка между повторными запросами (миллисекунды)
concurrency: ${NVD_CONCURRENCY:5} #сколько параллельных потоков использовать для загрузки уязвимостей
day-range: ${NVD_DAY_RANGE:120} #ограничение NVD API на диапазон дат (максимум 120 дней можно запросить за раз)
executor: #глобальные настройки пула потоков
core-pool-size: ${CORE_POOL_SIZE:4} #минимальное количество потоков
max-pool-size: ${MAX_POOL_SIZE:8} #максимальное количество потоков
queue-capacity: ${QUEUE_CAPACITY:5000} #очередь задач
Дедупликация#
Для исключения дублирующихся записей об уязвимостях и поддержания единой базы уязвимостей в актуальном состоянии, в Сервисе хранения единой базы уязвимостей реализован механизм регулярной дедупликации записей об одной и той же уязвимости, полученной из разных БДУ.
Процесс получения данных из внешних БДУ описан в разделе Обновление единой базы уязвимостей из внешних БДУ.
Механика дедупликации записей об уязвимостях#
Для дедупликации используется метод Ingestion deduplication/ingest-time deduplication - дедупликация в момент загрузки из внешних источников (БДУ).
Запись об уязвимости попадает в единую базу уязвимостей и сохраняется в таблице
raw_record:Сервис хранения единой базы уязвимостей отправляет запрос во внешний источник (БДУ).
Внешний источник отправляет запись об уязвимости в сервис хранения единой базы уязвимостей.
Запись сохраняется в таблице
raw_recordс указанием источника (source), идентификатора уязвимости (vuln_id), даты добавления (fetched_at) и сырых данных (payload).
Единая база уязвимостей нормализует запись и сохраняет данные об уязвимости в таблицу
normalized_raw_record:Сервис хранения единой базы уязвимостей нормализует данные из таблицы
raw_record.Нормализованные данные сохраняются в таблицу
normalized_raw_recordс указанием идентификатора сырой записи (raw_id), даты создания (created), уровня серьезности (severity), базового балла CVSS (cvss_base_score), даты первой публикации (published), даты последнего обновления (updated), списка ссылок на источники (references), списка CWE-кодов (cwes), списка альтернативных идентификаторов (aliases) и оценки CVSS в виде векторной строки (cvss_vector).
Сервис хранения единой базы уязвимостей проверяет наличие дубликатов:
Сервис сравнивает идентификатор уязвимости (
vuln_id), источник (source) и значение в полеaliasesс уже существующими записями в таблицеnormalized_raw_record.Если запись уже существует, сервис определяет, что это дубликат.
Если запись является дубликатом, сервис объединяет данные в агрегированную уязвимость:
Агрегированные данные сохраняются в таблицу
cvulnс указанием заголовка уязвимости (title), полного агрегированного описания (description), агрегированного показателя CVSS (aggregated_cvss), списка затронутых пакетов (affected_packages), даты последнего обновления (last_updated) и агрегированного уровня серьезности (aggregated_severity).
Запись о происхождении нормализованных данных сохраняется в таблицу
provenance:В таблицу
provenanceзаписывается информация о происхождении нормализованных данных, включая идентификатор агрегированной уязвимости (cvuln_id), идентификатор нормализованной записи (normalized_raw_id), этап дедупликации (merge_step), уровень уверенности алгоритма (confidence) и поля, которые данный источник внес в агрегат (fields_contributed).
Прогресс загрузки данных об уязвимостях обновляется в таблице
loading_track:В таблицу
loading_trackзаписывается информация о прогрессе загрузки данных, включая источник уязвимостей (source_name), последнее успешно загруженное смещение (last_published_at), дату последней успешно загруженной уязвимости по дате публикации (last_start_index), дату последней успешно загруженной уязвимости по дате изменения (last_modified_at) и количество загруженных уязвимостей (count_vulnerabilities).
Модель данных#
Модель данных сервиса хранения единой базы уязвимостей.

Описание таблиц модели данных единой базы уязвимостей:
raw_record- хранение сырых записей об уязвимости, полученных из внешнего источника;normalized_raw_record- хранение нормализованных данных уязвимости, полученных из сырых записей;component- хранение компонентов/пакетов программного обеспечения, для которых может существовать уязвимость;vulnerable_component- хранение связей между уязвимостью и компонентом, отражающих, какие версии компонента подвержены данной уязвимости;cvuln- хранение агрегированных уязвимостей, объединяющих информацию из разных источников;provenance- хранение записей о происхождении нормализованных данных, вошедших в агрегированные уязвимости;loading_track- хранение прогресса загрузки данных об уязвимостях из внешних источников.
raw_record#
Хранение сырых записей об уязвимости, полученных из внешнего источника.
Поле в таблице |
Описание |
|---|---|
|
Дата добавления записи об уязвимости в сервис |
|
Источник данных об уязвимости. Поле обязательно к заполнению. Пример заполнения: |
|
Идентификатор уязвимости в источнике. Соответствует полю VULNID в Dependency Track, обязательно к заполнению. Пример заполнения: |
|
Сырые данные в формате JSON, сохраненные без изменений |
normalized_raw_record#
Хранение нормализованных данных уязвимости, полученных из сырых записей.
Поле в таблице |
Описание |
|---|---|
|
Идентификатор сырой записи, с которой связана нормализованная запись |
|
Дата создания нормализованной записи |
|
Уровень серьезности уязвимости. Соответствует полю SEVERITY в Dependency Track. Пример: |
|
Базовый балл уязвимости по CVSS. CVSS - система оценки уязвимости (подробное описание системы оценки приведено в официальной спецификация CVSS (Common Vulnerability Scoring System) версии 3.1). Базовые метрики дают оценку в диапазоне от 0 до 10 |
|
Дата первой публикации уязвимости в источнике |
|
Дата последнего обновления данных |
|
Список ссылок на источники |
|
Список CWE-кодов, связанных с уязвимостью |
|
Список альтернативных идентификаторов уязвимости (например, |
|
Оценка CVSS в виде векторной строки — сжатого текстового представления значений, используемых для ее получения. Пример: |
component#
Хранение компонентов/пакетов программного обеспечения, для которых может существовать уязвимость.
Поле в таблице |
Описание |
|---|---|
|
Package URL - cтандартизированный и универсальный способ идентификации пакетов и компонентов программного обеспечения. Пример: |
|
Уникальный идентификатор платформы |
|
Тип экосистемы, к которой принадлежит пакет (например, go) |
|
Название уязвимого пакета |
|
Производитель продукта |
|
Продукт или библиотека |
vulnerable_component#
Хранение связей между уязвимостью и компонентом, отражающих, какие версии компонента подвержены данной уязвимости.
Поле в таблице |
Описание |
|---|---|
|
Идентификатор уязвимости в таблице normalized_raw_record |
|
Идентификатор компонента в таблице component |
|
Конкретная уязвимая версия |
|
Указывает первую версию, которая включает данный уязвимый компонент. Эта версия является нижней границей диапазона то есть минимальная версия, включенная в диапазон. Например, когда с GitHub приходит поле |
|
Указывает нижнюю границу диапазона версий, которые подвержены уязвимости. Эта версия исключается из диапазона, что означает, что компоненты с этой версией и ниже не подвержены уязвимости. Например, когда с GitHub приходит поле |
|
Максимальная версия, включенная в диапазон. Например, когда с GitHub приходит поле |
|
Максимальная версия, исключенная из диапазона |
|
Указывает, что данное программное обеспечение подвержено указанной уязвимости. Если это значение |
cvuln#
Хранение агрегированных уязвимостей, объединяющих информацию из разных источников.
Поле в таблице |
Описание |
|---|---|
|
Заголовок уязвимости |
|
Полное агрегированное описание уязвимости |
|
Агрегированный показатель CVSS |
|
Список затронутых пакетов |
|
Дата последнего обновления агрегированной уязвимости |
|
Агрегированный уровень серьезности |
provenance#
Хранение записей о происхождении нормализованных данных, вошедших в агрегированные уязвимости.
Поле в таблице |
Описание |
|---|---|
|
Агрегированная уязвимость, в которую включена нормализованная запись |
|
Исходная нормализованная запись |
|
Этап дедупликации |
|
Уровень уверенности алгоритма |
|
Поля, которые данный источник внес в агрегат |
loading_track#
Хранение прогресса загрузки данных об уязвимостях из внешних источников.
Поле в таблице |
Описание |
|---|---|
|
Источник уязвимостей |
|
Последнее успешно загруженное смещение (startIndex) из источника |
|
Дата последней успешно загруженной уязвимости по дате публикации |
|
Дата последней успешно загруженной уязвимости по дате изменения |
|
Количество загруженных уязвимостей |
Интеграция с Dependency track#
Для поддержания внутренней базы Dependency track в актуальном состоянии, в Сервисе хранения единой базы уязвимостей реализована интеграция с Dependency track посредством API взаимодействия.
Диаграмма взаимодействия Dependency track с Cервисом хранения единой базы уязвимостей.