Aikido

Node2Shell evoluciona a HTTP2Shell. El alcance de la vulnerabilidad de Brotli (CVE-2026-111497) afecta a numerosas bibliotecas y aplicaciones que utilizan HTTPS.

Abróchate el cinturón.

Escrito por
Dania Durnas

TL;DR

⚠️ Brotli es una biblioteca de compresión de Google muy utilizada. El miércoles 21 de octubre, NodeJS reveló la vulnerabilidad CVE-2026-111497, denominada «node2shell», en la que un proceso de Node.js que descomprime datos Brotli controlados por un atacante puede provocar una fuga de memoria o la ejecución de código arbitrario. El jueves, la comunidad de Python reveló que los paquetes de Python también eran vulnerables al CVE-2026-111497.

El viernes 23 de octubre se supo que este CVE afecta a otros lenguajes y aplicaciones de servicio importantes que utilizan HTTP, para los que aún no hay parches totalmente disponibles.

Comprueba si estás descodificando Brotli como dependencia dentro de tus bibliotecas. Mantente atento a los anuncios más amplios y prepárate para actualizar lo antes posible. Si no hay ningún parche disponible para una biblioteca o aplicación que pueda verse afectada, recomendamos desactivar la decodificación de Brotli hasta que los parches estén disponibles.

Actualización a las 16:12 h (hora del Pacífico):
Ya hay parches disponibles para libbrotli, Python, C++, NodeJS y bun; y están por llegar más para Envoy y otros. Apache y Nginx no decodifican Brotli de forma predeterminada.

Actualización a las 16:15 h (hora del Pacífico): OpenAIinforma de que descubrió esta vulnerabilidad en febrero. Aunque el problema de fondo se solucionó en el código fuente de Brotli en ese momento, no se sabía que daba lugar a una vulnerabilidad de seguridad. Consulta aquí los avisos de OpenAI.
‍

¿Qué es Brotli?

Brotli es un algoritmo de compresión sin pérdidas y un formato de datos desarrollado por Google. Consiste en una forma de reducir el tamaño de los datos para su almacenamiento o para enviarlos por Internet. Posteriormente, el software los descomprime para recuperar los datos originales. Se utiliza ampliamente para la compresión HTTP, con el fin de comprimir contenidos web como HTML, CSS y JavaScript.

¿Qué es CVE-2026-111497?

CVE-2026-111497 es una escritura fuera de límites en el decodificador Brotli de Google que afecta a las versiones 1.0.3 a 1.2.0 en todas las plataformas. Se trata de la misma vulnerabilidad del decodificador Brotli que está detrás de Node2Shell, anunciada hace un par de días. Un atacante remoto y sin autenticar puede enviar un flujo comprimido con Brotli especialmente manipulado para corromper la memoria, filtrar datos confidenciales, bloquear el proceso o, potencialmente, ejecutar código arbitrario. Tiene una puntuación CVSS v4.0 de 9,2 (crítica), y Node.js se ve afectado a través de su biblioteca Brotli integrada.

Un error hace que el decodificador Brotli siga aceptando más bytes cuando debería rechazar los datos. Esos bytes pueden provocar un desbordamiento en un pequeño búfer de trabajo y dañar la memoria del programa. Un atacante puede aprovechar ese daño para controlar lo que se ejecuta, como, por ejemplo, su propio código.

OpenAI detectó este problema en febrero y lo notificó como una vulnerabilidad de ejecución remota de código sin autenticación que funciona en ambos sentidos, por lo que un cliente malintencionado puede tomar el control de un servidor sin parches y un servidor malintencionado puede tomar el control de un cliente sin parches que acepte respuestas comprimidas.

La causa principal se corrigió en el código fuente de Brotli en febrero, pero en aquel momento no se consideró un problema de seguridad y, hasta ahora, ninguna versión se había lanzado con la corrección. Esto significa que todos los proyectos que incluyen Brotli deben lanzar su propia actualización. 

‍Estásexpuesto si en cualquier entorno tienes instalado Brotli 1.2.0 o una versión anterior, o bien brotlicffi 1.2.0.x, ya que los clientes HTTP como requests, httpx y aiohttp cargan estos paquetes automáticamente cuando están presentes. Actualiza a Brotli 1.2.1 o brotlicffi 1.2.1.0 y vuelve a compilar cualquier imagen de contenedor que los incluya. A fecha de 23 de octubre, las bases de datos de alertas de seguridad no asocian el CVE a ninguno de los paquetes de PyPI, por lo que pip-audit, Dependabot y Safety aún no señalarán las versiones vulnerables.

