
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 Vulnerability-Chain, die mit einem Use-after-free beginnt, den ich (@rafabd1) in librsvg gefunden habe (CVE-2026-96889). In einem Node.js/Sharp/libvips-Build führte dieser Bug zur Befehlsausführung. Es behandelt den Bug, die bisher in Anwendungen bestätigten Pfade und die jetzt verfügbaren Fixes.
Ein SVG kann über XInclude ein weiteres SVG einbinden. Im verwundbaren Pfad beginnt librsvg mit dem Parsen eines eingebundenen Dokuments, während libxml2 noch eine Entity im äußeren Dokument expandiert. Wenn das eingebundene SVG eine Entity mit demselben Namen deklariert, ersetzt und gibt librsvg die erste Entity 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 Schreibzugriffe ihn korrumpieren 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 passieren, wenn eine Anwendung eine SVG-Datei akzeptiert, aber auch, wenn die Anwendung ein SVG aus Benutzereingaben erzeugt. Allein die 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-Bug 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.
Während dieser Recherche identifizierte ich betroffene Eingabepfade in mehreren nachgelagerten Produkten und bestätigte die Befehlsausführung in einigen davon, einschließlich des oben beschriebenen Next.js-Falls. Wie diese Eingabe librsvg erreicht, variiert von Produkt zu Produkt. Deshalb kann ein Upstream-Bug in einem Bildparser an Stellen auftauchen, die auf den ersten Blick nicht zusammenhängen; der jüngste libheif-Fall ist ein weiteres Beispiel. Das bedeutet nicht, dass jedes Produkt, das librsvg verwendet, aus der Ferne ausnutzbar ist.
ImageResponse-Pfad einfügt. Aktualisieren Sie auf 16.3.6.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 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 Chain zu überprüfen.
Bisher habe ich keinen öffentlichen Exploit gefunden, der diese Chain vollständig von präpariertem SVG bis zur Befehlsausführung durchläuft. Der Bug und die Patches sind jedoch bereits öffentlich, und mit aktuellen KI-Tools ist es relativ einfach, daraus die vollständige Chain zurückzuentwickeln. Behandeln Sie den Exploit daher so, als wäre er bereits öffentlich, und aktualisieren Sie betroffene Abhängigkeiten oder entschärfen Sie den Eingabepfad so schnell wie möglich.
[!WARNING] Es gibt keinen universellen RCE-PoC für diese Chain; die Payload muss für jedes Ziel angepasst werden. Die meisten öffentlichen „PoCs", die ich bisher gesehen habe, reproduzieren nicht die tatsächliche RCE-Chain. Einige stützen sich auf SVG
<foreignObject>für die behauptete Ausführung, was nicht der hier beschriebene Exploit-Pfad ist.
Für die erste Validierung ist der UAF-PoC praktischer. Ich plane, einen RCE-PoC für den Next.js-Fall (CVE-2026-94545) in einem separaten Repository zu veröffentlichen. Außerdem werde ich in den kommenden Wochen den technischen Write-up veröffentlichen, mit den Schritten vom UAF zur Befehlsausführung und einem Post-Mortem, der diesen vergangenen Monat der Recherche zur Chain abdeckt.