CVE-2026-42945: el fallo de Nginx oculto durante 18 años

🚨 CVE-2026-42945: la vulnerabilidad crítica de Nginx oculta durante 18 años, con su principio, PoC y solución
El 13 de mayo de 2026, la firma de investigación de seguridaddepthfirst, junto con F5, reveló la vulnerabilidad más grave de la historia de NGINX:CVE-2026-42945:
- Puntuación CVSS v4.0 de 9.2: se considera una vulnerabilidad crítica
- Desbordamiento de búfer en el heap: puede provocar ejecución remota de código (RCE)
- Oculta durante 18 años: el código entró en el repositorio en 2008
- Afecta a 9,75 millones de sitios en el mundo: más de 2,54 millones de sitios web en China afectados
- PoC público: QI-ANXIN ya lo ha replicado con éxito
Se trata deuna vulnerabilidad histórica del módulo central de NGINX: basta con que el atacante envíe una única petición HTTP maliciosa para tomar el control remoto del servidor.
🔍 Panorama de la vulnerabilidad
Datos básicos
| Propiedad | Detalle |
|---|---|
| Identificador | CVE-2026-42945 |
| Puntuación CVSS | v4.0: 9.2 | v3.1: 8.1 |
| Tipo de vulnerabilidad | Desbordamiento de búfer en el heap (Heap-based Buffer Overflow) |
| Tipo de amenaza | Ejecución remota de código (RCE) y denegación de servicio (DoS) |
| Condiciones de explotación | Sin autenticación; basta con una petición HTTP preparada |
| Componente afectado | ngx_http_rewrite_module (módulo integrado del núcleo de NGINX) |
| Descubridor | depthfirst (su sistema automatizado lo descubrió en 6 horas) |
Alcance del impacto
- 9,75 millones de sitios en el mundoafectados
- 2,54 millones de sitios en Chinaafectados
- NGINX sirve aproximadamente un tercio de los sitios web del mundo, el impacto es enorme
- El código entró en2008 y llevaba oculto18 años
⚠️ Condiciones de activación
Las tres condiciones deben cumplirse a la vez
La vulnerabilidad requiereuna combinación específica de condiciones de configuración:
| Condición | Descripción | Ejemplo |
|---|---|---|
| 1. Capturas PCRE sin nombre | La directiva rewrite usa grupos de captura sin nombre | $1, $2, $3… |
| 2. Cadena de reemplazo con interrogante | La cadena de reemplazo contiene el carácter ? | /profile.php?id=$1&tab=$2 |
| 3. Seguida de rewrite/if/set | La directiva rewrite va seguida de otras directivas | rewrite … last; if (…) { … } |
Ejemplo vulnerable
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
Esa configuración cumple las tres condiciones:capturas sin nombre $1/$2,cadena de reemplazo con ?,seguida de la directiva if.
🔬 Principio de la vulnerabilidad
Inconsistencia de estado entre dos fases
El motor de scripts de NGINXusa un procesamiento en dos fases:
- Primera fase: calcula el tamaño de búfer necesario
- Segunda fase: copia los datos al búfer
El núcleo del fallo está enla gestión incorrecta del indicador is_args:
| Fase | Estado de is_args | Lógica | Resultado |
|---|---|---|---|
| Cálculo de longitud | is_args = 0 | devuelve la longitud original de la captura | Subestima el tamaño del búfer |
| Copia de datos | is_args = 1 | llama a ngx_escape_uri y cada byte se expande a 3 bytes | Desbordamiento del búfer del heap |
Flujo detallado
- La directiva rewritecontiene capturas sin nombre $1/$2
- La cadena de reemplazocontiene ? y activa is_args = 1
- Fase de cálculo de longitud: usa un submotor recién inicializado con is_args = 0
- Devuelve la longitud original: asigna un búfer del heap demasiado pequeño
- Fase de copia de datos: usa el motor principal con is_args = 1
- Llama a ngx_escape_uri: expande los bytes y desborda el búfer
- Los datos del URI controlados por el atacantese escriben en la zona desbordada
Método de explotación
Heap Feng Shui entre peticiones:
- Cuerpo de la petición POST: rociar la memoria del heap (el URI no puede contener bytes nulos)
- Datos del desbordamiento: corrompen el puntero cleanup del ngx_pool_t adyacente
- Se falsifica un ngx_pool_cleanup_s que apunta a system()
- Al destruirse el poolse dispara la llamada a system()
- y se logra RCE
Efecto de ASLR
- Con ASLR activado: solo provoca el fallo del proceso worker (DoS)
- Con ASLR desactivado: permite la ejecución remota de código (RCE)
📊 Versiones afectadas
NGINX Open Source
| Rango de versiones | Versión corregida |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Rango de versiones | Versión corregida |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Otros componentes afectados
- NGINX Instance Manager: 2.16.0 – 2.21.1
- NGINX App Protect WAF: 4.9.0 – 5.8.0
- NGINX Ingress Controller: 3.5.0 – 5.4.1
- NGINX Gateway Fabric: 1.3.0 – 2.5.1
- F5 DoS for NGINX: 4.8.0
🔥 Estado del PoC
PoC público
- Repositorio en GitHub:https://github.com/DepthFirstDisclosures/Nginx-Rift
- QI-ANXIN ya lo ha replicado: investigadores de su centro de inteligencia de amenazas lo replicaron con éxito
- Detalles técnicos públicos: depthfirst publicó su análisis técnico
- Explotación en la práctica: todavía no detectada
Cómo usar el PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Solución
Método 1: actualizar la versión
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Método 2: modificar la configuración (mitigación)
Sustituye losgrupos de captura sin nombreporgrupos de captura con nombre:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
Los grupos de captura con nombreno activan la vulnerabilidad.
Método 3: revisar la configuración
Comprueba si tu configuración es vulnerable:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 Cómo se descubrió
Descubierto por un sistema automatizado
depthfirst y su sistema de análisis de seguridad:
- En 6 horasencontró 5 problemas
- 4 confirmados por NGINX
- CVE-2026-42945es la más grave
- Se remonta a 2008 y existe en casi todas las compilaciones estándar
Otras vulnerabilidades relacionadas
- CVE-2026-42946: corrupción de memoria
- CVE-2026-40701: corrupción de memoria
- CVE-2026-42934: corrupción de memoria
📝 Resumen
CVE-2026-42945es una de las vulnerabilidades más graves de la historia de NGINX:
- 18 años oculta: el código entró en el repositorio en 2008
- CVSS 9.2: desbordamiento de búfer en el heap, puede provocar RCE
- Condiciones: rewrite con capturas sin nombre + cadena de reemplazo con ? + seguida de otras directivas
- Impacto: 9,75 millones de sitios en el mundo, 2,54 millones en China
- PoC público: repositorio en GitHub + replicado por QI-ANXIN
- Solución: actualizar la versión o usar grupos de captura con nombre
Tras 18 años oculta, la vulnerabilidad ha estallado: actualiza o ajusta la configuración cuanto antes.
Anuncio oficial:https://my.f5.com/manage/s/article/K000161019
Repositorio del PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift
Análisis técnico:https://depthfirst.com/research/nginx-rift