Node.js corrigió 16 vulnerabilidades en sus ramas 22.x, 24.x y 26.x, incluidas varias que permiten a clientes sin autenticación tumbar servidores HTTP/2 o hacer que expongan memoria de otras conexiones. Los parches se publicaron el 11 de noviembre en las versiones 22.23.5, 24.22.3 y 26.13.1.
El Proyecto Node.js publicó las actualizaciones de seguridad para las tres ramas activas. La distribución de vulnerabilidades por rama no es uniforme: la lista afecta a las ramas 24.x y 26.x en sus 16 entradas, mientras que la 22.x queda afectada por 11, según el desglose publicado por 窓の杜. La gravedad se reparte en siete fallos altos, seis medios y tres bajos.
La mayor concentración está en el código de servidores HTTP/2, HTTPS y TLS que incorpora Node.js. El riesgo depende de cómo esté construido el servidor: algunos fallos se activan con una configuración por defecto, mientras que otros requieren rutas, callbacks o métodos concretos. Los parches también actualizan dependencias como llhttp, undici y SQLite.
HTTP/2: desde el cierre del proceso hasta la fuga de respuestas
CVE-2026-123863 permite a un cliente no autenticado provocar el cierre del proceso mediante un servidor HTTP/2 predeterminado. Basta con que el servidor responda antes de recibir el cuerpo completo de la solicitud, un comportamiento que el proyecto describe como habitual. El ataque funciona tanto sobre TLS como sobre conexiones sin cifrar y afecta a las ramas 24.x y 26.x.
El problema aparece al cerrar una sesión HTTP/2: un flujo puede conservar buffers de cabeceras asignados por nghttp2 después de quedar fuera del conjunto de flujos de la sesión. Cuando se destruye la sesión, una comprobación interna detecta que la memoria contabilizada no es cero y termina el proceso. El proyecto lo identifica como una variante de CVE-2024-27983, cuya corrección anterior no cubría este caso.
Otra vulnerabilidad alta, CVE-2026-123865, deja memoria y descriptores de archivo retenidos indefinidamente. El atacante puede iniciar el cierre remoto con un mensaje GOAWAY(NO_ERROR) y provocar después un error de protocolo, por ejemplo con una cabecera de trama demasiado grande. La sesión queda colgada y el socket permanece en estado CLOSE_WAIT; el fallo afecta a las tres ramas activas.
Las fugas de datos también aparecen en CVE-2026-123866, un uso después de liberar memoria al desmontar un flujo HTTP/2. Si la escritura sigue bloqueada por contrapresión cuando el flujo se destruye —por ejemplo, después de un RST_STREAM del cliente o de un tiempo de espera del servidor—, el socket puede enviar memoria liberada en lugar de la respuesta prevista. Esa memoria puede incluir buffers de respuesta de otras conexiones.
En las ramas 24.x y 26.x, un cliente puede desencadenar por sí solo el fallo tras los cambios de tamaño de ventana introducidos en 24.22.0 y 26.9.0. En las tres ramas también es posible llegar a él si la aplicación destruye el flujo, por ejemplo al vencer su tiempo de espera de inactividad.
CVE-2026-123874 permite corromper memoria del servidor cuando este entrega archivos mediante stream.respondWithFile() o stream.respondWithFD(). Si el cliente reinicia el flujo mientras una escritura sigue en cola, el objeto puede liberarse antes de que termine la operación y luego se usa como si siguiera válido. El fallo afecta a las ramas 24.x y 26.x, tanto con TLS como sin cifrar. Un problema relacionado, CVE-2026-123875, puede tumbar las tres ramas si el cliente cancela una descarga servida con esos métodos.
HTTPS y TLS también pueden exponer datos
En servidores HTTPS, CVE-2026-123864 permite que un cliente sin autenticar lea memoria perteneciente a otras conexiones. El Proyecto Node.js advierte de que puede incluir claves privadas TLS y solicitudes de otros usuarios. Para que se den las condiciones, el manejador debe llamar a res.flushHeaders() antes de que termine de llegar el cuerpo y después ejecutar res.end() con datos; para obtener la memoria filtrada hace falta además una ruta que devuelva o almacene cuerpos de solicitudes.
El fallo nace de una escritura TLS de longitud cero que vuelve a entrar en el analizador HTTP mientras este procesa el cuerpo. Esa reentrada provoca un uso después de liberar memoria y una lectura fuera de los límites del heap, que el servidor puede copiar a la respuesta de esa solicitud. Afecta a las tres ramas activas; los servidores HTTP sin cifrar creados con node:http no están afectados.
Otro fallo alto, CVE-2026-123872, afecta a servidores TLS que aplican requisitos distintos de certificados de cliente según el nombre de host. Durante una renegociación TLS 1.2, un cliente autenticado para un host permitido puede cambiar el nombre del servidor y llevar esa autenticación a un host con reglas más estrictas. Las tres ramas activas están afectadas.
En la rama 24.x y la 26.x, CVE-2026-126051 permite tumbar un servidor TLS si utiliza los hooks SNICallback, OCSPRequest, newSession o resumeSession, o el método server.addContext(). El problema está en callbacks diferidos que no contemplan que el socket se destruya antes de ejecutarse. El proyecto describe una secuencia en la que un ClientHello y el cierre del socket llegan en el mismo ciclo, lo que causa una excepción no controlada.
Hay otros dos bypasses en la configuración TLS. CVE-2026-123867 puede dejar que un certificado aceptado por la autoridad de certificación predeterminada llegue a un host que debía exigir otra CA, cuando se configura un contexto SNI que establece solo la CA y no un certificado de servidor. CVE-2026-123877, en cambio, afecta a https.Agent: una sesión TLS almacenada con una política de confianza más amplia puede reutilizarse en una solicitud posterior con una política más estricta. Ambos fallos afectan a las tres ramas activas.