‍Puedesver lo que hemos recopilado aquí, en Aikido Intel. 

En cuanto al software no afectado, la configuración estándar de Apache mod_brotli no descodifica Brotli

Cómo aplicar el parche para la vulnerabilidad HTTP2Shell CVE-2026-111497

Para la vulnerabilidad CVE-2026-111497, actualiza el entorno de ejecución o la biblioteca Brotli afectados:

  • Node.js: actualiza a la versión 22.23.4, 24.22.1 o 26.12.1, o a una versión más reciente compatible dentro de la línea de versiones correspondiente.
  • Brotli nativo / libbrotli: actualiza a la versión 1.2.1 o posterior. Para versiones anteriores, utiliza la versión parcheada 1.0.10 o 1.1.1.
  • Paquetes de Python: actualiza Brotli a la versión 1.2.1 o posterior y brotlicffi a la versión 1.2.1.0 o posterior, independientemente de dónde estén instalados.
  • curl / libcurl: actualiza su dependencia de Brotli a la versión 1.2.1, a una versión anterior parcheada o al paquete del proveedor con las correcciones de seguridad. Las copias incluidas en el paquete o enlazadas estáticamente requieren una nueva compilación de la aplicación.
  • Bun: actualiza a la versión 1.4.4 o posterior. Vuelve a compilar los ejecutables que incluyen Bun.
  • Envoy: actualiza a la versión 1.40.0, 1.39.3, 1.38.6 o 1.37.8, o a una versión más reciente de una rama compatible. La versión 1.36.12 también incluye la corrección, pero la rama 1.36 ya no es compatible.
  • Istio: la corrección está incluida en las versiones 1.29.9, 1.30.6 y 1.31.2. Utiliza una versión más reciente compatible en la línea correspondiente; la rama 1.29 ha llegado al final de su ciclo de vida.
  • Paquetes del sistema operativo: instala la actualización de seguridad del proveedor. Es posible que los proveedores apliquen la corrección a versiones anteriores sin modificar el número de versión del desarrollador original.
  • Otros servidores HTTP, proxies inversos, pasarelas de API y clientes HTTP: actualicen el entorno de ejecución afectado o la biblioteca Brotli que utilicen. En los casos en que Brotli esté integrado en el producto, instalen la versión del proveedor del producto que solucione explícitamente este CVE. En el caso de los servicios gestionados, confirmen la corrección con el proveedor.

Actualiza los bloqueos de dependencias, vuelve a compilar las aplicaciones y las imágenes de contenedor afectadas, vuelve a implementarlas y reinicia los servicios. Comprueba que las cargas de trabajo en ejecución utilicen los componentes parcheados.

Versiones corregidas, revisadas el 23 de octubre de 2026
Proyecto Estado del parche Versiones corregidas Notas
Node.js Hay un parche disponible 22.23.4 · 24.22.1 · 26.12.1 Utiliza una línea de liberación compatible.
Bun Hay un parche disponible 1.4.4 Incluye Brotli 1.2.1.
Enviado Hay un parche disponible 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 La versión 1.36.12 también incluye la corrección, pero la versión 1.36 ya no es compatible. Utiliza una rama compatible.
Istio Hay un parche disponible 1.29.9 · 1.30.6 · 1.31.2 La versión 1.29 ha llegado al final de su ciclo de vida, así que cambia a una versión compatible.
Google Brotli (fuente) Hay un parche disponible 1.0.10 · 1.1.1 · 1.2.1 Elige la versión estable para tu rama de la biblioteca.

Qué hacer si todavía no puedes actualizar

