До этого урока мы закрывали конкретные дыры: шифровали ФС, настраивали SELinux, фильтровали пакеты. Теперь подымаемся на уровень выше и учимся думать как защищающаяся сторона в целом: какие бывают классы уязвимостей, как мир их нумерует (CVE) и оценивает по серьёзности (CVSS), откуда приходит беда через чужой код (цепочка поставок) и как не утонуть в потоке заплаток. Задача администратора тут - не закрыть всё подряд (это невозможно), а правильно расставить приоритеты: чинить сначала то, что реально опасно именно для твоей системы.

Как это работает
Уязвимость - это дефект, который позволяет нарушить конфиденциальность, целостность или доступность. Классы повторяются из года в год, и проект OWASP их каталогизирует (Top 10 для веба, ASVS как чеклист). Инъекции (SQL, команды ОС, LDAP) возникают, когда непроверенные данные пользователя попадают в интерпретатор как часть кода - лечится параметризацией и валидацией, а не фильтрацией кавычек. Переполнение буфера - классика для C/C++: запись за границу массива затирает соседнюю память вплоть до адреса возврата, отсюда выполнение чужого кода. Современные митигации (ASLR, стек-канарейки, NX-бит, FORTIFY_SOURCE, CFI) усложняют эксплуатацию, но не убирают баг. Неправильная конфигурация - самый массовый класс в 2026: открытый наружу сервис, дефолтный пароль, лишний модуль, директория с листингом. Тут уязвим не код, а руки.
Чтобы говорить об одной дыре одинаково, ей дают идентификатор CVE - запись в общемировом каталоге вида CVE-2025-12345 (год плюс номер). CVE присваивают организации-CNA (вендоры, MITRE, CERT), а обогащают описанием и оценкой базы NVD и аналоги. Серьёзность считают по CVSS. Актуальная версия - CVSS 4.0 (вышла в конце 2023, в 2026 это основной стандарт, рядом ещё встречается 3.1). CVSS даёт число от 0.0 до 10.0 и вектор из метрик: группа Base (врождённые свойства: вектор атаки, сложность, нужные привилегии, влияние на CIA), плюс группы Threat, Environmental и Supplemental - последние позволяют пересчитать балл под твою среду.
Ключевая мысль урока: голый CVSS Base - это не приоритет, а только потенциал. Дыра с баллом 9.8 в пакете, который у тебя не установлен или закрыт фаерволом, опаснее на бумаге, чем семёрка в сервисе, торчащем в интернет под нагрузкой. Поэтому к CVSS добавляют контекст: есть ли публичный эксплойт (метрики Threat, базы вроде KEV - известных эксплуатируемых уязвимостей), и принимают решение по модели SSVC - дерево, которое отвечает не числом, а действием: чинить сейчас, по плану или игнорировать. NVD как раз с июня 2026 публикует SSVC рядом с CVSS.
Отдельный пласт - угрозы цепочки поставок. Ты ставишь не только то, что написал сам: это apt и dnf пакеты, контейнерные образы, npm/pip/composer зависимости, обновления вендоров. Если злоумышленник подменит зависимость или прошьёт бэкдор в обновление (история xz/liblzma 2024 года - учебный пример), скомпрометированным окажешься ты, хотя свой код был чист. Защита - проверка подписей пакетов, фиксация версий и хешей (lock-файлы), SBOM (опись состава ПО) и сканеры зависимостей.
Патч-менеджмент превращает всё это в процесс: инвентаризация, отслеживание CVE по своему софту, тест заплатки, выкатка, проверка. Моделирование угроз (например STRIDE) на этапе проектирования помогает увидеть, кто и как может атаковать, ещё до релиза. А приоритизация рисков (риск = вероятность на ущерб) определяет, что в очереди первое.
Команды и примеры
Что из установленного имеет известные уязвимости. Debian/Ubuntu:
Код: Выделить всё
# индекс уязвимостей Debian-пакетов
apt install debsecan
debsecan --suite trixie --format detail
# что подлежит обновлению вообще
apt list --upgradable
Код: Выделить всё
dnf updateinfo list security # доступные security-обновления
dnf updateinfo info CVE-2025-12345 # детали по конкретной CVE
dnf upgrade --security # накатить только security-фиксы
dnf upgrade --cve=CVE-2025-12345 # закрыть конкретную дыру
Код: Выделить всё
# RHEL/Fedora: ключи и подпись rpm
rpm -qa gpg-pubkey
rpm --checksig paket.rpm
# Debian/Ubuntu: репозитории подписаны, ключи в keyring
apt-key list 2>/dev/null; ls /etc/apt/keyrings/ /usr/share/keyrings/
Код: Выделить всё
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
# AV:N - атака по сети (хуже всего)
# AC:L - низкая сложность
# PR:N - привилегии не нужны
# UI:N - участие жертвы не нужно
# VC/VI/VA:H - высокое влияние на конфид./целостность/доступность
Код: Выделить всё
# OpenVAS/Greenbone - сетевой сканер уязвимостей
gvm-cli ... # запуск задачи сканирования по целям
# Trivy - дыры в образах, ФС и зависимостях (работает с docker и podman)
trivy image registry.example/app:1.4
trivy fs --scanners vuln,misconfig ./project
- Чинят по баллу CVSS Base, игнорируя контекст. Балл 9.8 в неустановленном или недоступном снаружи компоненте не должен опережать семёрку в боевом сервисе. Смотри эксплуатируемость (KEV) и SSVC.
- Путают CVSS 3.1 и 4.0: в 4.0 другой набор метрик (появились AT, разделены влияние на систему и на нижестоящие), баллы между версиями напрямую не сравнимы.
- Думают, что фильтрация спецсимволов спасает от инъекций. Спасает параметризация запросов и разделение кода и данных, а блок-листы обходятся.
- Накатывают апдейты без теста и окна отката - сломанная зависимость кладёт прод не хуже атаки. Заплатка тоже из цепочки поставок и тоже бывает с дефектом.
- Сканируют, но не закрывают петлю: отчёт OpenVAS/Trivy без процесса устранения и повторной проверки - это бумага, а не безопасность.
- Забывают про транзитивные зависимости: уязвимость часто не в твоём npm/pip-пакете, а в том, что он тянет глубже. Без SBOM и lock-файлов этого не видно.
- На своём стенде определи дистрибутив и собери список доступных security-обновлений: dnf updateinfo list security (RHEL/Fedora) или debsecan/apt list --upgradable (Debian/Ubuntu).
- Выбери одну CVE из вывода и прочитай её карточку: dnf updateinfo info CVE-... либо найди запись на NVD. Запиши вектор CVSS и базовый балл.
- Разбери вектор по метрикам Base: откуда идёт атака, нужны ли привилегии и участие пользователя. Прикинь, эксплуатируема ли она в твоей конфигурации.
- Прими решение в стиле SSVC: чинить сейчас, по плану или отложить - и обоснуй контекстом (доступность сервиса, наличие эксплойта).
- Установи Trivy и просканируй любой контейнерный образ: trivy image alpine:latest. Найди в отчёте уязвимость в транзитивной зависимости.
- Проверь целостность цепочки: rpm --checksig на пакете или просмотр ключей в /etc/apt/keyrings. Убедись, что репозитории подписаны.
- Закрой петлю: накати security-фикс (dnf upgrade --security или apt) и повтори шаг 1, убедившись, что выбранная CVE ушла из списка.
- Чем инъекция принципиально отличается от переполнения буфера по механизму и по способу защиты?
- Что обозначают и кто присваивает идентификатор CVE, и чем NVD отличается от CNA?
- Какие группы метрик есть в CVSS 4.0 и почему Base-балл сам по себе не является приоритетом починки?
- Что такое атака на цепочку поставок и какими средствами (SBOM, подписи, lock-файлы) её риск снижают?
- Чем подход SSVC отличается от ранжирования строго по числу CVSS?
- Какие шаги входят в полный цикл патч-менеджмента и зачем нужно окно отката?