
Documenta la cadena de RCE por use-after-free de VectorFreed en librsvg (CVE-2026-96889) con un PoC de generador de SVG y guía de remediación para librsvg, Next.js y Satori.
Este documento presenta "VectorFreed", una cadena de vulnerabilidades que comienza con un use-after-free que yo (@rafabd1) encontré en librsvg (CVE-2026-96889). En una compilación de Node.js/Sharp/libvips, este fallo condujo a la ejecución de comandos. Cubre el fallo, las rutas confirmadas en aplicaciones hasta ahora y las correcciones disponibles actualmente.
Un SVG puede incluir otro SVG mediante XInclude. En la ruta vulnerable, librsvg comienza a analizar un documento incluido mientras libxml2 todavía está expandiendo una entidad en el documento externo. Si el SVG incluido declara una entidad con el mismo nombre, librsvg reemplaza y libera la primera entidad. libxml2 todavía mantiene un puntero a ella.
Cuando finaliza el análisis del documento incluido, libxml2 continúa con ese puntero antiguo. Para entonces, la memoria puede pertenecer ya a otra cosa, por lo que escrituras posteriores pueden corromperla. Un crash es un resultado. En otros casos, esto también condujo a la ejecución de comandos.
El atacante necesita marcado SVG manipulado para llegar a librsvg. Eso puede ocurrir cuando una aplicación acepta un archivo SVG, pero también puede ocurrir cuando la aplicación construye un SVG a partir de la entrada del usuario. El mero uso de librsvg en algún lugar del árbol de dependencias no establece una ruta explotable; la entrada tiene que llegar a una compilación afectada cuando se renderiza la imagen.
La ruta de Next.js que probamos aceptaba texto en lugar de una carga de SVG. Colocaba ese texto dentro de un SVG en línea para la versión de Node.js de ImageResponse. Un fallo de escape independiente en Satori permitía que el texto modificara el marcado SVG generado. Sharp/libvips luego pasaba ese SVG a librsvg. Vercel registró la ruta de Next.js como CVE-2026-94545. La versión Edge de ImageResponse no se ve afectada por esta ruta. Aquí hay una breve reproducción en Next.js.
Durante esta investigación, identifiqué rutas de entrada afectadas en múltiples productos posteriores y confirmé la ejecución de comandos en varios de ellos, incluido el caso de Next.js descrito anteriormente. Cómo llega esa entrada a librsvg varía de un producto a otro. Por eso un fallo en un analizador de imágenes upstream puede aparecer en lugares que no parecen relacionados a primera vista; el reciente caso de libheif es otro ejemplo. No significa que todos los productos que usan librsvg sean explotables de forma remota.
ImageResponse de Node.js. Actualiza a 16.3.6.Si usas los binarios precompilados de Sharp, comprueba el paquete @img/sharp-libvips-* que instaló tu aplicación. Incluye libvips y sus dependencias, incluido librsvg. Actualizar la copia del sistema de librsvg puede dejar tu aplicación usando la antigua.
El PoC de UAF incluye un generador de SVG para varias rutas de entrada y puede usarse para comprobar el use-after-free al inicio de la cadena.
Hasta ahora, no he encontrado un exploit público que lleve esta cadena desde el SVG manipulado hasta la ejecución de comandos. Sin embargo, el fallo y los parches ya son públicos y, con las herramientas de IA actuales, es bastante fácil reconstruir la cadena completa a partir de ellos. Dado esto, trata el exploit como si ya fuera público y actualiza las dependencias afectadas o mitiga la ruta de entrada lo antes posible.
[!WARNING] No existe un PoC universal de RCE para esta cadena; el payload debe ajustarse para cada objetivo. La mayoría de los "PoCs" públicos que he visto hasta ahora no reproducen la cadena de RCE real. Algunos se basan en
<foreignObject>de SVG para la ejecución alegada, que no es la ruta de exploit descrita aquí.
Para la validación inicial, el PoC de UAF es más práctico. Planeo publicar un PoC de RCE para el caso de Next.js (CVE-2026-94545) en un repositorio separado. También publicaré el análisis técnico en las próximas semanas, con los pasos desde el UAF hasta la ejecución de comandos y un post-mortem que cubre este último mes de investigación sobre la cadena.