Estas soluciones provisionales reducen el riesgo mientras preparas la actualización:

  • Aplicaciones de Python: En los casos en los que la compatibilidad con Brotli sea opcional, desinstala tanto Brotli como brotlicffi de los entornos afectados. Elimina las dependencias adicionales, como httpx[brotli], y cualquier otro requisito que pudiera reinstalarlas; a continuación, vuelve a generar los bloqueos de dependencias y recompila o reinicia las cargas de trabajo. HTTPX, Requests y urllib3 conservan la compatibilidad con gzip y deflate sin estos paquetes opcionales. Sin embargo, un servidor que envíe Brotli de todos modos podría generar una respuesta ilegible o un error de aplicación; no se garantiza el cambio automático a una alternativa.
    • Al desinstalar ambos paquetes de Python y reiniciar las cargas de trabajo, se eliminan las rutas de decodificación que proporcionan dichos paquetes para los datos entrantes y salientes. No se eliminan los decodificadores Brotli independientes incluidos en otros entornos de ejecución, bibliotecas o productos.
  • Solicitudes HTTP entrantes: rechaza las solicitudes cuyo campo «Content-Encoding» incluya «br» en el proxy inverso, el equilibrador de carga o el middleware de la aplicación, antes de que cualquier decodificador vulnerable procese el cuerpo de la solicitud. Busca «br» sin distinguir entre mayúsculas y minúsculas, incluso dentro de las listas de codificaciones. 
  • Solicitudes HTTP salientes: elimina «br» de «Accept-Encoding». Además, desactiva la decodificación de respuestas Brotli o rechaza las respuestas cuyo campo «Content-Encoding» incluya «br» antes de que comience la decodificación. Asegúrate de que esta comprobación se realice antes del procesamiento automático del cuerpo de la respuesta; si se comprueba después de que el cliente haya descargado y decodificado la respuesta, ya será demasiado tarde.

No basta con cambiar únicamente el encabezado «Accept-Encoding»: un servidor malintencionado puede enviar una respuesta en formato Brotli independientemente de lo que indique el cliente, y urllib3 selecciona su decodificador a partir del encabezado «Content-Encoding» de la respuesta.

Mantén estas medidas de control en vigor hasta que se apliquen los parches a los componentes afectados y se verifique su funcionamiento. Revisa el alcance de las medidas a medida que los proveedores confirmen nuevos componentes afectados o vías de ataque.

Cómo ayuda el aikido con el CVE-2026-111497

Aikido detecta versiones vulnerables de Brotli y brotlicffi en tus repositorios, imágenes de contenedores y dependencias, incluso cuando se trata de dependencias transitivas. Tu panel de control muestra qué servicios siguen ejecutando una versión vulnerable, para que puedas actualizar primero aquellos que realizan llamadas a servidores externos o aceptan cuerpos de solicitud comprimidos. 

Una vez que hayas actualizado, Aikido comprueba si el error ha desaparecido.

La cronología

Brotli es una biblioteca de compresión de Google muy utilizada. El miércoles 22 de octubre, NodeJS dio a conocer el CVE-2026-111497, denominado «node2shell», en el que se puede provocar que un proceso de Node.js que descomprima datos Brotli controlados por un atacante suelte memoria o ejecute código arbitrario. Los usuarios quedaban expuestos si su aplicación o una biblioteca descomprimía datos Brotli maliciosos (por ejemplo, la función integrada `fetch()` o `body-parser`).

Al día siguiente, Python publicó una actualización de seguridad que corrige esa misma vulnerabilidad; los paquetes de Python también eran vulnerables a CVE-2026-111497. La vulnerabilidad de Brotli podría afectar a aún más lenguajes y aplicaciones de servicio, dada la amplia integración de la biblioteca en otras aplicaciones. Resulta que OpenAI ya la había detectado en febrero.

Detalles técnicos de CVE-2026-111497

La falla se encuentra en DecodeBlockTypeAndLength(), que gestiona los cambios de bloque, es decir, los puntos en los que un flujo Brotli cambia el árbol de Huffman que utiliza. En las versiones vulnerables, la función devuelve un valor booleano simple, y BROTLI_FALSE puede significar tanto «este flujo está mal formado» como «necesito más datos de entrada». Los usuarios que llaman a la función no pueden distinguir entre ambas posibilidades y, en la ruta rápida, el decodificador descarta por completo el valor devuelto.

Un flujo creado manualmente puede declarar un único tipo de bloque y, a continuación, agotar la longitud de dicho bloque, lo que obliga a realizar un cambio que no puede llevarse a cabo con éxito. En ese caso, el decodificador o bien indica que necesita más datos de entrada para un flujo que ya está completo, o bien continúa decodificando con el estado del bloque que ya tenía. Esta segunda opción da lugar a una escritura fuera de límites.

La corrección en el código fuente, commit 0ed4268 de google/brotli, hace que la función devuelva un código de error y añade un nuevo error: BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17). Ahora, la decodificación se detiene ante un error de formato tanto en la ruta segura como en la rápida. OSM comparó las distribuciones de código fuente de Brotli 1.2.0 y 1.2.1 y descubrió que la versión 1.2.1 solo difiere en el aumento de versión y en los cambios en el decodificador respecto a esa confirmación.

