Ocho bytes y un decodificador que pedía más

El proyecto Node.js publicó versiones de seguridad para sus ramas 26.x, 24.x y 22.x el 21 de octubre, como 26.12.1, 24.22.1 y 22.23.4. Se corrigen diez CVE, cuatro de ellos de gravedad alta. Las versiones que ya han llegado al final de su vida también están afectadas.

El que lleva el nombre de un laboratorio de IA es CVE-2026-111497, una escritura fuera de límites en el decodificador Brotli incorporado. Node.js acredita a OpenAI Codex Security, y nombra a Khai Tran y Sylvie Mayer como quienes lo notificaron, con Matteo Collina y Antoine du Hamel como autores de la corrección.

El mecanismo es un error mal clasificado. El decodificador trataba un cambio de bloque inválido como una necesidad temporal de más entrada y no como un error permanente de formato. El decodificador de flujo seguía entonces añadiendo bytes de entrada a un búfer interno de ocho bytes y escribía más allá de su final. Cualquier aplicación que descomprima mediante node:zlib datos Brotli suministrados por un atacante puede ver corrompida la memoria de su proceso, y Node.js sitúa el impacto entre una caída, la revelación de memoria y la ejecución remota de código.

Un monitor de ordenador con la pantalla en blanco sobre un escritorio
El decodificador Brotli escribió más allá del final de un búfer interno de ocho bytes. Foto ilustrativa. Cup of Couple · pexels · Pexels License

Cuatro correcciones de cosas ya corregidas

El detalle más incómodo de esta tanda es cuántas entradas son segundos intentos. CVE-2026-105482, en el que dns.resolve*() y dns.reverse() truncan nombres que contienen un byte NUL, lo describe el proyecto como una corrección incompleta de CVE-2026-48930. CVE-2026-105481, donde los sockets de keep-alive aceptan una respuesta recibida antes de enviarse la petición, es una corrección incompleta de CVE-2026-48931. CVE-2026-106073, en el que fs.realpathSync() se salta las comprobaciones de permiso de lectura bajo --permission, es una corrección incompleta de CVE-2026-21715. CVE-2026-105483 se describe como una regresión posterior a CVE-2026-48618.

Esta última es la más clara: tls.checkServerIdentity() no reconoce direcciones IP con dígitos de ancho completo como 127.0.0.1, así que un certificado que solo lleve nombres alternativos DNS puede casar con una. Otras dos entradas atacan la misma costura desde ángulos distintos. CVE-2026-106069 cubre los anfitriones IPv4 con ceros a la izquierda, como 0127.0.0.1, que el analizador de URL de WHATWG lee como octal mientras el resolutor del sistema operativo en algunas plataformas lee como decimal, de modo que el certificado se valida contra una dirección distinta de aquella a la que se conecta. CVE-2026-106072 extiende eso a otras grafías no canónicas: 0177.0.0.1, 0x7f.0.0.1, 2130706433, 127.1.

La que se repite a sí misma

CVE-2026-106074 es de gravedad media y la más extraña del conjunto. Las cachés que hay detrás de crypto.randomUUID(), randomUUIDv7() y randomInt() se guardan en las instantáneas de arranque y en las aplicaciones de ejecutable único. Todo proceso iniciado desde una instantánea así repite después los mismos valores. Cualquier cosa que tratara un identificador generado como imposible de adivinar —un testigo de sesión, un enlace de restablecimiento de contraseña, una clave de idempotencia— estaría reutilizando una secuencia que un atacante podría observar una vez y predecir a partir de ahí.

Una pila de discos duros en un estante
Los identificadores de generadores en caché se repiten en todo proceso iniciado desde una instantánea. Foto ilustrativa. Marta Branco · pexels · Pexels License

Dos entradas de gravedad baja afectan solo a 26.x: zlib.ZipFile, que devuelve bytes controlados por el atacante tras una validación de cabecera fallida, con lo que un escáner puede aprobar un contenido distinto del que extraen otras herramientas ZIP, y una regla comodín --allow-fs-read/--allow-fs-write que casa con rutas más cortas, donde /etc/passwd.* concede también /etc/passwd.

Qué vigilar

La tanda actualiza además dependencias incorporadas: c-ares, OpenSSL, SQLite y Undici en las ramas afectadas, más una actualización del paquete de autoridades de certificación ligada al compromiso de una CA intermedia de eMudhra. Ese último punto es un problema de confianza aparte que viaja dentro de un parche rutinario, y quien siga solo identificadores CVE no lo verá.

El patrón que conviene seguir es la tasa de correcciones repetidas. Cuatro correcciones incompletas y una regresión en una sola tanda apuntan a una clase de errores —el análisis de direcciones IP, en particular— en la que cada parche deja sin tratar una grafía vecina, y donde el próximo hallazgo se parecerá bastante al anterior.