Мониторинг открытых источников об уязвимостях: CVE, БДУ ФСТЭК, бюллетени вендоров

0
19
Обложка статьи: Мониторинг открытых источников об уязвимостях: CVE, БДУ ФСТЭК, бюллетени вендоров

Сканер находит уязвимость только после того, как его ленты тестов обновились и очередной скан дошёл до нужного узла. Это дни, а иногда недели. Критичную дыру в VPN-шлюзе или веб-сервере, которой уже пользуются атакующие, вы должны узнать в день публикации. Для этого нужен второй канал: мониторинг открытых источников. Ниже какие источники читать, как не утонуть в потоке, как отсеивать лишнее скриптом и как показывать, что мониторинг делается регулярно.

Что делать, когда сообщение оказалось про ваш периметр, описано в плейбуке критичной уязвимости. Куда записывать результат — в реестр уязвимостей.

Какие источники читать

Читать «всё» не получится. Выберите источники по принципу: что у вас стоит, то и читаем. Для типовой инфраструктуры с Linux, Windows и сетевым оборудованием набор такой.

Источник Что даёт Как получать
Каталог KEV (CISA) Уязвимости, которые уже используются в атаках: главный сигнал срочности Лента JSON, скрипт ниже; рассылка CISA
Банк данных угроз (БДУ) ФСТЭК России Российская база уязвимостей с оценками и рекомендациями, обязательна для операторов КИИ и ГИС Сайт bdu.fstec.ru, поиск по продукту; для регулярной проверки скрипт или RSS, если доступен
Бюллетени НКЦКИ Уведомления об уязвимостях и угрозах для организаций, взаимодействующих с ГосСОПКА Сайт cert.gov.ru, рассылка при подключении к ГосСОПКА
Бюллетени вашего дистрибутива Debian: DSA и трекер безопасности; Ubuntu: USN; RHEL, Rocky, Alma: errata; Astra Linux и РЕД ОС: бюллетени производителя Почтовые рассылки на общий ящик, а не на личный
Microsoft Ежемесячный Patch Tuesday (второй вторник месяца) и внеплановые выпуски Msrc, Update Guide, рассылка
Производители сетевого оборудования и VPN Бюллетени PSIRT: Cisco, Fortinet, Palo Alto и других, чьё оборудование стоит у вас Рассылки по продуктам
NVD и GitHub Advisory Database Подробности по CVE и уязвимости в библиотеках Поиск по продукту; для зависимостей — SCA в конвейере: SAST и SCA

Практическое правило: на каждый ваш ключевой продукт должен быть хотя бы один подписанный источник. Если у вас стоит nginx, PostgreSQL, OpenVPN, Fortinet и 1С, должны быть подписки на соответствующие рассылки или записи в списке для скрипта.

Список продуктов для наблюдения

Список вытекает из реестра активов: возьмите оттуда ключевые продукты и версии. С серверов Linux можно быстро собрать то, что установлено:

dpkg-query -W -f='${Package} ${Version}\n' | sort | head -n 20
rpm -qa --qf '%{NAME} %{VERSION}\n' | sort | head -n 20

Ожидаемо: список пакетов с версиями. Он длинный, поэтому для наблюдения выберите значимое: веб-серверы, базы данных, VPN, почта, гипервизоры, сетевые устройства, CMS, ключевые библиотеки. Результат в файл watchlist.txt, по строке на продукт или производителя:

# watchlist.txt
nginx
openssh
postgresql
openvpn
fortinet
cisco
vmware
wordpress

Файл обновляйте при каждом изменении набора систем: новое решение — новая строка. Это работа для владельца реестра активов, а не разовая акция.

Скрипт: что нового в KEV по вашим продуктам

Скрипт скачивает каталог KEV, выбирает записи, добавленные после последнего запуска, и показывает те, где производитель или продукт совпадают со списком. Если находка есть, код выхода 1: удобно запускать из cron и отправлять вывод на общую почту или в трекер.

#!/usr/bin/env python3
"""Новые записи каталога KEV (CISA) по списку продуктов.
Использование: kev_watch.py watchlist.txt state.txt
state.txt хранит дату последней обработанной записи. Перед первым запуском
создайте его с вчерашней датой в формате ГГГГ-ММ-ДД, иначе будет выведена вся история."""
import json
import pathlib
import sys
import urllib.request

URL = 'https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json'
watch = [l.strip().lower() for l in open(sys.argv[1], encoding='utf-8') if l.strip() and not l.startswith('#')]
state = pathlib.Path(sys.argv[2])
last = state.read_text().strip() if state.exists() else '1970-01-01'

with urllib.request.urlopen(URL, timeout=60) as r:
    data = json.load(r)

new = [v for v in data['vulnerabilities']
       if v['dateAdded'] > last and any(w in f"{v['vendorProject']} {v['product']}".lower() for w in watch)]
for v in sorted(new, key=lambda x: x['dateAdded']):
    print(f"{v['dateAdded']}  {v['cveID']}  {v['vendorProject']} {v['product']}")
    print(f"   {v['vulnerabilityName']}")
    print(f"   срок для федеральных агентств США: {v['dueDate']}; в атаках шифровальщиков: {v['knownRansomwareCampaignUse']}")
    print(f"   что сделать: {v['requiredAction']}")

state.write_text(max(v['dateAdded'] for v in data['vulnerabilities']))
sys.exit(1 if new else 0)

