Vulnerabilidad en el decodificador Brotli de Node.js podría permitir ejecución remota de código en todas las versiones soportadas

El proyecto Node.js liberó el 21 de octubre parches de seguridad para sus tres ramas activas (22.x, 24.x y 26.x) que subsanan diez vulnerabilidades. La más peligrosa reside en el código de descompresión Brotli integrado en Node.js y, según sus responsables, podría habilitar la ejecución remota de código, es decir, que un atacante consiga ejecutar instrucciones propias en el sistema afectado.

Las versiones corregidas son 22.23.4 y 24.22.1 en las líneas de soporte a largo plazo, y 26.12.1 en la rama actual. La serie 20.x y anteriores han llegado al final de su ciclo de vida y no recibirán el parche, por lo que se aconseja migrar a una versión soportada.

El fallo de Brotli afecta al código que Node.js incorpora, no al programa del usuario. Node.js ejecuta ese código cada vez que descomprime datos Brotli, ya sea directamente mediante el módulo node:zlib o de forma automática cuando el código llama a fetch() sobre una respuesta enviada con compresión Brotli. Una aplicación queda expuesta cuando descomprime datos Brotli controlados por un atacante, como el cuerpo de una solicitud o una respuesta obtenida de otro servidor.

El fallo de Brotli

La vulnerabilidad es una escritura fuera de los límites en el decodificador Brotli, provocada por una entrada comprimida malformada. La solución es un parche del proyecto Brotli que Node.js ha incorporado y que hace que el decodificador detecte la entrada inválida y se detenga antes, en lugar de escribir más allá del búfer.

Brotli es la biblioteca de compresión de Google, y Node.js incluye su propia copia. El mismo parche se publicó en Brotli 1.2.1, 1.1.1 y 1.0.10 el 21 de octubre, por lo que otro software que incluya Brotli podría necesitar la misma actualización. El cambio se introdujo por primera vez en el código fuente de Brotli en febrero de 2026 y se distribuyó como versión de seguridad solo en octubre.

La descripción de "ejecución remota de código" es la que da el proyecto sobre lo que podría permitir el fallo, y se ha calificado como de gravedad alta, no crítica. El alcance demostrado en la práctica es más limitado.

Una prueba de concepto pública publicada el 22 de octubre solo logró ejecución de código contra una compilación de prueba deliberadamente debilitada. En una compilación estándar de Node.js, su autor informó de un fallo y una lectura limitada de la memoria del proceso, no de ejecución de código, y afirmó que no se logró un ataque funcional en una compilación normal.

Node.js parcheado rechaza la entrada malformada que utiliza la prueba de concepto, y no se ha informado de explotación del fallo en el mundo real hasta el 22 de octubre.

Los otros fallos

Tres de las otras correcciones también se han calificado como de gravedad alta. Dos son comprobaciones de certificados TLS que un atacante podría eludir escribiendo la dirección IP de un servidor de forma inusual, de modo que un certificado coincida con un host que no debería (CVE-2026-106069 y CVE-2026-105483). La tercera evita que dns.resolve trunque un nombre de host en un byte nulo incrustado (CVE-2026-105482). Node.js califica CVE-2026-105483 como alta, aunque el commit que lo corrigió describe el error como de baja gravedad y difícil de explotar.

El resto son de gravedad media y baja. Un fallo de gravedad media hace que crypto.randomUUID() y crypto.randomInt() devuelvan los mismos valores en todos los procesos cuando una aplicación se compila como una instantánea de inicio o una aplicación ejecutable única (CVE-2026-106074), lo que socava cualquier cosa que dependa de que esos valores sean impredecibles. A continuación se muestra el conjunto completo y las líneas afectadas por cada uno:

El bloqueo de certificados de eMudhra

Las mismas actualizaciones también impiden que Node.js confíe en ocho claves de certificados de autoridad intermedias del proveedor indio eMudhra que se informó que habían sido comprometidas días antes. Node.js utiliza la lista de certificados raíz de Mozilla pero no realiza comprobaciones de revocación por defecto, por lo que antes de esta actualización una cadena de certificados construida sobre una de las claves comprometidas seguía siendo válida.

Las versiones añaden un bloqueo integrado para las ocho claves y actualizan la lista de raíces incluidas para eliminar tres raíces emSign. Go aplicó el mismo bloqueo en su propia actualización el 20 de octubre. Las conexiones reanudadas desde una sesión iniciada antes de la actualización no se vuelven a comprobar hasta que esa sesión expire, y las líneas al final de su vida útil no reciben el bloqueo.

Dependencias actualizadas

Además de los 10 fallos, las actualizaciones renuevan varios componentes incluidos. La copia de undici, el cliente HTTP detrás de fetch(), pasa a una versión que corrige tres avisos de gravedad moderada: uno en su comprobación de integridad de subrecursos y dos fallos de agotamiento de memoria, uno de ellos en el cliente WebSocket integrado en Node.js.

Node.js también actualizó su c-ares incluido en todas las líneas, OpenSSL en 22.x y 24.x, y SQLite en 22.x, para incluir correcciones de vulnerabilidades conocidas públicamente.

Si no puede actualizar todavía

Actualizar es la solución. El aviso no ofrece ningún workaround temporal para el fallo de Brotli, por lo que una aplicación que no pueda actualizarse inmediatamente no tiene alternativa dentro de Node.js. Vercel, que ejecuta Node.js para sus clientes, dijo que añadió reglas de firewall 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 *