Vulnerabilidades de Brotli en bibliotecas de Python (CVE-2026-111497)

La vulnerabilidad de Brotli subyacente a Node2Shell (CVE-2026-111497) afecta a Python. Dos paquetes de PyPI, Brotli y brotlicffi, compilan el mismo decodificador de Brotli vulnerable que incluye Node.js. Se ha publicado un aviso oficial en GitHub. Brotli cuenta con 82,8 millones de descargas al mes.

Te ves afectado si cualquier entorno de Python que ejecutes tiene instalado Brotli 1.2.0 o una versión anterior, o bien brotlicffi 1.2.0.x. Los clientes HTTP más habituales, como requests y httpx, cargan estos paquetes automáticamente cuando están presentes. Algunos paquetes, como Scrapy, instalan Brotli automáticamente como dependencia, mientras que otros requieren que se especifique explícitamente. Un atacante puede acceder al decodificador vulnerable enviando una respuesta Brotli maliciosa a una solicitud que realice tu aplicación, o enviando a tu aplicación un cuerpo de solicitud comprimido con Brotli. Esto significa que una aplicación puede quedar expuesta sin necesidad de importar Brotli en ninguna parte de su propio código. Se trata de una dependencia transitiva muy extendida, así que comprueba tus sistemas.

Para solucionarlo, actualiza a las versiones corregidas:

  • Brotli -> 1.2.1
  • brotlicffi -> 1.2.1.0

Las notas de la versión de ambas versiones corregidas no mencionan el CVE. A fecha de 23 de octubre, las bases de datos de alertas aún no lo asocian con ninguno de los paquetes de PyPI, por lo que pip-audit, Dependabot y Safety no señalarán estas versiones.

¿A quién afecta la vulnerabilidad CVE-2026-111497 en Python?

Te afecta si alguno de tus entornos de Python tiene instalado alguno de estos paquetes:

PaqueteVersiones afectadasVersión corregida
Brotli (PyPI)1.2.0 y versiones anteriores1.2.1
brotlicffi (PyPI)1.2.0.x1.2.1.0

Tu código no tiene por qué importar ninguno de los dos paquetes. Estos clientes HTTP indican «Accept-Encoding: br» y descodifican automáticamente las respuestas Brotli:

  • urllib3 (y, por lo tanto, requests) cuando se tiene instalado Brotli o brotlicffi
  • httpx con el complemento Brotli
  • aiohttp cuando Brotli está instalado
  • Scrapy y cualquier aplicación basada en los clientes mencionados anteriormente

Los datos del atacante pueden llegar al decodificador por dos vías:

  • Solicitudes salientes. Tu aplicación recupera una respuesta Brotli de un servidor controlado por un atacante, por ejemplo, a través de un webhook, una vista previa de URL, un rastreador o la función «recoger esta URL».
  • Solicitudes entrantes. Tu marco de trabajo o middleware descodifica el cuerpo de una solicitud enviada con Content-Encoding: br, que es el equivalente en Python al caso «Express 5» de Node.js.

Cómo solucionar el vulnerabilidad CVE-2026-111497 en Python

La solución consiste en actualizar el paquete, y hay que seguir cuatro pasos:

  1. Actualiza el paquete que tengas instalado con el comando «pip install -U "Brotli>=1.2.1"» o «pip install -U "brotlicffi>=1.2.1.0"». Si utilizas un archivo de bloqueo con Poetry, uv o pip-tools, actualiza la restricción y vuelve a generar el archivo de bloqueo.
  2. Recompila tus imágenes de contenedor y cualquier «wheel» que incluya cualquiera de esos paquetes. Una imagen compilada a partir de una versión vulnerable seguirá siendo vulnerable hasta que la recompiles.
  3. Comprueba todos los entornos en los que ejecutas código, incluidos los portátiles, los servidores de integración continua, los servidores y los contenedores. Muchos proyectos incorporan Brotli a través de un complemento de cliente HTTP, así que revisa tu árbol completo de dependencias resueltas.
  4. Por ahora, confía en una comprobación manual. pip-audit, Dependabot y Safety no notificarán este problema hasta que las bases de datos de avisos asocien el CVE a los paquetes de PyPI.

Si tus bibliotecas Brotli para Python proceden de un paquete de una distribución de Linux en lugar de PyPI, la corrección se distribuye a través de tu distribución, así que consulta también su aviso de seguridad.

¿En qué consiste la vulnerabilidad de Brotli en Python (CVE-2026-111497)?