Memoria, credenciales y permisos
El conjunto incluye además un fallo medio, CVE-2026-123868, que permite agotar memoria en servidores HTTP/2 de las ramas 24.x y 26.x. Los datos entrantes que quedan en la cola de lectura de un flujo no se contabilizan en el presupuesto de sesión. El proyecto explica que un atacante puede enviar unos 10 bytes por trama mientras el servidor retiene alrededor de 114 bytes; así, decenas de megabytes enviados pueden convertirse en cientos de megabytes retenidos. El límite maxSessionMemory no frena este crecimiento.
También hay un desbordamiento de un byte en session.altsvc() (CVE-2026-123828), en las ramas 24.x y 26.x, cuando la aplicación entrega un origen largo y controlado por el atacante. El error puede corromper memoria y abortar el proceso. En las tres ramas, CVE-2026-123871 expone credenciales de proxy en mensajes ERR_PROXY_INVALID_CONFIG: algunos caminos de error incorporaban la URL completa, con usuario y contraseña, a mensajes que pueden terminar en stderr, registros de contenedores o servicios de reporte de fallos.
Los tres fallos de gravedad baja completan el recuento. CVE-2026-123829 puede revelar nombres de archivos y directorios que el proceso no tiene permiso para leer cuando se usa fs.watch() recursivo en macOS o Windows. La lista de 窓の杜 incluye además CVE-2026-123862, un problema de zlib en el que combinar una llamada pendiente a params() con destroy() provoca un error interno no capturable, y CVE-2026-106071, descrito como una concesión excesiva de permisos del sistema de archivos mediante una búsqueda radix con comodines.
| Rama | Versión corregida | Vulnerabilidades que la afectan |
|---|---|---|
| 22.x | 22.23.5 | 11 |
| 24.x | 24.22.3 | 16 |
| 26.x | 26.13.1 | 16 |
Las actualizaciones de dependencias acompañan a los parches del propio Node.js. 窓の杜 detalla llhttp 9.4.4 para las ramas 22.x, 24.x y 26.x; undici 8.12.4 y 7.30.2 para 26.x y 24.x; SQLite 3.54.1 para las tres ramas; y Brotli 1.2.1 para 24.x y 26.x. El Proyecto Node.js menciona actualizaciones de llhttp, undici y SQLite, sin incluir esos números de versión en su aviso.
Los parches no cubren las ramas fuera de soporte
Las versiones corregidas son 22.23.5, 24.22.3 y 26.13.1. Heroku anunció que las habilitó para compilaciones en su plataforma el 11 de noviembre. El aviso del Proyecto Node.js señala que las ramas fuera de soporte, incluidas 20.x y 25.x, no reciben correcciones en esta publicación y siguen afectadas.
El proyecto indica que actualizar a la versión corregida de cada rama es la única solución incluida en su aviso: no ofrece una medida provisional para los servidores que aún no puedan hacerlo. Tampoco informa de ataques que hayan explotado estas vulnerabilidades ni especifica si los servidores que pudieron exponer claves TLS u otros secretos deberían sustituirlos después de actualizar.
Fuentes: The Hacker News, Node.js Project, OpenJS Foundation CVE Numbering Authority, 窓の杜, Heroku Dev Center