Node2Shell nació el miércoles 21 de octubre como un bug puntual de Node.js. Cuarenta y ocho horas después mutó en HTTP2Shell y alcanzó a cualquier librería o servidor que comprima tráfico HTTP con Brotli, desde Python hasta curl, Bun y Envoy.
El origen es CVE-2026-111497, un desbordamiento de memoria en el decodificador oficial de Google que permite a un atacante sin credenciales corromper procesos y, en el peor caso, ejecutar código remoto. OpenAI dice haberlo encontrado en febrero. Nadie lo registró como vulnerabilidad hasta esta semana.
TL;DR
- CVE-2026-111497 es un desbordamiento en el decodificador Brotli que permite ejecutar código remoto sin autenticación.- Node2Shell (Node.js, 21 de octubre) evolucionó a HTTP2Shell: también afecta a Python, C++, curl, Bun y Envoy.- OpenAI dice haber hallado el bug en febrero de 2026 y lo reportó como RCE bidireccional cliente-servidor.- La falla alcanza un CVSS v4.0 de 9.2 (crítico) en Brotli 1.0.3 a 1.2.0; la versión segura es 1.2.1.- Apache y Nginx no decodifican Brotli por defecto, pero clientes como requests y httpx cargan la librería vulnerable.
Qué es Brotli
Brotli es el algoritmo de compresión sin pérdida que Google diseñó para reducir el peso de HTML, CSS y JavaScript en la web; navegadores y servidores lo usan para comprimir contenido HTTP. La vulnerabilidad de Brotli revelada esta semana golpea justamente su decodificador y permite corromper memoria o ejecutar código remoto sin autenticación.
La implementación de referencia vive en el repositorio oficial de Google. Node.js, Python, curl y decenas de lenguajes no reescriben el decodificador desde cero: empaquetan una copia de ese código dentro de sus propias librerías. Por eso un solo fallo en el origen se multiplica en docenas de proyectos distintos.
Qué pasó: de Node2Shell a HTTP2Shell
El equipo de Node.js bautizó el fallo Node2Shell el miércoles 21 de octubre y lo describió como un out-of-bounds write en el decodificador de Brotli que el runtime empaqueta entre las versiones 1.0.3 y 1.2.0. Un atacante remoto, sin autenticar, puede enviar un flujo Brotli manipulado y corromper la memoria del proceso que lo descomprime.
El jueves 22, Python confirmó que sus paquetes Brotli y brotlicffi cargan la misma librería nativa vulnerable. El viernes 23 quedó claro que curl, Bun, Envoy e Istio también la incluyen. De ahí el cambio de nombre: HTTP2Shell describe mejor a un fallo que afecta a cualquier plataforma (Windows, macOS, Linux), porque vive en el algoritmo y no en un sistema operativo particular.
Entre las 4:12 y las 4:15 de la tarde, hora del Pacífico, del viernes 23, los parches empezaron a aparecer para libbrotli, Python, C++, Node.js y Bun, y OpenAI publicó que había descubierto el mismo bug en febrero.
El cambio que hizo correr a medio ecosistema se ve claro en un requirements.txt típico:
-brotli==1.2.0
-brotlicffi==1.2.0.0
+brotli==1.2.1
+brotlicffi==1.2.1.0
Ese cambio de versión alcanza para que pip show brotli brotlicffi deje de reportar una versión dentro del rango 1.0.3-1.2.0, que es el que marca CVE-2026-111497 como vulnerable.
Contexto e historia: el hallazgo silencioso de OpenAI
OpenAI dice que encontró este bug en febrero de 2026 y lo reportó como una ejecución remota de código no autenticada que funciona en ambas direcciones. Un cliente malicioso puede tomar el control de un servidor sin parchear, y un servidor malicioso puede tomar el control de un cliente que acepte respuestas comprimidas.
El equipo de Brotli corrigió la causa raíz en el código fuente ese mismo mes, pero nadie la registró como vulnerabilidad de seguridad, según el análisis de Aikido Security. Ese desfase de ocho meses explica por qué ningún escáner automático la detectaba: la corrección existía en el repositorio, pero ninguna versión publicada la incluía hasta que Node.js reaccionó esta semana.
La mecánica bidireccional es la parte más incómoda del caso. No hace falta que el servidor esté expuesto a internet para quedar en riesgo: un cliente HTTP que descarga una respuesta comprimida de un sitio controlado por un atacante también corre el decodificador vulnerable, así que la superficie de ataque incluye a desarrolladores que simplemente navegan o hacen scraping desde su propia máquina.
Detalles técnicos: cómo un buffer pequeño permite ejecutar código
El bug vive en la rutina que decodifica un flujo Brotli byte a byte. El decodificador debería rechazar un flujo que declare más datos de los que el formato permite, pero una validación de límites falla y sigue aceptando bytes de más.
Esos bytes extra se escriben sobre un buffer de trabajo de tamaño fijo reservado en el heap, y lo que se desborda pisa estructuras de memoria vecinas. Un atacante que controla el contenido del flujo Brotli también controla qué bytes sobrescriben esa memoria. Con suficiente precisión, eso se traduce en ejecución de código arbitrario en vez de una simple caída del proceso.
Las versiones 1.0.3 a 1.2.0 de Brotli quedan expuestas en todas las plataformas.
El CVSS v4.0 de 9.2 refleja esa falta de requisitos previos: no hace falta autenticación, no hace falta interacción del usuario más allá de recibir una respuesta comprimida, y el impacto cubre confidencialidad, integridad y disponibilidad a la vez.
La siguiente secuencia resume el ataque: un flujo Brotli corrupto entra al decodificador, el límite de tamaño falla y el desborde corrompe memoria que el atacante puede aprovechar para ejecutar su propio código.
sequenceDiagram
participant A as Atacante
participant S as Servidor Node.js
A->>S: flujo Brotli manipulado
S-->>S: decodifica y desborda el buffer
Note over S: memoria vecina corrompida
S-->>A: ejecuta código del atacante
La tabla siguiente resume el estado de parche por proyecto al 23 de octubre de 2026, según el seguimiento de Aikido Intel:
ProyectoEstadoVersión corregidaNode.jsParche disponible22.23.4 · 24.22.1 · 26.12.1Brotli / libbrotli nativoParche disponible1.2.1 (o 1.0.10 / 1.1.1 en ramas viejas)Python (brotli / brotlicffi)Parche disponible1.2.1 / 1.2.1.0curl / libcurlDepende de su Brotli vinculadoReconstruir contra Brotli 1.2.1BunParche disponible1.4.4EnvoyParche disponible1.40.0 · 1.39.3 · 1.38.6 · 1.37.8IstioParche disponible1.29.9 · 1.30.6 · 1.31.2
Impacto y análisis de la vulnerabilidad de Brotli
La vulnerabilidad de Brotli obtiene un CVSS v4.0 de 9.2, crítico, porque no exige autenticación y compromete tanto a clientes como a servidores. El agravante es la cadena de dependencias: paquetes como requests, httpx y aiohttp cargan Brotli automáticamente cuando está instalado, aunque el desarrollador nunca lo pidió de forma explícita.
Al 23 de octubre, las bases de datos de asesorías todavía no vinculaban el CVE a los paquetes de PyPI, según el mismo análisis de Aikido. Eso significa que herramientas como pip-audit, Dependabot y Safety no marcaban las versiones vulnerables ese día. Quien dependa solo del escáner automático podía creerse a salvo sin estarlo.
No todos los servidores quedan expuestos por igual. El módulo mod_brotli estándar de Apache y la configuración por defecto de Nginx no decodifican Brotli entrante, solo lo comprimen al salir. Ninguno de los dos corre el decodificador vulnerable a menos que un módulo adicional lo active.
⚠️ Ojo: si tu librería o aplicación todavía no tiene parche disponible, la recomendación es desactivar la decodificación de Brotli hasta que lo tenga, no esperar sin mitigar.
OpenAI dice haber hallado el fallo en febrero de 2026, meses antes del parche.Qué sigue
La lista de proyectos afectados va a seguir creciendo en los próximos días. Cualquier lenguaje o framework que empaquete una copia estática de Brotli entre las versiones 1.0.3 y 1.2.0 tiene que revisar su cadena de dependencias, no solo su runtime principal.
La vulnerabilidad de Brotli obliga, además, a reconstruir cualquier imagen de contenedor que incluya una copia vieja de la librería. El bug vive en el binario empaquetado y no se corrige solo actualizando el sistema operativo base; hace falta reconstruir y volver a desplegar.
Los mantenedores de distribuciones Linux todavía están empaquetando el backport del lado del sistema operativo, y los proveedores de servicios gestionados tienen que confirmar la remediación caso por caso antes de que sus clientes puedan darse por tranquilos.
📖 Resumen en Telegram: Ver resumen
Probalo vos: corré pip show brotli brotlicffi en tus entornos de Python ahora mismo y confirmá que la versión instalada sea 1.2.1 o posterior.
Preguntas frecuentes
¿Qué es CVE-2026-111497?
CVE-2026-111497 es el identificador oficial de un desbordamiento de memoria en el decodificador de Brotli, con un CVSS v4.0 de 9.2, que permite ejecutar código remoto sin autenticación.
¿Qué diferencia hay entre Node2Shell y HTTP2Shell?
Node2Shell fue el nombre inicial, acotado a Node.js. HTTP2Shell es el mismo bug reconocido como un problema de cualquier librería o servicio que decodifique Brotli sobre HTTP, incluidos Python, C++, curl, Bun y Envoy.
¿Mi servidor con Apache o Nginx está expuesto a esta falla de Brotli?
No, si usás la configuración estándar. mod_brotli de Apache y la configuración por defecto de Nginx no decodifican Brotli entrante, así que no ejecutan la rutina vulnerable salvo que un módulo adicional la active.
¿Cómo sé si mi proyecto usa una versión vulnerable de Brotli?
Revisá si tenés instalado Brotli 1.2.0 o anterior, o brotlicffi 1.2.0.x. En Python corré pip show brotli brotlicffi; en un proyecto de Node.js, npm ls brotli.
¿Por qué pip-audit o Dependabot no detectan el fallo de Node2Shell/HTTP2Shell?
Porque, al 23 de octubre, las bases de datos de vulnerabilidades todavía no habían vinculado el CVE a los paquetes específicos de PyPI. Un escáner que depende de esas bases no puede marcar lo que todavía no está catalogado.
¿Qué versiones de Node.js corrigen CVE-2026-111497?
Node.js corrige el fallo en las versiones 22.23.4, 24.22.1 y 26.12.1, o en cualquier release más nuevo de esas mismas líneas.
Referencias
- Aikido Security: cobertura original de cómo Node2Shell evolucionó a HTTP2Shell y el estado de parches por proyecto.- NVD: ficha oficial de CVE-2026-111497 con el puntaje CVSS y las versiones afectadas.- google/brotli: repositorio oficial del algoritmo y la implementación de referencia del decodificador.- Node.js: sitio oficial del runtime, que publicó las versiones 22.23.4, 24.22.1 y 26.12.1 con el parche.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Top comments (0)