
Контролируемая лаборатория инъекции HTTP/2-фреймов NGINX для валидации патча CVE-2026-42926 и исследований в области защиты.
Контролируемая лаборатория по кибербезопасности для валидации и сравнения поведения, связанного с CVE-2026-42926 — проблемой внедрения (инъекции) HTTP/2-фреймов, затрагивающей определённые версии NGINX при использовании уязвимой конфигурации прокси.
Этот репозиторий предназначен только для оборонительных исследований, проверки исправлений, аудита конфигурации и контролируемого лабораторного воспроизведения.
Классификация: Внедрение HTTP/2-фреймов Затронутые версии: NGINX
1.29.4–1.30.0Исправленные версии: NGINX1.30.1+/1.31.0+
Используйте этот проект только в изолированной лабораторной среде, которая вам принадлежит или на тестирование которой у вас есть явное разрешение.
Не запускайте его против сторонних систем, публичной инфраструктуры, общих сред или производственных сервисов без письменного разрешения.
Рекомендуемая изоляция:
Лаборатория проверяет, соответствуют ли целевой бинарный файл NGINX и конфигурация условиям, необходимым для воспроизведения проблемы, отправляет специально сформированный запрос на тестовый location и анализирует контролируемый логгер upstream на предмет признаков того, что внедрённые байты, похожие на HTTP/2-фреймы, достигли upstream-стороны.
Обычная схема валидации:
Ожидаемый результат:
bashpython3phpДля контейнеризированного рабочего процесса:
Пример конфигурации слушает порт 80, что обычно требует привилегий root.
Для непривилегированной локальной лаборатории измените listen 80; в nginx_vulnerable.conf на доступный высокий порт, например 8080, и используйте соответствующий целевой URL в команде PHP.
Сделайте скрипты исполняемыми:
chmod +x nginx_config_verify.sh run_lab_comparison.sh
Убедитесь, что PHP поддерживает cURL:
php -m | grep -i curl
Проверьте, что каждый бинарный файл NGINX может вывести свою версию:
/path/to/nginx -V
Предоставленный файл nginx_vulnerable.conf содержит необходимый тестовый шаблон:
location /exploit {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 2;
proxy_set_body $request_body;
proxy_set_header Host $host;
proxy_set_header Content-Length $content_length;
}
Важные детали:
proxy_http_version 2 включает проксирование HTTP/2 к логгеру upstream.proxy_set_body $request_body использует тело запроса, контролируемое клиентом.client_max_body_size 20m позволяет передавать сформированное тело запроса размером 16 МиБ, используемое скриптом валидации.127.0.0.1:8081.Docker-специфичная конфигурация в docker/nginx_vulnerable.docker.conf сохраняет тот же уязвимый шаблон прокси, но слушает на контейнерном порту 8080 и проксирует к имени сервиса Compose upstream:8081.
Dockerfile собирает NGINX 1.29.4 из исходников и устанавливает инструментарий PHP/Python, необходимый для лаборатории. Затем Compose запускает три сервиса из одного образа:
upstream: логгер сырых HTTP/2-фреймовnginx: уязвимый NGINX 1.29.4, использующий docker/nginx_vulnerable.docker.confrunner: одноразовая команда валидации PHPСоберите образ лаборатории:
docker compose build
Запустите логгер upstream и уязвимый NGINX:
docker compose up -d upstream nginx
Проверьте встроенную версию NGINX:
docker compose exec nginx nginx -V
Запустите скрипт валидации внутри сети Compose:
docker compose --profile run run --rm runner
Runner использует следующие аргументы внутри контейнера:
php /lab/cve_2026_42926_lab.php \
http://nginx:8080/exploit \
/lab/upstream_logs \
/lab/nginx_config_verify.sh \
/usr/local/nginx/sbin/nginx \
/lab/docker/nginx_vulnerable.docker.conf \
/exploit
Сгенерированные логи upstream записываются в директорию хоста:
./upstream_logs/
Сервис NGINX также доступен с хоста по адресу:
http://localhost:8080/version
Остановите и удалите контейнеры лаборатории:
docker compose down
Запустите контролируемый логгер upstream:
python3 upstream_frame_logger.py 8081 ./upstream_logs
В другом терминале запустите NGINX с примером конфигурации:
/path/to/nginx -c "$PWD/nginx_vulnerable.conf"
Запустите скрипт валидации:
php cve_2026_42926_lab.php \
http://localhost/exploit \
./upstream_logs \
./nginx_config_verify.sh \
/path/to/nginx \
"$PWD/nginx_vulnerable.conf" \
/exploit
Остановите NGINX после запуска:
/path/to/nginx -s stop
Если вы изменили порт прослушивания NGINX, обновите первый аргумент. Например:
php cve_2026_42926_lab.php http://localhost:8080/exploit ./upstream_logs ./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
Задайте пути к двум бинарным файлам NGINX и запустите сборочный скрипт сравнения:
VULNERABLE_NGINX=/usr/local/nginx_1.29.4/sbin/nginx \
PATCHED_NGINX=/usr/local/nginx_1.30.1/sbin/nginx \
bash run_lab_comparison.sh
Опциональные переопределения конфигурации:
VULNERABLE_NGINX=/path/to/vulnerable/nginx \
PATCHED_NGINX=/path/to/patched/nginx \
VULNERABLE_CONFIG="$PWD/nginx_vulnerable.conf" \
PATCHED_CONFIG="$PWD/nginx_vulnerable.conf" \
bash run_lab_comparison.sh
Скрипт сравнения записывает:
vulnerable_result.txtpatched_result.txtupstream_logs_vulnerable/upstream_logs_patched/Используйте nginx_config_verify.sh напрямую, когда нужно просто проверить, содержит ли конфигурация уязвимый шаблон:
./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
Вспомогательный скрипт проверяет:
proxy_http_version 2proxy_set_body с переменнойclient_max_body_size не менее 16 МиБcve_2026_42926_lab.php принимает позиционные аргументы:
php cve_2026_42926_lab.php <target_url> <upstream_log_dir> <config_script> <nginx_binary> <nginx_config> <location> [version_url]
Значения по умолчанию:
cve_2026_42926_lab.php возвращает один из трёх вердиктов:
Положительное свидетельство требует, чтобы скрипт сопоставил метку запуска, наблюдаемый заголовок фрейма upstream, флаг внедрённого фрейма и затронутую версию NGINX.
Логгер upstream записывает JSON-файлы с именами вида:
frames_<timestamp>.json
Каждый лог содержит разобранные метаданные HTTP/2-фрейма, выдержки из полезной нагрузки, смещения байтов, флаги обнаружения внедрения и поля корреляции запуска.
Сборочный скрипт сравнения сохраняет отдельные директории логов для уязвимых и исправленных запусков, чтобы свидетельства из двух выполнений не смешивались.
Если PHP-скрипт сообщает, что вспомогательный скрипт конфигурации не является исполняемым, выполните:
chmod +x nginx_config_verify.sh
Если запрос возвращает 413 Request Entity Too Large, увеличьте client_max_body_size как минимум до 16m; в примере конфигурации используется 20m.
Если логи upstream не создаются, проверьте, что:
upstream_frame_logger.py запущен.127.0.0.1:8081./exploit.Если NGINX не может привязаться к порту 80, либо запустите его с соответствующими привилегиями в лабораторной среде, либо измените конфигурацию на высокий порт, например 8080.
Если результат сравнения неопределён, проверьте vulnerable_result.txt, patched_result.txt и соответствующие директории логов upstream на предмет невыполненного предусловия.
Этот проект лицензирован по MIT-лицензии. Подробности см. в LICENSE.
| Файл | Описание |
|---|
README.md | Документация проекта. |
LICENSE | Лицензия MIT. |
Dockerfile | Создаёт самодостаточный образ лаборатории с NGINX 1.29.4, PHP CLI/cURL, Python и скриптами проекта. |
docker-compose.yml | Запускает уязвимый сервис NGINX, логгер upstream-фреймов и опциональный валидационный runner. |
cve_2026_42926_lab.php | Основной скрипт валидации лаборатории. Проверяет предусловия версии/конфигурации, отправляет специально сформированный запрос, анализирует логи upstream и выносит вердикт. |
nginx_vulnerable.conf | Пример конфигурации NGINX, содержащий уязвимый шаблон проксирования, используемый для сравнения уязвимой и исправленной версий. |
docker/nginx_vulnerable.docker.conf | Docker-специфичная конфигурация NGINX, использующая тот же уязвимый шаблон и обнаружение сервисов Compose. |
nginx_config_verify.sh | Вспомогательный скрипт, проверяющий, содержит ли целевая конфигурация NGINX требуемый уязвимый шаблон прокси. |
upstream_frame_logger.py | Контролируемый логгер сырых HTTP/2-фреймов upstream, используемый для захвата и анализа фреймов, полученных от NGINX. |
run_lab_comparison.sh | Оркестрирует сравнительные запуски уязвимой и исправленной версий. |
.dockerignore | Исключает сгенерированные логи и метаданные IDE из контекста сборки Docker. |
| Аргумент | Значение по умолчанию |
|---|
target_url | http://localhost/exploit |
upstream_log_dir | ./upstream_logs |
config_script | ./nginx_config_verify.sh |
nginx_binary | nginx |
nginx_config | /etc/nginx/nginx.conf |
location | /exploit |
version_url | http://localhost/version |
| Вердикт | Значение | Код выхода |
|---|
positive | Обнаружены признаки внедрения фреймов, и они коррелированы с запуском. | 0 |
negative | Предусловия выполнены, признаков внедрения не обнаружено. | 1 |
inconclusive | Не выполнены одно или несколько предусловий или проверок свидетельств. | 2 |