
Контролируемая лаборатория инъекции 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-стороны.
Обычная схема валидации:
Ожидаемый результат:
| Файл | Описание |
|---|---|
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. |
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 напрямую, когда нужно просто проверить, содержит ли конфигурация уязвимый шаблон: