
Aviso y análisis de CVE-2026-111497, una escritura fuera de límites en el decodificador Brotli alcanzable mediante la descompresión HTTP de Node.js, con causa raíz, diff del parche, reglas de detección y mitigaciones.
Fecha de última verificación: 2026-11-04 (KST). Solo se han incluido los valores confirmados en las fuentes de la sección References al final; cuando los valores difieren entre fuentes, se indican todos.
c/dec/decode.c) ignora el valor de retorno de error de un cambio de bloque (block switch) incorrecto, continúa decodificando en estado corrupto y realiza una escritura fuera de los límites del búfer (Out-of-Bounds Write).Brotli/brotlicffi, Bun, .NET, Envoy, Istio, etc. Se ve afectado si existe una ruta que descomprima (decompress) datos Content-Encoding: br controlados por el atacante.| Elemento | Contenido |
|---|---|
| CVE ID | CVE-2026-111497 (GHSA-9v8h-qqgm-4m35) |
| Alias | Node2Shell (denominación de Imperva), HTTP2Shell, Broccoli2Shell. A pesar del nombre, no es un defecto del protocolo HTTP/2 |
| Fecha de publicación | 2026-10-21 versión de seguridad de Node.js y versión parcheada de Brotli / 2026-10-22 publicación del registro CVE |
| Descubridores | OpenAI Codex Security (Khai Tran, Sylvie Mayer) |
| Productos/versiones afectados | Google Brotli (libbrotlidec) 1.0.3 ~ 1.2.0 y productos que lo incluyen/enlazan (véase la tabla siguiente) |
| Versiones parcheadas | Brotli 1.0.10 / 1.1.1 / 1.2.1, Node.js 22.23.4 / 24.22.1 / 26.12.1, Python Brotli 1.2.1, brotlicffi 1.2.1.0, Bun 1.4.4 |
| CVSS v4.0 (CNA: Google) | 9.2 Critical — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CVSS v3.1 (NVD) | 9.8 Critical — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS v3.1 (Red Hat / Amazon Linux) | 8.1 — CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H (refleja el requisito de ataque AT:P y el hardening de la plataforma) |
| Clasificación del propio proveedor | Node.js: High / Red Hat: Important |
| CWE | CWE-787 Out-of-bounds Write (NVD, Red Hat, Cyber Centre de Canadá) / CWE-252 Unchecked Return Value (descripción de CISA KEV, citado también como causa raíz en algunos análisis) |
| Explotación real | Explotación confirmada. Inclusión en CISA KEV el 2026-10-27, plazo de acción para agencias federales 2026-11-10. Operadores de honeypot (Previdian, ELLIO) observaron intentos de explotación entre el 10-26 y el 10-27 |
| Componente | Versiones afectadas | Versiones corregidas |
|---|---|---|
| Google Brotli (C, libbrotlidec) | 1.0.3 ~ 1.2.0 | 1.0.10, 1.1.1, 1.2.1 |
| Node.js 26.x (Current) | anterior a 26.12.1 | 26.12.1 |
| Node.js 24.x (LTS) | anterior a 24.22.1 | 24.22.1 |
| Node.js 22.x (LTS) | anterior a 22.23.4 | 22.23.4 |
| Node.js 25.x / 23.x / 20.x e inferiores | todas las versiones (EOL) | sin parche → migrar a 22/24/26 |
| Bun | 1.4.3 e inferiores | 1.4.4 |
Python Brotli (PyPI) | 1.2.0 e inferiores | 1.2.1 |
Python brotlicffi | anterior a 1.2.1.0 | 1.2.1.0 |
| .NET / PowerShell | véase el aviso del proveedor | actualización urgente de .NET de Microsoft (dotnet/announcements#494) |
| Envoy / Istio | véase el aviso del proveedor | versión corregida distribuida a principios de octubre (sin especificar el defecto) |
| VMware SDDC Manager (VCF / vSphere Foundation) | véase el aviso de Broadcom | véase el aviso de Broadcom |
Rutas de exposición indirecta: Python requests, urllib3, aiohttp[speedups], httpx descomprimen automáticamente las respuestas br si Brotli/brotlicffi está instalado. curl también se ve afectado cuando se usa la opción de descompresión.
| Fecha | Evento |
|---|---|
| 02-27 | Se aplica un commit de corrección en el repositorio google/brotli (marcado como problema de seguridad, no publicado) |
| Principios de octubre | Distribución de versiones corregidas de Envoy / Istio |
| 10-21 | Versión de seguridad de Node.js (22.23.4 / 24.22.1 / 26.12.1), publicación de Google Brotli 1.0.10 / 1.1.1 / 1.2.1 |
| 10-22 | Publicación del registro CVE, Imperva demuestra ejecución de código en Node.js 24.22.0 (Linux arm64) |
| 10-23 | Distribución de paquetes PyPI parcheados |
| 10-25 | Aviso y actualización de Microsoft .NET |
| 10-26 | ELLIO reporta tráfico de explotación |
| 10-27 | Inclusión en CISA KEV (plazo de acción 11-10) |
⚠️ Algunos artículos de análisis escritos entre el 24 y el 28 de octubre indican "no se confirman ataques reales, no incluido en KEV", pero esto corresponde al momento previo a la inclusión en KEV, por lo que difiere de la situación actual.
BROTLI_FALSELa decodificación Brotli es una máquina de estados. El flujo se compone de unidades de metabloque, y dentro de cada metabloque aparecen instrucciones que cambian de tipo de bloque (block switch) para literales, comandos de inserción y copia (insert-and-copy command) y distancias.
DecodeBlockTypeAndLength() interpreta el cambio de bloque y devuelve BROTLI_BOOL. El problema es que BROTLI_FALSE se usó con dos significados completamente distintos.
| Significado | Naturaleza | Tratamiento correcto |
|---|---|---|
| Se necesita más entrada (needs more input) | Recuperable | Esperar la siguiente entrada y reanudar |
| El metabloque tiene solo 1 tipo de bloque, por lo que el cambio en sí es imposible | Error de formato fatal | Rechazar el flujo |
El lado llamador no verificó este valor de retorno.
DecodeCommandBlockSwitch) está declarado como static void, por lo que no conserva el valor de retorno, y la rama non-safe de la macro BROTLI_SAFE solo llama a la función y descarta el resultado. (Análisis de SonicWall)DecodeLiteralBlockSwitch) el valor de retorno se descarta por completo. Aunque cada análisis señala funciones distintas, según la descripción del parche de la distribución (TuxCare), los tres decodificadores de cambio de bloque (literal, comando y distancia) fueron modificados para devolver códigos de error, por lo que se puede considerar que las tres rutas están relacionadas.Como resultado, incluso si ocurre un error de formato, el decodificador continúa como si el cambio hubiera tenido éxito, el contador de longitud de bloque queda en 0 y el estado de posición·distancia se traslada a la ruta que debería haber sido rechazada.