El 21 de octubre de 2026 se divulgó CVE-2026-111497, una corrupción de memoria en el decodificador Brotli de Google. Como ese código en C viaja dentro de todo programa que descomprime Brotli, el mismo fallo aparece en Node.js, Bun, .NET de Microsoft, Envoy, los paquetes de Python Brotli y brotlicffi, y varios más. Un dato clave: cada programa lleva su propia copia del decodificador, así que cada uno tiene que actualizarla por su cuenta.
Resumen
| CVE | CVE-2026-111497 |
| Componente | Decodificador Brotli (biblioteca en C) de Google |
| Tipo | Escritura fuera de límites / corrupción de memoria |
| Impacto | Caída, fuga de memoria o ejecución de código controlado por el atacante |
| Autenticación | No requiere |
| Reportado por | Codex Security de OpenAI (Khai Tran y Sylvie Mayer) |
| Divulgación | 21/10/2026 |
| Explotación activa | No reportada (CISA 23/10: explotación “none”) |
Puntajes
Las valoraciones difieren según quién puntúa:
| Fuente | Escala | Puntaje |
|---|---|---|
| Google (asignó el CVE) | CVSS 4.0 | 9.2 · Crítico |
| Node.js | - | Alto |
| Red Hat | - | 8.1 · Importante |
| Microsoft (para .NET) | - | 8.1 · Alto |
¿En qué consiste?
Brotli es un formato de compresión de Google que se usa en toda la web para achicar páginas y tráfico. El problema está en el código en C que desempaqueta un flujo Brotli: con datos comprimidos manipulados, el decodificador escribe más allá del final de un buffer y corrompe la memoria del proceso. Según el caso, eso deriva en una caída, una fuga de memoria o la ejecución de código controlado por el atacante.
Como el fallo vive en el decodificador de Google y cada programa reutiliza ese mismo código, la vulnerabilidad se propaga a lenguajes, proxies y paquetes por igual.
CVE-2026-111497"] BR --> N["Node.js"] BR --> BU["Bun"] BR --> NET[".NET"] BR --> EN["Envoy / Istio"] BR --> PY["Python: Brotli / brotlicffi"] BR --> OT["FFmpeg, ClickHouse, Apache Arrow,
gema de Ruby, cdxgen y mas"] class BR bug;
El fallo funciona en los dos sentidos
OpenAI, cuyo equipo reportó la falla, la describe como ejecución remota de código sin autenticar en Brotli. Según su análisis, se puede abusar en ambas direcciones: un servidor sin parchear que acepta entrada comprimida puede ser tomado por un cliente malicioso, y un cliente sin parchear que acepta entrada comprimida (por ejemplo, curl --compressed) puede ser tomado por un servidor malicioso.
que decodifica Brotli"] MS["Servidor malicioso"] -->|"respuesta con br"| C["Cliente sin parchear
(ej. curl --compressed)"] S --> I1["Escritura fuera de limites
posible ejecucion de codigo"] C --> I2["Escritura fuera de limites
posible ejecucion de codigo"] class MC,MS attacker; class S,C check; class I1,I2 impact;
¿Estoy expuesto?
Un programa corre riesgo solo si decodifica datos Brotli que controla otra persona. Estas son las versiones afectadas y corregidas, y cuándo queda expuesto cada producto:
| Producto | Afectadas | Corregida en | Expuesto cuando |
|---|---|---|---|
| Brotli (biblioteca C) | 1.0.3 a 1.2.0 | 1.0.10, 1.1.1, 1.2.1 | el código decodifica Brotli no confiable |
| Node.js | 22.x, 24.x, 26.x previas al fix; 20.x y anteriores (fin de vida) | 22.23.4, 24.22.1, 26.12.1 | fetch() de una respuesta br, o cuerpos br con Express / body-parser |
| Bun | 1.4.3 y anteriores | 1.4.4 | fetch() de una respuesta br, o node:zlib |
| .NET | 8.0, 9.0, 10.0 previas al fix; 11.0 previews antes de RC3 | 8.0.33, 9.0.22, 10.0.14, 11.0 RC3 | solo si se habilita Brotli en la descompresión de ASP.NET Core o de HttpClient, o si se pasan datos no confiables a las APIs de Brotli |
| Envoy | 1.39.2, 1.38.5, 1.37.7, 1.36.11 | 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12 | solo si el descompresor Brotli está configurado |
| Istio | 1.31.0-1.31.1, 1.30.0-1.30.5, 1.29.0-1.29.8 | 1.31.2, 1.30.6, 1.29.9 | solo si la descompresión Brotli está habilitada |
Python Brotli |
1.2.0 y anteriores | 1.2.1 | instalado, y un cliente HTTP decodifica br |
Python brotlicffi |
1.2.0.x y anteriores | 1.2.1.0 | instalado, y un cliente HTTP decodifica br |
| cdxgen | 13.4.0 / 12.8.8 y anteriores | 13.5.0, 12.8.9 | binario o imagen escaneando entrada no confiable |
Dos matices importantes:
- En Node.js y Bun, la exposición aparece cuando el
fetch()integrado lee una respuesta conContent-Encoding: br, o cuando Express 5 / body-parser 2 desempaquetan una subida Brotli. Un servidor HTTP de Node.js por sí solo no decodifica los cuerpos de las peticiones. - En Python, el riesgo viene de tener instalado el paquete
Brotliobrotlicffi. Con cualquiera presente, clientes comorequests,urllib3,httpxyaiohttpdecodifican respuestas Brotli por su cuenta, de modo que una aplicación puede quedar expuesta aunque nunca importe Brotli en su propio código.
Explotación
El alcance real depende del software. El Red Team de Imperva, que llama a su trabajo Node2Shell, ejecutó código provisto por el atacante en una compilación sin modificar de Node.js 24.22.0 para Linux en ARM64, entregándolo tanto como respuesta de un fetch() como en el cuerpo de una petición de Express. El exploit llevó varios intentos, no fue publicado y no se probó en otras compilaciones.
Hasta ahora no hay explotación en el mundo real. La evaluación de CISA del 23 de octubre registró explotación como “none” y automatización como “no”, y Red Hat señaló que no existe una prueba de concepto pública confiable para ejecutar código. Igual conviene no demorar: el código vulnerable es el mismo en muchos productos y las valoraciones lo ubican entre alto y crítico.
El parche tiene una historia rara
El cambio que cierra el fallo se agregó al código fuente de Brotli el 27 de febrero, pero ninguna versión nueva de Brotli lo incluyó hasta el 21 de octubre. Según OpenAI, la causa raíz “se corrigió en febrero, pero no se sabía en ese momento que daba lugar a una vulnerabilidad de seguridad y no hubo una versión más reciente de Brotli”. Node.js acredita a Khai Tran y Sylvie Mayer (OpenAI Codex Security) por el reporte, y a Matteo Collina y Antoine du Hamel por la corrección.
¿Qué hacer?
1. Actualizar, reiniciar y reconstruir
Actualizá a una versión corregida de la tabla, reiniciá el servicio y reconstruí las imágenes de contenedor: un proceso en ejecución sigue usando el decodificador viejo hasta que reinicia.
# Node.js: verificar version en uso
node -v
# Reconstruir imagenes a partir de la base actualizada, no solo redeploy
2. Si todavía no podés actualizar, dejá de decodificar Brotli no confiable
Las recomendaciones de OpenAI y de la firma Aikido:
- Rechazar pedidos entrantes con
Content-Encoding: brantes de que cualquier proxy o parser decodifique el cuerpo. - Apagar la decodificación automática de Brotli en los clientes HTTP y rechazar respuestas Brotli antes de decodificarlas.
- En Python, desinstalar los paquetes
Brotliybrotlicffipara que los clientes caigan a gzip y deflate.
# Python: quitar los paquetes vulnerables mientras no haya actualizacion
pip uninstall brotli brotlicffi
Sacar
brdel encabezadoAccept-Encodingno alcanza por sí solo: un servidor puede responder con Brotli más allá de lo que el cliente pida. Para Node.js no se publicó ningún workaround, así que actualizar el runtime es la única solución.
3. Tener en cuenta los puntos ciegos
- Un WAF ayuda solo hasta cierto punto. Vercel, que agregó reglas el día de la divulgación, aclaró que no cubren “las respuestas que tus funciones traen de otros servidores”. Para ese camino, solo actualizar cierra el agujero. Cloudflare agregó dos reglas a su conjunto administrado el 25 de octubre, pero por defecto solo registran el tráfico y no bloquean nada.
- Los escáneres de dependencias pueden no marcar los paquetes de Python todavía. El registro del CVE nombra el repositorio de Brotli de Google, no los paquetes de PyPI, y el aviso de GitHub que lee Dependabot no listaba paquetes afectados. Los avisos
PYSEC-2026-4322yPYSEC-2026-4323se agregaron el 23 de octubre, así que conviene revisar las versiones instaladas a mano. - Los paquetes del sistema se corrigen en momentos distintos. Debian corrigió
brotlien 13 (trixie) y 12 (bookworm); Amazon Linux 2023 publicóbrotliy Node.js 24 el 24 de octubre; openSUSE Tumbleweed ya tiene ambos; Ubuntu todavía figuraba en evaluación.
Actualización: Microsoft parcha .NET
Microsoft publicó actualizaciones fuera de ciclo el 25 de octubre para .NET 8, 9 y 10 (runtimes 8.0.33, 9.0.22, 10.0.14) y .NET 11 RC3. .NET Framework no está afectado. Una app de .NET queda expuesta solo si decodifica datos Brotli que controla un atacante: con Brotli habilitado en la descompresión de ASP.NET Core o de HttpClient (ninguna activa por defecto), o al pasar datos no confiables a APIs como BrotliStream y BrotliDecoder. Para apps con runtime compartido alcanza con instalar el runtime y reiniciar; las self-contained y NativeAOT hay que recompilarlas. La misma tanda corrige además CVE-2026-114148, un fallo distinto de permisos en archivos de algunos tarballs de .NET en Linux.
Actualización: JFrog lo encuentra en FFmpeg, ClickHouse y Apache Arrow
El 25 de octubre, JFrog reportó que el fallo también llega a FFmpeg (a través de libjxl, que usa Brotli para metadatos en archivos JPEG XL), ClickHouse (una petición de unos 23 MB tiró abajo el servidor, una denegación de servicio) y Apache Arrow / pyarrow (una entrada de 534 bytes mandó la descompresión a un bucle infinito). Importante: algunos de estos caminos empiezan con un archivo, no con un pedido web, así que rechazar Content-Encoding: br en el borde de la red no los cubre.
Fuentes
Fuentes oficiales:
Complementarias:
- NVD (NIST): CVE-2026-111497
- CVE.org: CVE-2026-111497
- The Hacker News: Brotli Decoder Flaw Behind Node.js RCE
Más sobre seguridad en el ciclo de desarrollo en ¿Qué es DevSecOps?.