**Vulnerabilidad Crítica en el Decodificador Brotli de Google: Una Amenaza para Múltiples Aplicaciones**
La ciberseguridad es un campo en constante evolución, donde nuevas vulnerabilidades emergen y amenazan la integridad de sistemas y aplicaciones en todo el mundo. Recientemente, se ha identificado una grave vulnerabilidad en el decodificador Brotli de Google, que se encuentra presente en una variedad de programas que desempaquetan datos comprimidos en este formato. Entre ellos se incluyen Bun, los paquetes Brotli y brotlicffi de Python, así como proxies Envoy configurados para descomprimir Brotli. La vulnerabilidad, identificada como CVE-2026-111497, permite que datos comprimidos maliciosos sobrescriban la memoria de un programa, lo que podría resultar en bloqueos, fugas de memoria o incluso la ejecución de código controlado por un atacante.
El descubrimiento de esta vulnerabilidad fue realizado por investigadores de Imperva, quienes demostraron que es posible ejecutar código en una versión de Node.js no parcheada. Sin embargo, hasta el momento no se han reportado ataques en el mundo real que aprovechen esta vulnerabilidad en otros software. La divulgación inicial del fallo tuvo lugar el 21 de octubre, fecha en la que Node.js y Google lanzaron correcciones, seguidas por actualizaciones en otros productos. Es importante resaltar que, dado que el error radica en el decodificador de Google y cada programa utiliza su propia copia, es imperativo que cada uno actualice su versión de manera independiente.
El formato Brotli, desarrollado por Google, se utiliza ampliamente en la web para reducir el tamaño de páginas y otros datos. La vulnerabilidad está en el código C que desempaqueta un flujo Brotli, lo que significa que se extiende a cualquier aplicación que reutilice dicho código, afectando desde entornos de ejecución hasta proxies y paquetes de Python. Un programa se encuentra en riesgo únicamente si decodifica datos Brotli que estén bajo el control de un tercero. En el caso de Node.js y Bun, esto ocurre cuando la función incorporada `fetch()` lee una respuesta con la cabecera `Content-Encoding: br`, o cuando códigos que manejan el cuerpo de solicitudes, como Express 5 y body-parser 2, desempaquetan una carga de Brotli. Es relevante mencionar que un servidor HTTP básico de Node.js no decodifica cuerpos de solicitud por sí mismo.
Envoy e Istio son vulnerables únicamente cuando la descompresión de Brotli está habilitada, por ejemplo, a través de un filtro de Envoy. En entornos donde esta funcionalidad está desactivada, el fallo permanece inaccesible. En el ámbito de Python, el riesgo proviene de tener instalado cualquiera de los paquetes Brotli o brotlicffi. Una vez que cualquiera de estos paquetes está presente, los clientes HTTP como requests, urllib3, httpx y aiohttp decodifican automáticamente las respuestas Brotli, exponiendo así a la aplicación sin necesidad de importar explícitamente Brotli en su código.
La implementación de un firewall de aplicaciones web puede ofrecer cierta protección, pero tiene sus limitaciones. Vercel, que introdujo reglas de firewall el mismo día de la divulgación, aclaró que tales reglas no cubren "respuestas que sus funciones obtienen de otros servidores". Por lo tanto, para mitigar el riesgo, es crucial actualizar el entorno de ejecución o la biblioteca involucrada.
La gravedad de la vulnerabilidad depende del software afectado. El equipo de Red Team de Imperva, que denomina su trabajo Node2Shell, logró ejecutar código proporcionado por un atacante en una versión no modificada de Node.js 24.22.0 para Linux en ARM64, tanto a través de una respuesta obtenida como mediante un cuerpo de solicitud de Express. El exploit requirió varios intentos, y aunque no se ha publicado, no se ha probado en otras versiones.
OpenAI, cuyo equipo de Codex Security reportó la vulnerabilidad, la describe como una facilitadora de ejecución remota de código no autenticada en Brotli, identificando a Node.js, Bun y Envoy como software afectado. Según su análisis, el funcionamiento de la vulnerabilidad puede ser bidireccional. Hasta el momento, no se ha reportado explotación en el mundo real. La evaluación de CISA del 23 de octubre registró la explotación como "ninguna" y la automatización como "no", mientras que Red Hat indicó que no hay pruebas de concepto públicas fiables que demuestren la ejecución de código.
Las calificaciones de severidad varían según la entidad que las evalúe. Google, que asignó el CVE, lo califica con un 9.2, o crítico, en la escala CVSS 4.0. Por su parte, Node.js lo clasifica como alto, mientras que Red Hat lo valora con un 8.1, o importante.
La historia de la corrección de esta vulnerabilidad es inusual. El cambio que soluciona el fallo se añadió al código fuente de Brotli el 27 de febrero, pero no se lanzó una nueva versión de Brotli que lo incluyera hasta el 21 de octubre. OpenAI indicó que la causa raíz "fue realmente corregida en el código fuente de Brotli en febrero, pero no se conocía en ese momento que generaba una vulnerabilidad de seguridad, y no hubo una versión más reciente de Brotli".
Node.js agradece a Khai Tran y Sylvie Mayer del equipo de Codex Security de OpenAI por reportar la vulnerabilidad, así como a los mantenedores Matteo Collina y Antoine du Hamel por la corrección.
Es fundamental actualizar a una versión corregida de las que se mencionan anteriormente, reiniciar el servicio y reconstruir cualquier imagen de contenedor, ya que un proceso en ejecución mantiene el antiguo decodificador hasta que se reinicia.
En aquellos entornos donde aún no se puede actualizar, se recomienda detener la decodificación de Brotli no confiable. La página de divulgación de OpenAI y la firma de seguridad Aikido sugieren las siguientes medidas: rechazar solicitudes entrantes con `Content-Encoding: br` antes de que cualquier proxy o analizador decodifique el cuerpo; desactivar la decodificación automática de Brotli en los clientes HTTP y rechazar respuestas Brotli antes de que sean decodificadas. En el caso de Python, se recomienda desinstalar los paquetes Brotli y brotlicffi para que los clientes retrocedan a gzip y deflate.
Eliminar `br` del encabezado `Accept-Encoding` no es suficiente por sí solo, ya que un servidor puede enviar Brotli sin importar lo que el cliente solicite. Para Node.js, no se ha publicado ninguna solución alternativa, por lo que la actualización del entorno de ejecución sigue siendo el único remedio.
Los paquetes del sistema se están corrigiendo en diferentes momentos. Debian corrigió su paquete brotli para Debian 13 (trixie) el 23 de octubre en la versión 1.1.0-2+deb13u1. Por otro lado, Amazon Linux 2023 aún listaba sus paquetes de brotli y Node.js 24 como pendientes de corrección a fecha del 22 de octubre.
Es posible que los escáneres de dependencias aún no hayan marcado los paquetes de Python. El registro del CVE menciona el repositorio de Brotli de Google, no los paquetes de PyPI, y el aviso de GitHub todavía no lista ningún paquete afectado, lo que es lo que Dependabot consulta. Las entradas de aviso para los dos paquetes de Python, PYSEC-2026-4322 y PYSEC-2026-4323, se añadieron el 23 de octubre, por lo que también se recomienda verificar manualmente las versiones instaladas.
En conclusión, la vulnerabilidad CVE-2026-111497 representa un riesgo significativo para una amplia gama de aplicaciones y servicios que utilizan Brotli. La situación exige una atención inmediata por parte de desarrolladores y administradores de sistemas para mitigar los riesgos asociados y proteger la integridad de sus sistemas.
