Investigadores demuestran ejecución remota de código en Node.js mediante datos Brotli manipulados

Investigadores de seguridad de Imperva han demostrado que datos Brotli maliciosos pueden hacer que una aplicación sobre una compilación oficial de Node.js ejecute código proporcionado por el atacante. Su prueba de concepto, denominada "Node2Shell", logró ejecutar código en la imagen oficial de Node.js 24.22.0 para Linux arm64, sin depurador ni compilación personalizada, al introducir datos manipulados en el decodificador Brotli incluido (CVE-2026-111497). Node.js divulgó la vulnerabilidad y publicó las correcciones el 21 de octubre, por lo que las aplicaciones que decodifican datos Brotli no confiables deben actualizarse.

La prueba de Imperva no tuvo éxito en todos los intentos y la ejecución de código requirió varios intentos en su configuración Linux arm64. El resultado se limita a esa compilación y configuración de aplicación; no se probaron otras arquitecturas ni las líneas 22.x y 26.x. En la versión corregida, 24.22.1, los mismos datos fueron rechazados y no se ejecutó código.

Esta demostración va más allá de la primera prueba de concepto pública, que solo logró ejecución de código en una compilación de prueba deliberadamente debilitada. En una compilación estándar, el autor de esa prueba reportó un fallo y una lectura limitada de la memoria del proceso, no ejecución de código, y afirmó que no se logró un ataque funcional en una compilación normal. Hasta el 22 de octubre no se ha reportado explotación de la vulnerabilidad en el mundo real.

Aplicaciones afectadas

El fallo está en el decodificador Brotli que Node.js incluye, por lo que afecta a aplicaciones en las líneas 22.x, 24.x y 26.x, no solo a la compilación que probó Imperva. Un servicio llega a ese decodificador desde cualquiera de los dos lados de un intercambio HTTP: cuando lee una respuesta comprimida con Brotli a través de la función fetch() integrada de Node.js, o cuando un middleware decodifica un cuerpo de solicitud comprimido con Brotli.

Los analizadores de cuerpo de Express 5, como express.json(), express.urlencoded(), express.text() y express.raw(), ahora decodifican cuerpos de solicitud Brotli cuando se aplican a una ruta, junto con gzip y deflate. Un servidor HTTP simple de Node.js no decodifica un cuerpo de solicitud Brotli solo por recibirlo, por lo que la decodificación requiere ese middleware o una llamada explícita.

Imperva reprodujo la ejecución de código tanto por la vía del cuerpo de la solicitud como por la de la respuesta, probando Express 5.0.0 a 5.3.0 y body-parser 2.0.0 a 2.3.0 en versiones fijas, y no probó todas las versiones intermedias.

Cómo funciona el fallo

Imperva rastreó la causa hasta cómo el decodificador maneja un punto imposible en un flujo Brotli: el flujo anuncia los tipos de bloque que utilizará a medida que avanza la decodificación, y la entrada de prueba alcanzó un cambio de bloque que la propia estructura del flujo descartaba. El decodificador vulnerable interpretó eso como una solicitud de más entrada y continuó en un estado inválido.

En una prueba separada con un sanitizador de memoria, continuar desde ese estado escribió más allá de un búfer previsto, la escritura fuera de límites que subyace al fallo. Node.js corrigió la vulnerabilidad importando un parche upstream de Brotli que hace que el decodificador se detenga con un error de formato en ese punto en lugar de continuar.

Qué hacer

La solución es pasar a una versión parcheada. La actualización debe llegar a las imágenes de contenedor y otros artefactos que incluyen un binario de Node, que un inventario de paquetes puede pasar por alto. Las líneas 20.x y anteriores, al final de su vida útil, no reciben la corrección y deben migrarse a una línea soportada.

El aviso no enumera ningún workaround dentro de Node.js, por lo que una aplicación que no pueda actualizarse de inmediato no tiene alternativa en el runtime. Imperva sugirió limitar el tráfico Brotli no confiable en las rutas afectadas cuando sea práctico, y afirmó que solo la actualización elimina el fallo. La compañía también añadió reglas a su propio firewall de aplicaciones web y las probó contra los ataques que reprodujo.

Vercel, que ejecuta Node.js para sus clientes, dijo que añadió reglas el 21 de octubre que bloquean el ataque en solicitudes entrantes. Las reglas no cubren las respuestas Brotli que una aplicación obtiene de otros servidores y no sustituyen a la actualización.

Cybersecurity
Cybersecurity
Cybersecurity
Cybersecurity

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *