Una entrada Brotli manipulada permite ejecutar código en una compilación estándar de Node.js 24, según Imperva

Imperva demuestra en laboratorio que datos Brotli manipulados pueden ejecutar código en una compilación estándar de Node.js tras varios intentos.

Añade CyberWorldOpsa tus fuentes preferidas en Google
Una entrada Brotli manipulada permite ejecutar código en una compilación estándar de Node.js 24, según Imperva
Vulnerabilidades

Imagen ilustrativa generada con IA

Los investigadores de Imperva han demostrado que datos Brotli malformados pueden derivar en la ejecución de código controlado por un atacante en una compilación normal y sin modificar de Node.js. Es un paso más allá de experimentos anteriores, que solo funcionaban en un binario de prueba debilitado deliberadamente.

La prueba de concepto, llamada «Node2Shell», aprovecha CVE-2026-111497, un defecto en el decodificador Brotli que viene integrado en el runtime. Node.js reveló el fallo y publicó las correcciones el 21 de octubre de 2026.

En el laboratorio de Imperva, la carga útil se ejecutó con la imagen oficial 24.22.0 de Node.js para Linux arm64. No se recompiló nada ni se adjuntó ningún depurador: la única entrada fueron datos Brotli manipulados que se pasaron al decodificador incluido. El resultado no fue constante: la ejecución de código llegó tras varios intentos. Imperva trabajó con una sola compilación y una sola configuración de aplicación, y no examinó otras arquitecturas de procesador ni las ramas 22.x y 26.x. Al proporcionar esos mismos datos a 24.22.1, la versión corregida, fueron rechazados y no se ejecutó nada.

La primera prueba de concepto pública solo había logrado ejecutar código en una compilación modificada intencionadamente para facilitar el disparo del fallo. En una compilación normal, su autor informó de un fallo y de una lectura parcial de la memoria del proceso, en lugar de ejecución de código, y reconoció que allí no se había conseguido un ataque funcional.

Hasta el 22 de octubre no se había informado de explotación del fallo en ataques reales, según The Hacker News.

Dos rutas hacia el decodificador

Como el decodificador vulnerable forma parte de Node.js, la exposición abarca las aplicaciones de las ramas 22.x, 24.x y 26.x, no solo la versión probada por Imperva. El tráfico puede llegar al decodificador desde cualquiera de los dos sentidos de un intercambio HTTP: el fetch() integrado de Node.js al descomprimir una respuesta codificada en Brotli procedente de otro servidor, o un middleware que descomprime el cuerpo de una petición codificada en Brotli.

En Express 5, los parsers express.json(), express.urlencoded(), express.text() y express.raw() procesan cuerpos de petición Brotli —como ya hacían con gzip y deflate— una vez asociados a una ruta. Un servidor HTTP básico de Node.js no descodifica un cuerpo Brotli solo porque llegue uno; para eso hace falta ese middleware o una llamada explícita.

Imperva reprodujo la ejecución por ambas rutas, cuerpo de petición y respuesta. Sus pruebas fijaron versiones dentro de los rangos Express 5.0.0–5.3.0 y body-parser 2.0.0–2.3.0, en lugar de cubrir todas las versiones de esos rangos.

Un cambio de bloque que el formato prohíbe

El desencadenante está en cómo reacciona el decodificador ante un estado que un flujo Brotli válido no puede alcanzar. Un flujo declara los tipos de bloque que usará a medida que avanza la descompresión, y la entrada de Imperva llegó a un cambio de bloque que la propia estructura del flujo descarta. En lugar de rechazar el flujo, el decodificador interpretó la condición como una petición de más datos de entrada y siguió en un estado no válido.

Una ejecución aparte con un sanitizador de memoria mostró la consecuencia: una escritura más allá del final del búfer previsto, que es la corrupción de memoria que subyace al fallo. Node.js lo corrigió importando un parche upstream de Brotli que hace que el decodificador se detenga con un error de formato en ese punto.

El registro CVE describe el defecto como un desbordamiento de búfer en el archivo de código fuente del decodificador c/dec/decode.c, que afecta a Google Brotli de la 1.0.3 a la 1.2.0 en todas las plataformas. Según ese registro, un flujo comprimido manipulado permite a un atacante remoto no autenticado corromper la memoria de estado adyacente del decodificador, revelar contenido sensible de memoria, provocar una denegación de servicio o, potencialmente, ejecutar código arbitrario. El registro indica a los usuarios de la biblioteca que actualicen a la versión 1.0.10, 1.1.1 o 1.2.1.

Parcheo y artefactos que un inventario puede pasar por alto

La solución es migrar a una versión parcheada de Node.js. Como los binarios de Node suelen integrarse en imágenes de contenedor y otros artefactos de compilación, un inventario de dependencias puede pasarlos por alto. Las ramas 20.x y anteriores han llegado al fin de su vida útil y no recibirán la corrección, así que las aplicaciones que las usen deben migrar a una rama con soporte.

El aviso de Node.js no recoge ninguna mitigación dentro del runtime, de modo que las aplicaciones que no pueden actualizar de inmediato no tienen una alternativa. Imperva recomendó limitar el tráfico Brotli no confiable en las rutas afectadas cuando sea práctico, subrayando que solo una actualización elimina el fallo. La empresa dijo que añadió reglas de cortafuegos de aplicaciones web y que las probó contra los ataques que reprodujo.

Vercel, que ejecuta cargas de trabajo de Node.js para sus clientes, indicó que el 21 de octubre introdujo reglas que bloquean el ataque en las peticiones entrantes. Esas reglas no cubren las respuestas Brotli que una aplicación obtiene de otros servidores, y no sustituyen la actualización.

Lee también

Fuentes

Este artículo es una reelaboración original basada en las siguientes fuentes.

CVE tratadas en este artículo

Volver al inicio

Últimas noticias de ciberseguridad

Todas las noticias de ciberseguridad →