
Laboratorio Docker que reproduce CVE-2026-42533, un desbordamiento de heap e info leak pre-auth en nginx mediante clobbering de captura en dos pasadas, con scripts PoC y comparación parcheada.
CVSS 9.2 (Crítico) — Desbordamiento de búfer en el heap pre-autenticación + fuga de información en nginx Afectados: nginx 0.9.6 – 1.30.3 / 1.31.2 | Parcheados: 1.30.4 / 1.31.3
┌─────────────────────────────────────┐
│ Máquina anfitriona │
│ │
Scripts PoC ──────┤ :8080 ──► nginx-vuln (1.26.x) │
│ │ VULNERABLE │
│ ▼ │
│ backend (Python echo) │
│ ▲ │
│ │ │
│ :8081 ──► nginx-patched (1.30.4) │
│ SEGURO │
└─────────────────────────────────────┘
# 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 evalúa los valores de las directivas (proxy_set_header, return, add_header, etc.)
en dos pasadas utilizando un array mutable compartido r->captures:
| Pasada | Propósito | Lee r->captures |
|---|---|---|
| LEN | Medir el tamaño de búfer necesario | Sí — para obtener la longitud de $1 |
(el mapa regex se evalúa aquí, CLOBBEREANDO r->captures) | ||
| VALUE | Escribir datos en el búfer asignado | Sí — pero ahora $1 apunta a otro lugar |
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
}
| Dirección | Tamaño de URI | Tamaño de entrada del mapa | Resultado |
|---|---|---|---|
| Desbordamiento | Corto (3 B) | Largo (4096 B) | LEN asigna poco, VALUE escribe mucho → desbordamiento de heap |
| Fuga de Información | Largo (8000 B) | Corto (5 B) | LEN asigna mucho, VALUE escribe poco → residuo de heap en la respuesta |
| Endpoint | Sink | Disparador del Mapa | Demo |
|---|---|---|---|
/api/v1/{path} | proxy_set_header | $is_bot (User-Agent) | Desbordamiento |
/leak/{path} | return + add_header | $ref_domain (Referer) | Fuga de información |
/rce/{path} | set + return | $is_bot (User-Agent) | Desbordamiento |
/safe/{path} | return (sin mapa) | Ninguno | Control (seguro) |
| Archivo | Propósito |
|---|---|
docker-compose.yml | Orquestación del laboratorio |
Dockerfile.nginx-vuln | nginx 1.26.x vulnerable |
Dockerfile.nginx-patched | nginx 1.30.4 parcheado |
nginx-vuln.conf | Configuración vulnerable con patrones anotados |
backend.py | Servidor echo para inspeccionar cabeceras proxeadas |
poc_overflow.py | PoC de desbordamiento de heap (tamaños de payload escalados) |
poc_infoleak.py | PoC de fuga de información (detección de residuo de heap) |
poc_curl.sh | Pruebas rápidas basadas en curl |
Utilice el escáner de configuración:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
~ / ~* en map cuando se utilizan capturas en otros lugaresSOLO PARA PRUEBAS DE SEGURIDAD EDUCATIVAS Y AUTORIZADAS.