La vulnerabilidad de Brotli en Python hace referencia al CVE-2026-111497, el fallo del decodificador de Brotli conocido como Node2Shell, ya que afecta a los paquetes de Python disponibles en PyPI. El registro CVE asocia el CWE-252 (valor de retorno no comprobado) con el CWE-787 (escritura fuera de límites).

¿Qué gravedad tiene la vulnerabilidad CVE-2026-111497 en Python? ¿Se está aprovechando?

El registro CVE asigna a esta vulnerabilidad una puntuación CVSS 4.0 de 9,2, y Node.js la clasifica como de gravedad alta. OSM compiló las versiones 1.2.0 y 1.2.1 de Brotli con AddressSanitizer y ejecutó un flujo manipulado en ambas. La versión 1.2.0 consumió la totalidad del flujo, de aproximadamente 23 MB, y siguió indicando que necesitaba más datos de entrada, tanto si el flujo llegaba de una sola pieza como en fragmentos de tan solo un byte. La versión 1.2.1 rechazó el flujo con el error -17 en todas las ocasiones.

OSM no investigó la corrupción de memoria ni la ejecución de código en la extensión de Python. El código del decodificador es el mismo que los investigadores utilizaron para explotar una versión no modificada de Node.js 24.22.0, tal y como Imperva informaron, entre otros. En cuanto a Node.js, The Hacker News informó de que, a fecha de 22 de octubre, no se había detectado ningún caso de explotación en la red.

De todos modos, trátalo como algo urgente. El error es una falla de seguridad de memoria en un componente que gestiona entradas de red no fiables, y la solución consiste en una simple actualización de la versión. Los servicios que llaman a servidores externos o aceptan cuerpos de solicitud comprimidos deben ser los primeros en actualizarse.

Cómo comprobar si tu aplicación de Python está expuesta

  1. Check installed versions with pip show Brotli brotlicffi in each environment, and with docker run --rm <image> pip show Brotli brotlicffi for each container image.
  2. Averigua qué paquetes lo incluyen. Ejecuta «pipdeptree -r -p Brotli» para ver qué dependencias lo requieren y busca en tus archivos de bloqueo con «grep -i brotli poetry.lock uv.lock requirements*.txt».
  3. Enumera las llamadas HTTP salientes que se dirigen a servidores que no controlas, así como cualquier punto final que descodifique los cuerpos de solicitud con el encabezado «Content-Encoding: br».
  4. Actualiza primero los servicios que corresponden al paso 3 y, después, el resto.

Si reproduces el error desde Python, la función `brotli.decompress()` genera un error genérico de tipo `brotli.error: decoder failed` ante cualquier error, por lo que no es posible saber qué código de error se ha activado. Un objeto `Decompressor()` al que se le introduzca el flujo manipulado de forma incremental nunca terminará en la versión 1.2.0.

Preguntas frecuentes

‍¿Qué versiones corrigen el CVE-2026-111497 en Python?

Brotli 1.2.1 y brotlicffi 1.2.1.0, así como cualquier versión posterior.

¿Tengo que importar Brotli en mi código para que me afecte?

Basta con tener instalado un paquete. urllib3, requests, httpx y aiohttp utilizan Brotli o brotlicffi automáticamente cuando alguno de ellos está presente y descodifican las respuestas Brotli de cualquier servidor al que acceda tu aplicación.

¿Lo detectará pip-audit o Dependabot ?

Todavía no. A fecha de 23 de octubre, ni el registro CVE, ni el OSV, ni la base de datos de avisos de GitHub incluyen ninguno de los dos paquetes de PyPI. OSM está enviando entradas a PYSEC y una correspondencia de paquetes de PyPI para el aviso de GitHub, con el fin de que las herramientas lo detecten.

¿Hay alguna solución alternativa?

Al desinstalar Brotli y brotlicffi se elimina el decodificador vulnerable, y los clientes HTTP recurren a gzip y deflate. Rechazar las solicitudes codificadas con Brotli en el perímetro reduce la exposición entrante, pero no protege contra las respuestas Brotli que tu aplicación recaba.

Compartir:

https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497

Comprueba si hay vulnerabilidades

Empezar ahora
4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Consigue seguridad hoy mismo,
de forma rápida y gratuita.

Protege tu código, cloud y runtime en un sistema centralizado.
Conecta un repositorio para descubrir qué encuentran los agentes de razonamiento en tu base de código.

No se requiere tarjeta de crédito | Resultados del análisis en 32 segundos.
Con la confianza de más de 150k organizaciones