El mismo día de la corrección crítica de PHP, el 21 de octubre de 2026, el proyecto Node.js publicó una nueva ronda de correcciones de seguridad: 10 vulnerabilidades corregidas en las versiones 26, 24 y 22, cuatro de ellas de severidad alta. La más grave es una escritura fuera de los límites de memoria en el decodificador Brotli que, según el aviso oficial, permite ejecución remota de código.

Si tu API, tu front-end con Next.js, tus workers o tus funciones serverless corren en Node.js, este artículo muestra qué cambió, qué priorizar y cómo actualizar sin sorpresas.

Resumen para quien tiene prisa

  • Actualiza a Node.js 26.12.1, 24.22.1 o 22.23.4, según la línea que uses.
  • Node.js 20 o anterior llegó al fin de su vida y no recibe corrección. Es hora de migrar.
  • Además del código, reconstruye las imágenes Docker, actualiza el runtime del CI y revisa la versión que usa tu plataforma de hosting.
  • Hasta la publicación de este artículo no había reportes públicos de explotación activa. Aun así, hay una falla con potencial de ejecución remota de código: no la dejes para el próximo sprint.

Las 10 fallas corregidas

CVESeveridadLíneasQué es
CVE-2026-111497Alta26, 24, 22Escritura fuera de límites en el decodificador Brotli, con posible ejecución remota de código
CVE-2026-105483Alta26, 24Validación del hostname en el certificado TLS evadida con una IP escrita en dígitos de ancho completo
CVE-2026-106069Alta26, 24, 22Validación del hostname en el certificado TLS evadida cuando el host se interpreta de forma laxa como IP
CVE-2026-105482Alta26, 24, 22dns.resolve corta nombres que contienen el carácter NUL
CVE-2026-105481Media26, 24, 22Un socket keep-alive procesa una respuesta escrita antes de enviar la petición
CVE-2026-106072Media26, 24, 22Direcciones IPv4 en formato no canónico permiten que un certificado de dominio autentique una IP
CVE-2026-106074Media26, 24, 22crypto.randomUUID() y randomInt() repiten valores en startup snapshots y ejecutables únicos (SEA)
CVE-2026-106070Baja26ZipFile devuelve bytes controlados por el atacante tras fallar la validación del encabezado
CVE-2026-106071Baja26El Permission Model concede más acceso a archivos del permitido mediante comodines
CVE-2026-106073Baja26, 24, 22Evasión del Permission Model con fs.realpathSync

Las versiones también actualizan dependencias internas: OpenSSL 3.5.9 (líneas 24 y 22), undici 7.30.1, c-ares 1.34.9, los certificados raíz de NSS, el bloqueo de una CA intermedia comprometida de eMudhra y, en la línea 22, SQLite.

Qué priorizar

1. Brotli: cualquier aplicación que descomprime contenido

Brotli es el formato de compresión br, muy usado en la web. El decodificador incluido en Node es el que está detrás del módulo zlib (brotliDecompress, createBrotliDecompress) y, por consecuencia, de librerías y clientes HTTP que descomprimen respuestas con Content-Encoding: br.

El aviso oficial no detalla las condiciones de explotación, pero el riesgo es mayor para quien procesa contenido comprimido que viene de fuera: proxies y gateways, crawlers y scrapers, servicios que consumen APIs de terceros, subidas comprimidas y webhooks. Esos servidores deben ir primero.

2. TLS: certificados validados para el destino equivocado

Tres fallas (CVE-2026-105483, CVE-2026-106069 y CVE-2026-106072) afectan la verificación que confirma que el certificado pertenece de verdad al servidor al que llamaste. El punto en común son las direcciones IP escritas en formatos inusuales, como dígitos de ancho completo (127.0.0.1) o IPv4 no canónico. La corrección hace que Node rechace esos formatos.

El riesgo aparece cuando el destino de una conexión HTTPS viene de fuera: URLs que informa el usuario, webhooks configurables, integraciones donde el cliente elige el endpoint. En esos casos, un atacante en posición de interceptar el tráfico puede presentar un certificado que no debería aceptarse.

3. DNS y keep-alive

