
Docker-лаборатория, воспроизводящая CVE-2026-42533 — pre-auth переполнение кучи в nginx и утечку информации через двухпроходное перезаписывание захвата, с PoC-скриптами и сравнением с исправленной версией.
CVSS 9.2 (критический) — переполнение буфера в куче до аутентификации + утечка информации в nginx Затронуто: nginx 0.9.6 – 1.30.3 / 1.31.2 | Исправлено: 1.30.4 / 1.31.3
┌─────────────────────────────────────┐
│ Хост-машина │
│ │
PoC-скрипты ──────┤ :8080 ──► nginx-vuln (1.26.x) │
│ │ УЯЗВИМ │
│ ▼ │
│ backend (Python echo) │
│ ▲ │
│ │ │
│ :8081 ──► nginx-patched (1.30.4) │
│ БЕЗОПАСНО │
└─────────────────────────────────────┘
# Build and start
docker compose up --build -d
# Verify
curl http://localhost:8080/health
curl http://localhost:8081/health
# Run PoC
python3 poc_overflow.py # Heap overflow (crash worker)
python3 poc_infoleak.py # Info leak (heap residue)
bash poc_curl.sh # Quick curl-based tests
# Compare with patched
python3 poc_overflow.py localhost 8081
python3 poc_infoleak.py localhost 8081
# Check for crashes
docker logs nginx-vuln 2>&1 | grep -iE 'signal|segfault|abort'
# Cleanup
docker compose down
nginx вычисляет значения директив (proxy_set_header, return, add_header и т. д.)
в два прохода, используя общий изменяемый массив r->captures:
| Проход | Назначение | Читает r->captures |
|---|---|---|
| LEN | Измеряет необходимый размер буфера | Да — чтобы получить длину $1 |
(здесь вычисляется regex map, ПЕРЕЗАПИСЫВАЯ r->captures) | ||
| VALUE | Записывает данные в выделенный буфер | Да — но теперь $1 указывает в другое место |
map $http_user_agent $is_bot {
~*(bot|crawl|spider) 1; # ← regex map = clobber trigger
default 0;
}
location ~ "^/api/v1/(.+)$" { # ← regex capture source
proxy_set_header X-Route "$1 — $is_bot"; # ← two-pass sink
# ^^ ^^^^^^^
# capture ref + map var in same buffer = BUG
}
| Направление | Размер URI | Размер входных данных map | Результат |
|---|---|---|---|
| Переполнение | Короткий (3 Б) | Длинный (4096 Б) | LEN выделяет мало, VALUE записывает много → переполнение кучи |
| Утечка информации | Длинный (8000 Б) | Короткий (5 Б) | LEN выделяет много, VALUE записывает мало → остаточные данные кучи в ответе |
| Эндпоинт | Сток | Триггер map | Демонстрация |
|---|---|---|---|
/api/v1/{path} | proxy_set_header | $is_bot (User-Agent) | Переполнение |
/leak/{path} | return + add_header | $ref_domain (Referer) | Утечка информации |
/rce/{path} | set + return | $is_bot (User-Agent) | Переполнение |
/safe/{path} | return (без map) | Нет | Контроль (безопасно) |
| Файл | Назначение |
|---|---|
docker-compose.yml | Оркестрация лаборатории |
Dockerfile.nginx-vuln | Уязвимый nginx 1.26.x |
Dockerfile.nginx-patched | Исправленный nginx 1.30.4 |
nginx-vuln.conf | Уязвимая конфигурация с аннотированными шаблонами |
backend.py | Echo-сервер для проверки проксируемых заголовков |
poc_overflow.py | PoC переполнения кучи (с нарастающими размерами полезной нагрузки) |
poc_infoleak.py | PoC утечки информации (обнаружение остаточных данных кучи) |
poc_curl.sh | Быстрые тесты на основе curl |
Используйте сканер конфигураций:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
~ / ~* в map, когда захваты используются в других местахТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ И АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ БЕЗОПАСНОСТИ.