Fallo en el decodificador Brotli desencadena RCE en Node.js y afecta a Bun, Python y otro software

Una vulnerabilidad de corrupción de memoria en el decodificador Brotli de Google está presente en múltiples programas que descomprimen datos Brotli, incluyendo Bun, los paquetes de Python Brotli y brotlicffi, y proxies Envoy configurados para descompresión Brotli.

Identificada como CVE-2026-111497, la falla permite que datos comprimidos maliciosos sobrescriban el búfer y corrompan la memoria del programa, lo que puede provocar un bloqueo, una fuga de memoria o la ejecución de código controlado por el atacante.

Investigadores de Imperva han demostrado que el código puede ejecutarse en una compilación de Node.js sin parchear. No se ha demostrado lo mismo en el resto de programas afectados y no se han reportado ataques en el mundo real.

La falla se reveló por primera vez el 21 de octubre, cuando Node.js y Google publicaron parches, y desde entonces han seguido más actualizaciones producto por producto. Dado que el error está en el decodificador de Google y cada programa incluye su propia copia, cada uno debe actualizarla de forma independiente.

Brotli es un formato de compresión de Google utilizado en la web para reducir el tamaño de páginas y otro tráfico. El error está en el código C que descomprime un flujo Brotli, por lo que se propaga a cualquier software que reutilice ese código, desde entornos de ejecución de lenguajes hasta proxies y paquetes de Python.

Software afectado

Un programa está expuesto solo si decodifica datos Brotli controlados por terceros. En Node.js y Bun, esto ocurre cuando la función fetch() integrada lee una respuesta enviada con Content-Encoding: br, o cuando el código de manejo del cuerpo de la solicitud, como Express 5 y body-parser 2, descomprime una carga Brotli. Un servidor HTTP simple de Node.js no decodifica los cuerpos de las solicitudes por sí solo.

Envoy e Istio se ven afectados solo cuando la descompresión Brotli está habilitada, por ejemplo, mediante un filtro de Envoy. Donde está desactivada, la falla no es accesible.

En Python, el riesgo proviene de tener instalado el paquete Brotli o brotlicffi. Una vez presente cualquiera de los dos, clientes HTTP como requests, urllib3, httpx y aiohttp decodifican respuestas Brotli por su cuenta, por lo que una aplicación puede quedar expuesta sin siquiera importar Brotli en su propio código.

Un firewall de aplicaciones web ayuda solo parcialmente. Vercel, que añadió reglas de firewall el día de la divulgación, dijo que esas reglas no cubren "las respuestas que sus funciones obtienen de otros servidores". Para esa ruta, solo actualizar el entorno de ejecución o la biblioteca cierra la brecha.

El alcance de la falla depende del software. El Red Team de Imperva, que llama a su trabajo Node2Shell, ejecutó código proporcionado por el atacante en una compilación de Node.js 24.22.0 para Linux en ARM64 sin modificar, entregándolo tanto como respuesta obtenida como cuerpo de una solicitud Express. El exploit requirió varios intentos, no se ha publicado y no se probó en otras compilaciones.

OpenAI, cuyo equipo Codex Security reportó la falla, la describe como una vulnerabilidad que permite ejecución remota de código no autenticada en Brotli y enumera Node.js, Bun y Envoy como software afectado. En su informe, la falla funciona en ambos sentidos:

un servidor sin parchear que acepta entrada comprimida podría ser tomado por un cliente malicioso, y un cliente sin parchear que acepta entrada comprimida (como "curl –compressed") podría ser tomado por un servidor malicioso.

No se ha reportado explotación en la naturaleza. La evaluación de CISA del 23 de octubre registró la explotación como "ninguna" y la automatización como "no", y Red Hat afirmó que no existe una prueba de concepto pública confiable para la ejecución de código.

Las calificaciones de gravedad varían según quién las asigne. Google, que asignó el CVE, la califica con 9.2, o crítica, en la escala CVSS 4.0. Node.js la considera alta, y Red Hat la califica con 8.1, o importante.

La solución tiene una historia inusual. El cambio que cierra la falla se añadió al código fuente de Brotli el 27 de febrero, pero ninguna nueva versión de Brotli lo incluyó hasta el 21 de octubre. OpenAI dijo que la causa raíz "en realidad se corrigió en el código fuente de Brotli en febrero, pero en ese momento no se sabía que daba lugar a una vulnerabilidad de seguridad y no hubo una versión más reciente de Brotli".

Node.js atribuye el reporte de la falla a Khai Tran y Sylvie Mayer del equipo Codex Security de OpenAI, y la corrección a los mantenedores Matteo Collina y Antoine du Hamel.

Qué hacer ahora

Actualice a una versión corregida de la tabla anterior, luego reinicie el servicio y reconstruya cualquier imagen de contenedor, ya que un proceso en ejecución mantiene el decodificador antiguo hasta que se reinicia.

Donde no pueda actualizar aún, deje de decodificar Brotli no confiable. La página de divulgación de OpenAI y la firma de seguridad Aikido recomiendan:

  • Rechazar solicitudes entrantes con Content-Encoding: br antes de que cualquier proxy o analizador decodifique el cuerpo.
  • Desactivar la decodificación automática de Brotli en los clientes HTTP y rechazar las respuestas Brotli antes de que se decodifiquen.
  • En Python, desinstalar los paquetes Brotli y brotlicffi para que los clientes recurran a gzip y deflate.

Eliminar br del encabezado Accept-Encoding no ayuda por sí solo, porque un servidor puede enviar Brotli independientemente de lo que pida el cliente. Para Node.js, no se ha publicado ningún workaround, por lo que actualizar el entorno de ejecución es la única solución.

Los paquetes del sistema se están corrigiendo en diferentes momentos. Debian corrigió su paquete brotli para Debian 13 (trixie) el 23 de octubre en la versión 1.1.0-2+deb13u1. Amazon Linux 2023 todavía listaba sus paquetes brotli y Node.js 24 como pendientes de corrección a fecha del 22 de octubre.

Es posible que los escáneres de dependencias aún no marquen los paquetes de Python. El registro del CVE nombra el repositorio Brotli de Google, no los paquetes de PyPI, y el aviso de GitHub todavía no lista ningún paquete afectado, que es lo que lee Dependabot. Las entradas de aviso para los dos paquetes de Python, PYSEC-2026-4322 y PYSEC-2026-4323, se añadieron el 23 de octubre, así que verifique manualmente las versiones instaladas tambié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 *