
CVE-2026-33693: SSRF عبر تجاوز 0.0.0.0 في activitypub-federation-rust v4_is_invalid() (CVSS 6.5 متوسطة)
v4_is_invalid() في activitypub-federation-rust (CVSS 6.5 متوسط)
الكلمات الدالة: SSRF، 0.0.0.0، تجاوز التحقق من عنوان IP، activitypub-federation، Lemmy، Rust، ActivityPub
توجد ثغرة من نوع تزوير الطلبات من جانب الخادم (SSRF) في مكتبة activitypub-federation-rust (المستخدمة من قبل Lemmy و 6+ مشاريع تابعة) بسبب فحص غير مكتمل لعناوين IP في الدالة v4_is_invalid(). لا تستدعي الدالة is_unspecified()، مما يسمح للمهاجم بتجاوز حماية SSRF عن طريق استهداف 0.0.0.0 — الذي يُحوّل إلى المضيف المحلي (localhost) على معظم الأنظمة.
activitypub_federation (Rust/cargo)تتحقق الدالة v4_is_invalid() في src/utils.rs من عناوين IPv4 لمنع الوصول إلى الشبكة الداخلية. تفحص العناوين الحلقية (127.0.0.0/8)، والنطاقات الخاصة (10.0.0.0/8، 172.16.0.0/12، 192.168.0.0/16)، والرابط المحلي (169.254.0.0/16)، والعناوين البثية (255.255.255.255)، ولكن لا تفحص العنوان غير المحدد 0.0.0.0.
على معظم الأنظمة، يُحوّل 0.0.0.0 إلى واجهة الاسترجاع (loopback)، مما يمنح نفس الوصول مثل 127.0.0.1.
نتيجة ثانوية: توجد أيضًا ثغرة من نوع إعادة ربط DNS / TOCTOU حيث تقوم lookup_host() بحل اسم المضيف والتحقق من IP، لكن استدعاء منفصل reqwest يقوم بحل DNS ثانٍ — مما يسمح للمهاجم بتقديم IP آمن أولاً، ثم إعادة الربط إلى IP داخلي عند الحل الثاني.
src/utils.rs)fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
// مفقود: || ip.is_unspecified() <- 0.0.0.0 غير محظور
}
fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
|| ip.is_unspecified() // <- الآن يمنع 0.0.0.0
}
+---------------------------------------------------+
| SSRF عبر تجاوز 0.0.0.0 |
+---------------------------------------------------+
| |
| 1. يستضيف المهاجم كائن ActivityPub مع |
| رابط يشير إلى http://0.0.0.0:<port>/path |
| |
| 2. يجلب مثيل Lemmy الكائن عبر |
| activitypub-federation-rust |
| |
| 3. تتحقق v4_is_invalid() من عنوان IP: |
| x is_loopback() -> false (ليس 127.x) |
| x is_private() -> false (ليس RFC1918) |
| x is_link_local() -> false (ليس 169.254.x) |
| x is_broadcast() -> false (ليس 255.x) |
| x is_unspecified() -> لم يتم الفحص |
| النتيجة: 0.0.0.0 ينجح التحقق |
| |
| 4. يتم إرسال الطلب إلى 0.0.0.0 -> يُحوّل إلى |
| localhost -> الوصول إلى الخدمات الداخلية |
| |
| 5. يتم إرجاع بيانات الخدمة الداخلية للمهاجم |
| عبر استجابة الموافقة الفيدرالية ActivityPub |
| |
+---------------------------------------------------+
التعرض للأسفل: تُستخدم حزمة activitypub-federation-rust في 6+ مشاريع في نظام Fediverse البيئي:
يمكن للمهاجم:
activitypub-federation يحتوي على الإصلاح من PR #162يُحفظ هذا المستودع للأغراض التعليمية والدفاعية كجزء من الإفصاح المسؤول عن الثغرات. تم الإبلاغ عن الثغرة عبر عملية الإبلاغ عن الثغرات الخاصة في GitHub (PVRT). لم يتم إجراء أي استغلال ضد أنظمة الإنتاج. تم إجراء جميع الاختبارات في بيئات معزولة.
الكتابة الكاملة لهذا المشروع، والمنهجية، والبحوث ذات الصلة موجودة في:
https://snailsploit.com/security-research/cves/cve-2026-33693/
تم الإنشاء بواسطة Kai Aizen — باحث أمني هجومي مستقل.
snailsploit.com · البحوث · الأطر · GitHub · LinkedIn · ResearchGate · X/Twitter
نفس الهجوم. ركيزة مختلفة.
| المشروع | النجوم | الوصف |
|---|
| Lemmy | 13.7K+ | مجمع روابط لـ Fediverse |
| hatsu | -- | جسر ActivityPub |
| gill | -- | استضافة Git مع التمويل الفيدرالي |
| ties | -- | شبكات اجتماعية |
| fediscus | -- | مناقشات فيدرالية |
| fediverse-axum | -- | إطار عمل ActivityPub |
| المقياس | القيمة |
|---|
| متجه الهجوم | شبكي |
| تعقيد الهجوم | منخفض |
| الامتيازات المطلوبة | لا شيء |
| تفاعل المستخدم | لا شيء |
| النطاق | غير متغير |
| السرية | منخفضة |
| النزاهة | منخفضة |
| التوفر | لا شيء |
| متجه CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| النتيجة | 6.5 (متوسط) |
| التاريخ | الحدث |
|---|
| 2026-03-11 | تم الإبلاغ عن الثغرة عبر GitHub PVRT |
| 2026-03-13 | أكد المشرف على النتيجة |
| 2026-03-13 | تم تقديم إصلاح PR #162 |
| 2026-03-13 | تم إغلاق الاستشارة عن طريق الخطأ |
| 2026-03-16 | أعيد فتح الاستشارة |
| 2026-03-23 | تم تعيين CVE-2026-33693 ونشر الاستشارة |