[{"data":1,"prerenderedAt":210},["ShallowReactive",2],{"seo-verification":3,"blog-node-js-cve-2026-111497-brotli-actualizar-a-22-23-4-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-node-js-cve-2026-111497-brotli-actualizar-a-22-23-4-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":151,"ctaBody":152,"ctaButton":153,"ctaUrl":154,"relatedPosts":155},510,"node-js-cve-2026-111497-brotli-actualizar-a-22-23-4",{"fr":12,"en":13,"ar":14,"es":10},"nodejs-brotli-cve-2026-111497-mettre-a-jour","node-js-cve-2026-111497-brotli-update-to-22-23-4","ثغرة-node-js-cve-2026-111497-brotli-التحديث-إلى-22-23-4","Node.js CVE-2026-111497 (Brotli): actualizar a 22.23.4","Node.js 22.23.4, 24.22.1 y 26.12.1 corrigen CVE-2026-111497, escritura fuera de límites en el decodificador Brotli. Exposición, inventario, actualización, mitigaciones.",10,0,false,"2026-10-27T00:00:00+00:00","2026-10-27T23:58:39+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fnodejs-brotli-cve-2026-111497-mettre-a-jour-poster.svg","El 21 de octubre de 2026, Node.js publicó las versiones 22.23.4, 24.22.1 y 26.12.1 para corregir CVE-2026-111497, una escritura fuera de límites en el decodificador Brotli que puede llegar a la ejecución remota de código. En un parque de sitios con Next, Nuxt o Express, «actualizar» no basta como respuesta: hay que saber qué aplicaciones descomprimen realmente Brotli no confiable, qué procesos siguen usando el binario antiguo y qué hacer con una aplicación atada a Node 20. Esta guía da los comandos para inventariar, corregir y verificar, y luego reducir el riesgo cuando la corrección debe esperar.",[35,39,75,78,89,114,117,135,139,142,145,148],{"type":36,"title":37,"body":38},"h2","Qué corrige la publicación de Node.js de octubre de 2026","El 21 de octubre de 2026, Node.js publicó actualizaciones para las líneas 22.x, 24.x y 26.x. Entre las diez vulnerabilidades corregidas, el proyecto clasifica CVE-2026-111497 como High: el decodificador Brotli incorporado escribe más allá de un búfer interno cuando recibe datos mal formados. En concreto, un cambio de bloque no válido se notificaba como una simple necesidad de más datos, y no como un error de formato definitivo. El decodificador en flujo seguía entonces añadiendo bytes a un búfer interno de ocho bytes. Las consecuencias posibles van desde la caída del proceso hasta la divulgación de memoria y la ejecución remota de código con los privilegios del proceso Node.\n\nSobre la gravedad coexisten dos lecturas. Node.js dice High; Google, como autoridad de numeración de CVE, asigna una puntuación CVSS v4 de 9,2, según el análisis de Rapid7. A 26 de octubre de 2026, Rapid7 no conoce ninguna explotación en la práctica, y el fallo no figura en el catálogo CISA de vulnerabilidades explotadas. El fallo no está, por tanto, explotado hasta ahora, según Rapid7: es una ventana para parchear con calma, no un motivo para esperar.",{"type":40,"title":41,"headers":42,"rows":46},"comparison","Versiones afectadas y versiones corregidas",[43,44,45],"Caso","Estado","Acción",[47,51,55,59,63,67,71],[48,49,50],"Node.js 22.x","Afectada antes de 22.23.4","Pasar a 22.23.4",[52,53,54],"Node.js 24.x","Afectada antes de 24.22.1","Pasar a 24.22.1",[56,57,58],"Node.js 26.x","Afectada antes de 26.12.1","Pasar a 26.12.1",[60,61,62],"Node.js 20.x y otras líneas al final de su vida útil","Tratar como afectadas, sin corrección","Migrar a 22.x o 24.x",[64,65,66],"Imagen Docker node:\u003Clínea>","Afectada hasta que se reconstruya la imagen","Reconstruir con --pull --no-cache",[68,69,70],"Binario de Node empaquetado en una herramienta (Electron, ejecutable empaquetado)","Depende de la versión incorporada","Actualizar la propia herramienta",[72,73,74],"Otro software que incorpora el mismo decodificador Brotli","Según el proveedor","Leer su propio aviso",{"type":36,"title":76,"body":77},"Está expuesto: el criterio que decide","Tener un Node vulnerable no basta para ser atacable. El aviso de Node.js apunta a una aplicación que descomprime con `node:zlib` datos Brotli suministrados por un atacante, mediante `zlib.createBrotliDecompress` o `zlib.brotliDecompress`. Rapid7 precisa que la mera presencia del decodificador no establece la exposición: todo depende de lo que la aplicación descomprime. Sin embargo, no concluya demasiado rápido que no hay riesgo, porque Brotli suele pasar por bibliotecas que usted no escribió.\n\nEl vínculo con la cabecera `Content-Encoding: br` es nuestra lectura, no una afirmación del aviso. En el código fuente público, el `fetch` integrado en Node (undici) decodifica las respuestas `br` con `zlib.createBrotliDecompress`, el adaptador HTTP de axios prevé la misma decodificación y el código actual de body-parser hace lo mismo con los cuerpos de las peticiones entrantes. Hay que examinar por tanto dos flujos: lo que su aplicación recibe de los clientes y lo que obtiene de servidores de terceros. Puede comprobarlo en su propio árbol de dependencias con los comandos del inventario más abajo.",{"type":79,"title":80,"items":81},"ul","Por dónde puede entrar Brotli no confiable en una aplicación Node",[82,83,84,85,86,87,88],"**Peticiones entrantes comprimidas** — una API Express o un servidor propio que usa body-parser descomprime un cuerpo `Content-Encoding: br` enviado por cualquier cliente.","**Respuestas de servicios de terceros** — `fetch` o axios que llama a una API, un feed RSS, un webhook o una página para previsualizar: el servidor remoto elige la codificación de la respuesta.","**Renderizado en el servidor** — una aplicación Next o Nuxt que obtiene datos remotos durante el renderizado pasa por esas mismas llamadas salientes.","**Proxies y pasarelas escritos en Node** — un componente que descomprime para inspeccionar o transformar el contenido en tránsito abre ambos flujos a la vez.","**Tratamiento de archivos** — un servicio que acepta archivos comprimidos con Brotli y los abre con `zlib.brotliDecompress`.","**Herramientas de compilación y CI** — scripts de despliegue y tareas que descargan artefactos: menos expuestos, pero usan el mismo binario y se parchean al mismo tiempo.","**Ninguna ruta identificada** — prioridad más baja, no nula: una dependencia añadida más tarde basta para crear la exposición, y la publicación corrige además otros fallos.",{"type":90,"title":91,"steps":92},"steps","Inventariar el parque en quince minutos",[93,96,99,102,105,108,111],{"title":94,"body":95},"Leer la versión de cada máquina","`node -v`\n`which -a node`\nSuelen convivir varios binarios: el del sistema, el de nvm, el de un contenedor. `which -a` los lista todos, y el primero no siempre es el que usa el servicio.",{"title":97,"body":98},"Encontrar el binario real de cada proceso","`ps -eo pid,user,args | grep -E '[n]ode|[p]m2'`\n`sudo readlink -f \u002Fproc\u002F\u003Cpid>\u002Fexe`\nLa segunda orden, lanzada con el PID obtenido, da la ruta exacta del binario que ejecuta el proceso. Es la única respuesta fiable en una máquina con varias instalaciones de Node.",{"title":100,"body":101},"Consultar los contenedores","`docker ps`\n`docker exec \u003Cconteneur> node -v`\n`docker images | grep node`\nUn contenedor en ejecución no se corrige solo: conserva la imagen con la que arrancó, aunque exista una más reciente en la máquina.",{"title":103,"body":104},"Buscar las llamadas directas en su código","`grep -rEn \"createBrotliDecompress|brotliDecompress\" --include=*.js --include=*.mjs --include=*.ts . --exclude-dir=node_modules`\nCada línea encontrada es un punto donde su código descomprime Brotli. Mire de dónde vienen los datos: un archivo que usted mismo produjo no tiene el mismo riesgo que el cuerpo de una petición.",{"title":106,"body":107},"Buscar las bibliotecas que descomprimen por usted","`grep -rlE \"createBrotliDecompress\" node_modules --include=*.js`\n`npm ls body-parser axios undici`\nLa primera orden lista los paquetes instalados que llaman al decodificador; la segunda muestra qué versiones de body-parser, axios y undici hay en el proyecto. Lance ambas en cada repositorio, no solo en el más reciente.",{"title":109,"body":110},"Localizar los binarios empaquetados","Las herramientas que incorporan su propio Node (aplicaciones Electron, ejecutables empaquetados) no quedan cubiertas por `apt`. Consulte su versión en su documentación y compruebe si el proveedor ha publicado una versión corregida.",{"title":112,"body":113},"Anotar el resultado en una tabla","Una fila por proceso: máquina, cliente, línea de Node, versión, ruta Brotli identificada o no. Esta tabla decide el orden de tratamiento y servirá de prueba una vez hecha la actualización.",{"type":36,"title":115,"body":116},"En qué orden tratar el parque","Un parque de sitios de clientes, con versiones e instalaciones heterogéneas, no se actualiza de un solo gesto, y no hace falta. Empiece por los servidores expuestos a Internet que reciben cuerpos comprimidos o llaman a servicios de terceros: renderizado en el servidor, pasarelas, proxies, API públicas. Siguen las aplicaciones internas y los workers, y después las herramientas de compilación. Las aplicaciones en Node 20 son un caso aparte: no habrá corrección para ellas y la única salida es migrar a 22.x o 24.x, algo que conviene planificar con el cliente en lugar de improvisar. Avance por tramos de unas pocas máquinas y verifique cada tramo antes de pasar al siguiente.",{"type":90,"title":118,"steps":119},"Actualizar según el modo de instalación",[120,123,126,129,132],{"title":121,"body":122},"Paquete apt (repositorio NodeSource o distribución)","`apt-cache policy nodejs`\n`sudo apt-get update`\n`sudo apt-get install --only-upgrade nodejs`\n`node -v`\nLea primero la fuente que muestra `apt-cache policy`: el repositorio debe apuntar a la línea correcta (node_22.x o node_24.x). Un repositorio que se quedó en una línea al final de su vida útil nunca ofrecerá la corrección. Un paquete de distribución también puede llevar otro número: compárelo con el aviso de su distribución.",{"title":124,"body":125},"nvm","`nvm install --reinstall-packages-from=current 22`\n`nvm alias default 22`\n`nvm use 22`\n`node -v`\nLa orden instala la última 22.x disponible; compruebe que `node -v` muestra 22.23.4 o superior. Haga lo mismo con 24 si es su línea. Los servicios lanzados por otro usuario tienen su propio nvm.",{"title":127,"body":128},"Docker","Cambie la etiqueta de la línea `FROM`, por ejemplo `FROM node:22` o `FROM node:24` con la variante que ya utiliza, y luego:\n`docker build --pull --no-cache -t monapp:corrige .`\n`docker compose up -d`\nLa opción `--pull` descarga la última versión de la imagen base y `--no-cache` evita reutilizar una capa construida con el Node antiguo. El contenedor en ejecución solo se sustituye al volver a desplegar.",{"title":130,"body":131},"pm2","`pm2 restart all`\n`pm2 update`\nTras sustituir el binario, `pm2 restart` relanza las aplicaciones; `pm2 update` actualiza el demonio de pm2 en memoria. La documentación de pm2 añade que, tras una actualización de Node, conviene refrescar también el script de arranque:\n`pm2 unstartup`\n`pm2 startup`\n`pm2 save`",{"title":133,"body":134},"Servicio systemd u otro supervisor","`sudo systemctl restart \u003Cservice>`\nReinicie cada servicio uno a uno, comprobando su registro y su ruta de salud antes de pasar al siguiente. En una aplicación detrás de un balanceador, saque la máquina del grupo mientras dura el reinicio.",{"type":136,"title":137,"body":138},"tip","Un proceso ya iniciado conserva el Node antiguo","Sustituir el binario no corrige los procesos en ejecución: conservan la versión antigua en memoria hasta que se reinician. Un `node -v` correcto en la máquina no prueba nada sobre un servicio iniciado ayer. Tras cada reinicio, verifique desde el propio proceso: `pm2 jlist` o `pm2 show \u003Cnom>` para la versión de Node en uso, o `process.version` expuesto en su ruta de salud.",{"type":36,"title":140,"body":141},"Si hoy es imposible actualizar","Node.js no ha publicado ninguna solución alternativa: la única mitigación del proveedor es la versión corregida. En su defecto, Rapid7 recomienda restringir o desactivar las rutas de la aplicación que descomprimen Brotli no confiable. Así se traduce en la práctica. Los puntos siguientes son medidas de reducción del riesgo que proponemos nosotros, no recomendaciones del proveedor, y ninguno sustituye a la corrección.\n\nEn las peticiones entrantes, rechace Brotli en el proxy inverso, por ejemplo en nginx: `if ($http_content_encoding ~* br) { return 415; }`. Pruebe con `nginx -t` antes de recargar y compruebe que ninguno de sus clientes legítimos envía cuerpos en `br`. En las respuestas de terceros, anuncie solo las codificaciones útiles con la cabecera `Accept-Encoding: gzip` y limite los destinos permitidos de sus llamadas salientes. Esta última medida es parcial: un servidor malicioso puede responder en `br` aunque no se lo hayan pedido, y el decodificador sigue la cabecera de la respuesta. En Vercel, las reglas WAF bloquean el flujo entrante pero no las respuestas que obtienen sus funciones; sigue siendo necesario volver a desplegar con una versión corregida.",{"type":36,"title":143,"body":144},"No corrija solo el fallo de Brotli","La misma publicación corrige otros nueve fallos. Entre ellos figuran dos elusiones de la verificación del nombre de host TLS de gravedad alta, CVE-2026-105483 y CVE-2026-106069, y también CVE-2026-105482, un truncamiento de los nombres de host que contienen un carácter NUL en las resoluciones DNS, igualmente clasificado High. No afectan todos a las mismas líneas: CVE-2026-105483 concierne a las líneas 26.x y 24.x, y los otros dos afectan también a 22.x. Una aplicación que valida certificados TLS en sus llamadas salientes tiene por tanto buenas razones para pasar a la versión corregida sin esperar a resolver la cuestión de Brotli.",{"type":36,"title":146,"body":147},"Para una agencia: una corrección por línea, no por sitio","Cuando se llevan decenas de sitios, la orden de actualización tarda un minuto; el tiempo se va en otra parte. Hay que averiguar qué máquina ejecuta qué versión para qué cliente y conseguir después una ventana de reinicio. Mantenga por tanto un registro vivo, alimentado con el inventario anterior: ante el próximo fallo, un simple filtro sobre la línea de Node da la lista de sitios que tratar. Cuantas menos variantes haya en el parque, menos casos que gestionar a mano, y el alojamiento de revendedor responde a esa lógica: una interfaz única para la cartera y renovaciones agrupadas, frente a un conjunto de servidores dispares que multiplica los accesos que seguir. Las aplicaciones atadas a Node 20 requieren un tratamiento aparte: la guía de migración enlazada bajo este artículo evita descubrir la ausencia de corrección el día del siguiente fallo.",{"type":36,"title":149,"body":150},"La documentación oficial","Aviso de seguridad de Node.js de octubre de 2026: https:\u002F\u002Fnodejs.org\u002Fen\u002Fblog\u002Fvulnerability\u002Foctober-2026-security-releases\n\nAnálisis de Rapid7 sobre CVE-2026-111497: https:\u002F\u002Fwww.rapid7.com\u002Fblog\u002Fpost\u002Fetr-cve-2026-111497-critical-out-of-bounds-write-in-the-node-js-brotli-decoder\u002F\n\nBoletín de Vercel: https:\u002F\u002Fvercel.com\u002Fkb\u002Fbulletin\u002Fnode-js-security-advisory\n\nDocumentación del módulo zlib: https:\u002F\u002Fnodejs.org\u002Fapi\u002Fzlib.html\n\nDocumentación de nvm: https:\u002F\u002Fgithub.com\u002Fnvm-sh\u002Fnvm\n\nActualización de pm2: https:\u002F\u002Fpm2.keymetrics.io\u002Fdocs\u002Fusage\u002Fupdate-pm2\u002F\n\nOpciones de docker build: https:\u002F\u002Fdocs.docker.com\u002Freference\u002Fcli\u002Fdocker\u002Fbuildx\u002Fbuild\u002F","Un parque de sitios que parchear, sin pasar la noche en vela","Una cartera de sitios se gestiona mejor desde un único lugar. Con el alojamiento de revendedor de ServOrbit.com, sigue cuentas y renovaciones en una sola interfaz, sin multiplicar los servidores que vigilar.","Descubrir la oferta para agencias","\u002Fsolutions\u002Fagences",[156,178,194],{"id":157,"slug":158,"slugs":159,"title":163,"excerpt":164,"readTime":165,"views":166,"isPinned":19,"publishedAt":167,"updatedAt":168,"category":169,"categories":175,"featuredImage":30,"bgImage":31,"posterImage":177,"relatedSolution":30},223,"nodejs-20-fin-de-vida-migrar-vps",{"fr":160,"en":161,"ar":162,"es":158},"nodejs-20-fin-de-vie-migrer-vps","nodejs-20-end-of-life-migrating-your-vps","نهاية-دعم-nodejs-20-ترحيل-خادم-vps","Node.js 20 en fin de vida: migrar su VPS","Node.js 20 no recibe parches de seguridad desde el 30 de abril de 2026. Auditar sus servidores y migrar a Node.js 24 sin romper la producción.",5,1,"2026-08-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":170,"name":171,"slug":172,"color":173,"icon":174},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[176],{"id":170,"name":171,"slug":172,"color":173,"icon":174},"\u002Fblog\u002Fcovers\u002Fnodejs-20-fin-de-vie-migrer-vps-poster.svg",{"id":179,"slug":180,"slugs":181,"title":185,"excerpt":186,"readTime":187,"views":18,"isPinned":19,"publishedAt":188,"updatedAt":189,"category":190,"categories":191,"featuredImage":30,"bgImage":31,"posterImage":193,"relatedSolution":30},500,"nextjs-16-4-1-15-5-28-rce-actualizar",{"fr":182,"en":183,"ar":184,"es":180},"nextjs-16-4-1-15-5-28-rce-mettre-a-jour","nextjs-16-4-1-15-5-28-rce-update","nextjs-16-4-1-15-5-28-تحديث-ثغرة-rce","Next.js 16.4.1 y 15.5.28: corregir las fallas RCE en un VPS","Dos RCE críticas y un DoS corregidos en Next.js 16.4.1 y 15.5.28. Versiones afectadas, comprobación en un VPS y redespliegue con PM2, Docker y Coolify.",9,"2026-10-23T00:00:00+00:00","2026-10-23T23:43:01+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[192],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fnextjs-16-4-1-15-5-28-rce-mettre-a-jour-poster.svg",{"id":195,"slug":196,"slugs":197,"title":201,"excerpt":202,"readTime":17,"views":203,"isPinned":19,"publishedAt":204,"updatedAt":205,"category":206,"categories":207,"featuredImage":30,"bgImage":31,"posterImage":209,"relatedSolution":30},382,"actualizaciones-seguridad-vps-debian-ubuntu",{"fr":198,"en":199,"ar":200,"es":196},"securite-vps-mises-a-jour-automatiques-debian-ubuntu","vps-automatic-security-updates-debian-ubuntu","تحديثات-أمان-تلقائية-vps-debian-ubuntu","Actualizaciones de seguridad automáticas en VPS Debian\u002FUbuntu","Configure unattended-upgrades en sus VPS Debian\u002FUbuntu para automatizar los parches de seguridad y reducir la superficie de ataque en su flota de clientes.",2,"2026-09-26T00:00:00+00:00","2026-09-29T14:40:42+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[208],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fsecurite-vps-mises-a-jour-automatiques-debian-ubuntu-poster.svg",1793146128010]