
Аудит CVE веб-серверов nginx и Apache с учетом триггеров. Выходит за рамки сопоставления версий, проверяя, действительно ли уязвимый путь кода достижим в вашей конфигурации. Классифицирует находки как Active / Latent / Unverified. Однофайловый Python 3.5+, без зависимостей.
Не спрашивай, уязвим ли ты. Спроси, эксплуатируем ли ты.
Однофайловый Python-инструмент, который проверяет nginx и Apache на известные CVE, одновременно анализируя как установленную версию, так и то, достижим ли уязвимый код через вашу конфигурацию.
Большинство CVE-сканеров останавливаются на сопоставлении версий: "nginx 1.18.0 — CVE-2026-42945, ВЫСОКИЙ уровень, вы уязвимы." Однако для многих CVE требуется определённый шаблон конфигурации, чтобы быть эксплуатируемыми. Сканер, игнорирующий конфигурацию, заваливает вас красными предупреждениями, которые не отражают реальный риск — и, что хуже, может скрывать скрытые риски, которые станут реальными, если ваша конфигурация завтра изменится.
web_server_audit отвечает на два отдельных вопроса по каждой CVE:
Комбинация этих вопросов даёт три честные классификации:
| Классификация | Значение |
|---|
| 🔴 Риск активной эксплуатации | Уязвимая версия и триггер присутствует. Эксплуатируемо сегодня. |
| 🟡 Скрытый риск | Уязвимая версия, триггер отсутствует. Становится эксплуатируемым, если изменение конфигурации введёт шаблон. |
| ⚪ Не проверено | Конфигурация нечитаема; статус неизвестен. |
git clone https://github.com/YOUR_USERNAME/web-server-audit.git
cd web-server-audit
sudo python3 web_server_audit.py
| CVE | Уровень опасности | Триггерный шаблон |
|---|---|---|
| CVE-2026-42945 (Rift) | ВЫСОКИЙ | rewrite + безымянная группа захвата ($1,$2) + ? в замене |
| CVE-2026-42946 | СРЕДНИЙ | Используется scgi_pass или uwsgi_pass |
| CVE-2026-40701 | СРЕДНИЙ | ssl_stapling on + resolver вместе |
| CVE-2026-42934 | НИЗКИЙ | Директивы charset/charset_types/source_charset |
Список CVE для Apache в настоящее время пуст, но структура готова — см. Расширение ниже.
Помимо CVE, инструмент также сообщает:
/proc/sys/kernel/randomize_va_space) — полный ASLR существенно снижает эксплуатацию RCE через ошибки памятиesm-infra и esm-appsnginx, apache2, systemctl, ss, journalctl, когда они доступны; в противном случае проверки пропускаются корректно# Компактный отчёт (по умолчанию — скрывает строки OK)
sudo python3 web_server_audit.py
# Все результаты, включая строки OK
sudo python3 web_server_audit.py --verbose
# Без ANSI-цветов (хорошо для конвейеров, журналов, вывода CI)
sudo python3 web_server_audit.py --no-color
# Машиночитаемый JSON
sudo python3 web_server_audit.py --json
| Код | Значение |
|---|---|
| 0 | Нет проблем |
| 1 | Только предупреждения или некритические CVE-находки |
| 2 | Как минимум одна CVE активно эксплуатируема |
Код возврата 2 — естественный сигнал сбоя в CI/CD.
========================================================================
Web Server Audit - 2026-05-16T01:24:55
Host: web-prod-01
web_server_audit.py v1.0.0 - SiberSAN - MIT License
========================================================================
[system]
------------------------------------------------------------------------
[OK] OK ASLR полностью включён (randomize_va_space=2)
[i] INFO ОС: Ubuntu 18.04.6 LTS
[!] WARN Ubuntu 18.04 находится в режиме только ESM
[nginx] версия 1.18.0 (активен)
------------------------------------------------------------------------
[i] INFO nginx прослушивает: 0.0.0.0:80, 0.0.0.0:443
[i] INFO CVE-2026-42945 (ВЫСОКИЙ): версия уязвима, но НЕ активирована
Триггер: rewrite + безымянная группа захвата ($1,$2) + '?' в замене
Доказательство: Директивы rewrite отсутствуют в конфигурации
[i] INFO CVE-2026-42946 (СРЕДНИЙ): версия уязвима, но НЕ активирована
[!] WARN nginx установлен из PPA (1.18.0-3ubuntu1+bionic1)
========================================================================
Сводка по реальному риску
------------------------------------------------------------------------
РИСК АКТИВНОЙ ЭКСПЛУАТАЦИИ: не обнаружено.
СКРЫТЫЙ РИСК — уязвимая версия, триггер в конфигурации отсутствует (3):
- [nginx] CVE-2026-42945 (ВЫСОКИЙ)
- [nginx] CVE-2026-42946 (СРЕДНИЙ)
- [nginx] CVE-2026-42934 (НИЗКИЙ)
Становятся эксплуатируемыми, если изменение конфигурации введёт триггер.
Смягчение: дисциплина изменений конфигурации + планирование обновления.
========================================================================
Результаты: 0 критических, 2 предупреждения
========================================================================
Добавление новой CVE состоит из двух шагов.
1. Напишите функцию-триггер, которая принимает полный текст конфигурации (вывод nginx -T) и возвращает (triggered: bool, evidence: str):
def _trigger_my_cve(conf):
hits = [l for l in conf.splitlines() if re.search(r'risky_directive', l)]
if hits:
return True, "Найдено: " + hits[0]
return False, "Шаблон не найден"
2. Добавьте запись в NGINX_CVES (или APACHE_CVES):
{
"id": "CVE-XXXX-NNNNN",
"name": "Описательное название",
"severity": "HIGH",
"affected": ("1.10.0", "1.25.0"),
"fixed_in": ["1.25.1"],
"trigger_desc": "Понятное человеку описание триггера",
"trigger_fn": _trigger_my_cve,
},
Всё. Фреймворк автоматически обрабатывает классификацию, форматирование вывода, JSON, коды возврата и сводку.
--verbose для просмотра деталей, если сомневаетесь.Приветствуются pull request'ы, issue'ы, новые детекторы CVE и поддержка других веб-серверов (lighttpd, Caddy, HAProxy и т.д.).
При предложении нового детектора CVE, пожалуйста, включите:
Выпущено под лицензией MIT.
Copyright (c) 2026 SiberSAN