CVE-2026-111497: Brotli afecta a Node.js, Python, curl y más

CVE-2026-111497: Brotli afecta a Node.js, Python, curl y más

@programacion

Lo esencial

  • CVE-2026-111497 es un desbordamiento en el decoder de Brotli: CVSS v4.0 de 9.2, afecta versiones 1.0.3 a 1.2.0
  • OpenAI halló el bug en febrero de 2026, pero nadie lo marcó como falla de seguridad hasta esta semana
  • La falla ya no es solo de Node.js: Python, curl, Bun, Envoy e Istio comparten el mismo decoder vulnerable
  • Node.js corrige en 22.23.4, 24.22.1 y 26.12.1; Brotli nativo pasa a la versión 1.2.1
  • pip-audit, Dependabot y Safety todavía no detectan la versión vulnerable en los paquetes de PyPI

Qué es Brotli y por qué está en todas partes

Brotli es el algoritmo de compresión sin pérdida que Google desarrolló y mantiene en GitHub para achicar HTML, CSS y JavaScript antes de enviarlos por HTTP.

Lo usan navegadores, servidores y runtimes como Node.js, que lo trae integrado como dependencia nativa para descomprimir respuestas. Cualquier cliente o servidor que acepte el header Content-Encoding: br termina ejecutando ese decoder sobre datos que llegan crudos de la red.

Qué pasó: de Node2Shell a HTTP2Shell

El miércoles 21 de octubre, el equipo de Node.js publicó CVE-2026-111497, apodado Node2Shell: un proceso Node que descomprime datos Brotli controlados por un atacante puede filtrar memoria o ejecutar código arbitrario.

Al día siguiente, el equipo de Python confirmó que sus paquetes Brotli y brotlicffi comparten el mismo decoder vulnerable a CVE-2026-111497. El viernes 23 de octubre quedó claro que el alcance no se limitaba a un lenguaje, de ahí el nombre HTTP2Shell: cualquier librería o aplicación que decodifique Brotli sobre HTTP puede estar expuesta.

Ese mismo viernes, varios parches todavía no estaban listos, según documentó el análisis de Aikido Security. Apache con su módulo estándar y Nginx no decodifican Brotli por defecto, pero eso no alcanza como consuelo si tu proxy, gateway o cliente HTTP sí lo hace.

La causa técnica: un decoder que no sabe decir basta

La falla es un desbordamiento de escritura fuera de límites en el decoder de Brotli, presente en las versiones 1.0.3 a 1.2.0 en todas las plataformas. Un bug hace que el decoder siga aceptando bytes cuando debería rechazar el flujo comprimido.

Esos bytes extra desbordan un buffer de trabajo pequeño y corrompen la memoria del proceso. Con ese control, un atacante remoto y sin autenticación puede filtrar datos sensibles, tumbar el proceso o ejecutar su propio código.

CVE-2026-111497 funciona en ambas direcciones: un cliente malicioso puede comprometer un servidor sin parchear, y un servidor malicioso puede comprometer a un cliente que acepte respuestas comprimidas.

El historial oculto: OpenAI lo encontró en febrero

OpenAI reportó que descubrió esta misma falla en febrero de 2026 y la describió como ejecución remota de código no autenticada en ambas direcciones. El equipo de Brotli corrigió la causa raíz en el código fuente ese mes.

Pero en ese momento nadie la clasificó como vulnerabilidad de seguridad, así que ningún release salió con el fix hasta esta semana. Esa brecha entre el parche silencioso y el reconocimiento público explica por qué cada proyecto que empaqueta su propia copia de Brotli tuvo que lanzar su actualización por separado, en lugar de heredar una corrección central.

Quién está expuesto y cómo parchar

Estás expuesto si cualquier entorno tiene Brotli 1.2.0 o anterior, o brotlicffi 1.2.0.x o anterior, instalado: clientes HTTP como requests, httpx y aiohttp los cargan automáticamente en cuanto están presentes.

  • Node.js: actualizar a 22.23.4, 24.22.1 o 26.12.1, o una versión más nueva de la misma línea de soporte
  • Brotli / libbrotli nativo: actualizar a 1.2.1 o posterior (las líneas antiguas tienen parches en 1.0.10 y 1.1.1)
  • Python: actualizar Brotli a 1.2.1+ y brotlicffi a 1.2.1.0+ en todos los entornos donde estén instalados
  • curl / libcurl: actualizar su dependencia de Brotli a 1.2.1 o a un paquete con el fix del proveedor; los binarios con Brotli estático necesitan reconstruirse
  • Bun: actualizar a 1.4.4 o posterior y reconstruir los ejecutables compilados que lo empaquetan
  • Envoy: actualizar a 1.40.0, 1.39.3, 1.38.6 o 1.37.8, o una versión más nueva de una rama soportada
  • Istio: el fix está incluido en 1.29.9, 1.30.6 y 1.31.2
# Verificar version instalada (Linux, macOS y Windows/PowerShell)
pip show brotli brotlicffi
npm ls brotli --all

# Actualizar Python
pip install --upgrade "brotli>=1.2.1" "brotlicffi>=1.2.1.0"

# Actualizar Node.js (via nvm, funciona igual en Linux/macOS/WSL)
nvm install 22.23.4
nvm alias default 22.23.4

Después de actualizar, hay que reconstruir las imágenes de contenedor que empaquetan estas librerías, redesplegar y confirmar que los procesos corriendo ya usan los componentes parchados.

El límite de los escáneres automáticos

Hasta el 23 de octubre, las bases de advisories no mapeaban CVE-2026-111497 a los paquetes de PyPI, así que pip-audit, Dependabot y Safety todavía no marcan las versiones vulnerables.

Eso vuelve fácil tener la dependencia vulnerable sin saberlo: requests, httpx y aiohttp cargan Brotli o brotlicffi aunque la aplicación nunca los importe directamente. Conviene revisar manualmente qué versión está instalada, no esperar a que el escáner avise.

Qué sigue

Quedan afuera de la lista de parches confirmados varios paquetes de sistema operativo, servidores HTTP, proxies y gateways que empaquetan su propia copia de Brotli. Para esos casos, lo recomendado es desactivar la decodificación de Brotli hasta que el proveedor publique un parche explícito.

Para managed services, conviene confirmar con el proveedor si ya aplicó la corrección en su infraestructura, en lugar de asumir que lo hizo.

📖 Versión extendida con más detalle: https://elsolitario.org/2026/10/24/cve-2026-111497-de-node2shell-a-http2shell-en-node-python/?utm_source=telegraph&utm_medium=instant_view&utm_campaign=programacion

Report Page