Ожидаемо: если по вашим продуктам ничего не добавили, вывода нет, код 0. Если есть совпадение, блок из четырёх строк на каждую запись. Каталог содержит и поля shortDescription с описанием: выведите его, если хотите больше контекста. Ограничения: скрипт ищет по подстроке в названии производителя и продукта, поэтому может давать лишнее (слово «cisco» и «ciscoworks»), а название вашего продукта в каталоге может быть записано иначе. Первые недели просматривайте результат и уточняйте список. Каталог — английский и покрывает не все российские продукты: российские дополняет БДУ.

Ежедневная проверка на пятнадцать минут

Мониторинг, который «делают, когда вспомнят», не работает. Закрепите его за конкретным человеком и временем. Практичная схема для небольшой команды:

  1. Дежурный по уязвимостям меняется еженедельно; в отпуск уходит с передачей.
  2. Каждое утро в одно и то же время он смотрит общий ящик с рассылками, вывод скрипта по KEV и страницу БДУ по ключевым продуктам. Это пятнадцать минут.
  3. По каждому пункту применяет схему решения (ниже) и делает запись в журнал.
  4. В понедельник коротко рассказывает команде, что было за неделю и что закрыто.

Что делать с новой публикацией об уязвимостиСхема решений плейбука: от сигнала по шагам и вопросам до закрытия инцидента; ответ «да» уходит вправо, «нет» идёт вниз.Новая запись в ленте или бюллетенеПродукт есть в реестре?совпадение с watchlistдаНет: записать и закрытьнетСервис доступен из интернета?реестр активов, схема сетидаДа: срочная заявка,приоритет вышенетЕсть исправление или обход?бюллетень вендорадаНет: компенсирующаямера, срок пересмотранетСоздать запись в реестре и заявкувладельцус ссылкой на источникЗапись создана, источник сохранён
Источник нужно сохранить в записи: по нему потом доказывают, откуда узнали.

Вопросы схемы построены так, чтобы отсекать шум как можно раньше: сначала «есть ли у нас этот продукт», затем «доступен ли он снаружи», затем «есть ли исправление». На последнем шаге в любом случае появляется запись и ссылка на источник.

Журнал мониторинга

Журнал — это доказательство, что мониторинг идёт. Достаточно таблицы:

Дата Источник Запись Относится к нам Действие
05.11 KEV CVE по VPN-шлюзу производителя Х Да, периметр P1, заявка № 214, срок 08.11
05.11 Рассылка Debian DSA по пакету openssl Да, внутренние узлы P3, плановое обновление
06.11 БДУ Запись по продукту, которого у нас нет Нет Без действий

Записи «нас не касается» тоже нужны: они показывают, что источник читали, и сокращают повторное изучение.

Связь с остальным процессом

  • Каждое «касается» превращается в запись реестра уязвимостей и заявку, источник сохраняется в карточке. Позже вы покажете: уязвимость устранена, и вот откуда мы о ней узнали.
  • Если сообщение про периметр и есть признаки эксплуатации, включите плейбук критичной уязвимости. Окно между публикацией и атаками сейчас измеряется часами: разбор о сутках на патч.
  • Порядок обработки сообщений из открытых источников закрепите в регламенте: кто дежурит, где журнал, какие сроки.

Какие артефакты хранить

Что хранить Что показывает
Список источников и подписок с адресом общего ящика Мониторинг организован по продуктам
Журнал мониторинга за последние месяцы Источники читаются регулярно, а не разово
Три записи реестра с указанием источника и результатом устранения Устранение связано с источником
Раздел регламента о порядке обработки сообщений Порядок утверждён и известен дежурным

Диагностика

Симптом Причина и что делать
В ящике сотни писем, никто не читает Подписок слишком много. Оставьте только продукты из списка и настройте фильтр по ключевым словам
Скрипт молчит неделями Либо повезло, либо список слишком узкий. Проверьте на старой дате: вручную поставьте дату в state.txt на месяц назад и посмотрите вывод
Об уязвимости узнали от клиента Продукта нет в списке. Добавьте его и сверьте список с реестром активов
Дежурный пропустил день Нет замены. Закрепите пару: основной и резервный, и напоминание в календаре

Где это в модели зрелости

Материал относится к направлению «Управление уязвимостями» (хаб: уязвимости, карта: карта зрелости). Это одно из требований первого уровня: информация об уязвимостях из открытых источников анализируется и устраняется в сроки внутреннего регламента. Дальше эти данные подкрепляются платформой анализа угроз: Wazuh и обогащение KEV.

Как проверить

  1. Для пяти ключевых продуктов найдите подписку или строку в списке наблюдения.
  2. Журнал мониторинга содержит записи за каждую рабочую неделю последнего месяца.
  3. Для последней записи «касается нас» есть заявка с источником и срок.
  4. Скрипт на тестовой дате в state.txt выводит ожидаемые записи, а при актуальной дате молчит.

Источники

  • CISA, каталог известных эксплуатируемых уязвимостей: cisa.gov.
  • Банк данных угроз безопасности информации ФСТЭК России: bdu.fstec.ru.
  • НКЦКИ: cert.gov.ru.
  • NVD, National Vulnerability Database: nvd.nist.gov.
  • CIS Control 7: cisecurity.org/controls.

Комментарии закрыты.