Con la CVE-2026-105482, un nombre con carácter NUL se cortaba en dns.resolve: tu código validaba un nombre y Node consultaba otro. Eso puede saltarse listas de dominios permitidos y protecciones contra SSRF. La CVE-2026-105481 afecta conexiones HTTP reutilizadas (keep-alive), donde una respuesta enviada antes de tiempo podía asociarse a la petición siguiente.

4. Valores aleatorios repetidos en snapshots y SEA

Si usas startup snapshots o empaquetas la aplicación como Single Executable Application, la caché de aleatoriedad de crypto.randomUUID() y crypto.randomInt() se guardaba en el snapshot, y cada proceso generaba la misma secuencia. Tokens, IDs de sesión y códigos generados en esos procesos pueden haberse repetido. Después de actualizar, reconstruye los snapshots y ejecutables y evalúa si hay que invalidar lo generado antes.

Cómo actualizar

Averigua la versión en uso

node -v

# en producción, revisa el proceso que realmente está corriendo
node -p "process.version"     # dentro del contenedor o servidor
docker run --rm tu-imagen node -v

Máquina de desarrollo y servidor

# nvm (Linux/macOS) o nvm-windows
nvm install 24.22.1
nvm alias default 24.22.1

# fnm
fnm install 24.22.1 && fnm default 24.22.1

# Debian/Ubuntu con el repositorio de NodeSource
sudo apt update && sudo apt install --only-upgrade nodejs

Después de actualizar el binario, reinicia los procesos (PM2, systemd, Supervisor): el proceso antiguo sigue ejecutando la versión vulnerable hasta que se reinicia.

pm2 reload all
# o
sudo systemctl restart mi-api

Docker

Tags como node:24-alpine apuntan a la versión nueva, pero tu imagen solo cambia cuando se reconstruye sin caché. Para builds reproducibles, fija la versión corregida:

# Dockerfile
FROM node:24.22.1-alpine

# reconstruye sin reutilizar la capa antigua
docker build --pull --no-cache -t mi-api .

CI y proyecto

Actualiza la versión en el pipeline y, si quieres impedir que alguien ejecute una versión vulnerable, declara el mínimo en el proyecto:

# .github/workflows/*.yml
- uses: actions/setup-node@v4
  with:
    node-version: 24.22.1

# .nvmrc
24.22.1

// package.json
"engines": { "node": ">=24.22.1" }

Hosting y serverless

En plataformas gestionadas (Vercel, Netlify, AWS Lambda, Azure App Service, Google Cloud Run y similares), quien actualiza el runtime es el proveedor, normalmente sin que hagas nada más que un nuevo deploy. Revisa en la documentación o en el panel qué versión de parche está en uso y haz un redeploy para garantizar que las funciones arranquen en el runtime nuevo.

¿Todavía en Node.js 20 o anterior?

Node.js 20 llegó al fin de su vida en abril de 2026, y las versiones sin soporte siempre están afectadas por las fallas anunciadas, sin corrección. El propio proyecto recomienda migrar a una línea con soporte; para quien no puede migrar ahora, existe soporte comercial de pago a través del programa de sostenibilidad de OpenJS.

Migrar de 20 a 22 o 24 suele ser sencillo en aplicaciones web, pero exige probar las dependencias nativas (como bcrypt, sharp y drivers de base de datos) y revisar los avisos de APIs obsoletas.

Checklist

  • Listar dónde corre Node.js: servidores, contenedores, funciones serverless, CI y máquinas del equipo
  • Actualizar a 26.12.1, 24.22.1 o 22.23.4
  • Reiniciar procesos y reconstruir imágenes Docker sin caché
  • Priorizar servicios que descomprimen contenido externo o hacen HTTPS a destinos informados por el usuario
  • Reconstruir startup snapshots y ejecutables SEA y revisar los tokens generados en ellos
  • Planificar la salida de Node.js 20 o anterior

Fuentes

¿Necesitas ayuda?

Actualizar Node.js es sencillo en una máquina y laborioso en una flota de servidores, contenedores y pipelines. Si necesitas ayuda para actualizar sin detener la operación o para migrar desde Node.js 20, habla con nosotros. Y si prefieres dejar este tipo de mantenimiento a quien cuida el servidor, conoce el hosting de CPW.