Todos los artículos

Next.js fuera de ciclo: la RCE de imágenes SVG y tres comprobaciones

Node.js · 4 min de lectura ·

Si despliegas una app Next.js, revisa hoy su versión. El aviso de GitHub GHSA-2464-fhr4-w9xw, calificado como crítico con una puntuación CVSS v4 de 9.5, describe ejecución remota de código sin autenticación en la API Image Optimization cuando se usan archivos SVG y Next.js corre sobre Linux basado en glibc. No hace falta cuenta ni interacción del usuario. Las versiones corregidas son 15.5.28 y 16.4.1. Muchos freelancers de PHP y Node mantienen un front Next.js junto a su backend, así que esto merece diez minutos aunque Next no sea tu stack principal.

Qué dice el aviso

Según el aviso, un fallo relacionado con la memoria en una librería de origen que Next.js usa para optimizar imágenes puede llevar a ejecución remota de código. Los rangos afectados del paquete next son de 10.0.0 a 15.5.27 y de 16.0.0 a 16.4.0. La alternativa, si no puedes actualizar enseguida, es asegurarte de que la versión de sharp que usa Next.js sea 0.35.5 o posterior; una instalación limpia trae un sharp corregido, y actualizar Next.js a una versión parcheada hace que el gestor de paquetes descargue uno. El aviso remite a CVE-2026-96889 y da crédito a randomguy6407 y rafabd1.

El rastreador pwn.watch añade contexto que no pude contrastar yo mismo con los otros avisos. Según él, Vercel publicó 16.4.1 y 15.5.28 el 14 de octubre de 2026 fuera de su ciclo habitual, el fallo de SVG es un use-after-free en librsvg al que se llega a través de sharp, y esa misma publicación corrigió una segunda RCE crítica (GHSA-673q-mjm6-r5xr, apps con App Router y Cache Components) y una denegación de servicio de gravedad alta en Server Actions (GHSA-p3m5-59mp-jv5r). Fuera de ciclo significa que el fabricante decidió no esperar al calendario normal. Tómalo como una señal de urgencia.

Petición de una imagen SVG un solo proceso Node: tu app, tu entorno, tus secretos Image Optimization API sharp (capa JS) librsvg código nativo fallo de memoria aquí un fallo en código nativo es un fallo dentro de tu app, con sus permisos
El SVG nunca sale de tu proceso: el parser que lo lee corre con los mismos permisos que tu app.

Por qué un parser de imágenes puede ejecutar código

Esto es conocimiento general, no un detalle del aviso. El procesamiento de imágenes en Node suele ser código nativo: sharp es una capa de JavaScript sobre librerías en C como libvips y librsvg, que corren dentro de tu proceso Node. Un fallo de memoria ahí no queda contenido por la seguridad de JavaScript; es un fallo de tu aplicación, con tus variables de entorno y tu sistema de archivos. El SVG amplía la superficie, porque es un formato de documento con un parser completo detrás, no una cuadrícula de píxeles.

El aviso menciona Linux basado en glibc. No dice que las demás plataformas estén a salvo, así que si tu imagen es Alpine o cualquier otra cosa, actualiza igualmente en lugar de razonar hasta convencerte de que no te afecta.

Tres comprobaciones

npm ls next sharp
grep -n '"version"' node_modules/sharp/package.json
docker exec my-next-app id -u

Ejecuta las dos primeras dentro del proyecto y la tercera contra el contenedor en marcha, porque el lockfile de tu portátil y la imagen en producción pueden no coincidir. Luego arregla lo que salga:

npm install next@16.4.1   # or next@15.5.28 on the 15 line
npm ls sharp              # expect 0.35.5 or later
docker build --pull -t my-next-app .
1. next 15.5.28 o 16.4.1 o posterior 2. sharp 0.35.5 o posterior 3. usuario id -u no es 0 (no es root) 1 y 2: según el aviso 3: limita el daño revisa la imagen que está corriendo, no solo tu portátil
Dos comprobaciones cierran el agujero; la tercera decide hasta dónde podría llegar uno parecido en el futuro.
Actualizar next es el arreglo; comprobar que sharp está en 0.35.5 o posterior dentro de la imagen desplegada es como sabes que el arreglo llegó.

Dos hábitos, como práctica general y no como algo que exija el aviso: limita lo que el optimizador puede descargar con images.remotePatterns en tu config de Next, para que solo procese imágenes de hosts que tú nombras, y ejecuta la app con un usuario que no sea root dentro de su contenedor. Ninguno sustituye a la actualización. Siguiente paso: pasa las tres comprobaciones en cada app Next.js que despliegues, incluido el proyecto de ese cliente que no tocas desde la primavera.

Fuente: GitHub Advisory Database, GHSA-2464-fhr4-w9xw.

Notas de los lectores

  1. Todavía no hay notas. La primera siempre es la más valiente.
¿Estás construyendo algo parecido? Puedo ayudarte. Escríbeme por WhatsApp