
Dokumentiert die VectorFreed-librsvg-Use-after-free-RCE-Kette (CVE-2026-96889) mit einem SVG-Generator-PoC und Behebungsempfehlungen für librsvg, Next.js und Satori.
Dieses Dokument stellt „VectorFreed" vor, eine Schwachstellenkette, die mit einer Use-after-free-Schwachstelle beginnt, die ich (@rafabd1) in librsvg gefunden habe (CVE-2026-96889). In einem Node.js/Sharp/libvips-Build führte dieser Fehler zur Befehlsausführung. Es behandelt den Fehler, die bisher in Anwendungen bestätigten Pfade und die jetzt verfügbaren Korrekturen.
Ein SVG kann über XInclude ein weiteres SVG einbinden. Im anfälligen Pfad beginnt librsvg mit dem Parsen eines eingebundenen Dokuments, während libxml2 noch eine Entität im äußeren Dokument expandiert. Wenn das eingebundene SVG eine Entität mit demselben Namen deklariert, ersetzt und gibt librsvg die erste Entität frei. libxml2 hält weiterhin einen Zeiger darauf.
Wenn das Parsen des eingebundenen Dokuments endet, fährt libxml2 mit diesem alten Zeiger fort. Der Speicher kann zu diesem Zeitpunkt bereits zu etwas anderem gehören, sodass spätere Schreibvorgänge ihn beschädigen können. Ein Absturz ist ein mögliches Ergebnis. In anderen Fällen führte dies ebenfalls zur Befehlsausführung.
Der Angreifer benötigt präpariertes SVG-Markup, um librsvg zu erreichen. Das kann geschehen, wenn eine Anwendung eine SVG-Datei akzeptiert, aber es kann auch geschehen, wenn die Anwendung ein SVG aus Benutzereingaben erstellt. Die bloße Verwendung von librsvg irgendwo im Abhängigkeitsbaum begründet keinen ausnutzbaren Pfad; die Eingabe muss einen betroffenen Build erreichen, wenn das Bild gerendert wird.
Die von uns getestete Next.js-Route akzeptierte Text anstelle eines SVG-Uploads. Sie platzierte diesen Text in einem Inline-SVG für die Node.js-Version von ImageResponse. Ein separater Escaping-Fehler in Satori ermöglichte es dem Text, das generierte SVG-Markup zu verändern. Sharp/libvips übergab dieses SVG dann an librsvg. Vercel verfolgte den Next.js-Pfad als CVE-2026-94545. Die Edge-Version von ImageResponse ist von diesem Pfad nicht betroffen. Hier ist eine kurze Next.js-Reproduktion.
Eine zweite Next.js-Route erreichte denselben librsvg-Fehler über die Image Optimization API. Wenn eine angreiferkontrollierte Bildquelle von der API akzeptiert wurde, konnte ein präpariertes Bild die SVG-Ablehnung des Frameworks umgehen und später von Sharp/libvips als SVG behandelt werden. Dies setzte die vorgelagerte Speicherbeschädigung unauthentifizierten Anfragen auf glibc-basiertem Linux aus, ohne Satori oder ImageResponse zu verwenden.
Vercel veröffentlichte diesen Pfad als GHSA-2464-fhr4-w9xw, unter der vorgelagerten CVE-2026-96889. Der Advisory bewertet ihn als Critical mit einem CVSS-Score von 9.5.
Ghost hat einen anderen Pfad. Ein Mitarbeiterbenutzer, einschließlich eines Contributors, konnte eine Bookmark-Karte für eine von ihm kontrollierte Website erstellen. Die Verarbeitung des Kartenbilds konnte dann Befehle auf dem Ghost-Server ausführen. Ghost veröffentlichte dies als CVE-2026-105642.
Während dieser Recherche identifizierte ich betroffene Eingabepfade in mehreren nachgelagerten Produkten und bestätigte die Befehlsausführung in mehreren davon, einschließlich beider Next.js-Routen und des obigen Ghost-Falls. Wie diese Eingabe librsvg erreicht, variiert von Produkt zu Produkt. Deshalb kann ein vorgelagerter Bildparser-Fehler an Stellen auftauchen, die auf den ersten Blick nicht zusammenhängen; der aktuelle libheif-Fall ist ein weiteres Beispiel. Das bedeutet nicht, dass jedes Produkt, das librsvg verwendet, aus der Ferne ausnutzbar ist.
ImageResponse): Die Versionen 16.2.0 bis 16.3.5 sind betroffen, wenn eine Anwendung von Angreifern kontrollierte Werte in SVG-Inhalte, -Attribute oder -Styles einfügt. Aktualisieren Sie auf 16.3.6.>= 10.0.0 <= 15.5.27 und > 16.0.0 <= 16.4.0 als betroffen auf. Aktualisieren Sie auf 15.5.28 oder 16.4.1. Sharp 0.35.5 oder später enthält den Upstream-Fix.Wenn Sie die vorgefertigten Binaries von Sharp verwenden, prüfen Sie das @img/sharp-libvips-*-Paket, das Ihre App installiert hat. Es bündelt libvips und dessen Abhängigkeiten, einschließlich librsvg. Eine Aktualisierung der Systemkopie von librsvg kann dazu führen, dass Ihre App weiterhin die alte Version verwendet.
Der UAF-PoC enthält einen SVG-Generator für mehrere Eingabepfade und kann verwendet werden, um den Use-after-free am Anfang der Kette zu überprüfen.
Der EQSTLab Next.js ImageResponse RCE-PoC ist ein funktionierendes Beispiel dieser Kette für seinen festgelegten Node.js/Sharp-Build. Er generiert und sendet die Payload automatisch. Ein funktionierender Exploit ist jetzt öffentlich, aktualisieren Sie also betroffene Abhängigkeiten oder entschärfen Sie den Eingabepfad so schnell wie möglich.
[!WARNING] Es gibt keinen universellen RCE-PoC für diese Kette. Das EQSTLab-Beispiel zielt auf seinen festgelegten Build ab; andere Ziele benötigen möglicherweise andere Payloads. PoCs, die auf SVG
<foreignObject>für die Befehlsausführung setzen, demonstrieren nicht die hier beschriebene Kette.
Für die erste Validierung auf anderen Zielen ist der UAF-PoC praktischer. Ich werde in den kommenden Wochen außerdem den technischen Write-up veröffentlichen, mit den Schritten vom UAF bis zur Befehlsausführung und einer Post-Mortem-Analyse, die diesen vergangenen Monat der Forschung an der Kette abdeckt.