
CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF عبر URL الاستجابة / قراءة ملف محلي. مصدر غير موثوق، وليس المطالبة. مولد آمن + اكتشافات. تم الإصلاح في 1.1.1/1.2.2.
المورد العلوي غير الموثوق: المزوّد الذي جلب عنوان URL الذي أخبرته به استجابته.
مزود OpenAI الخاص بـ Drupal (ai_provider_openai) · SSRF (CWE-918) · CVE-2026-13233 · SA-CONTRIB-2026-053
الحالة: الإفصاح المنسق مكتمل (2026-07-10). تم الإبلاغ بشكل خاص لفريق أمان Drupal، وتم الإصلاح، ونشر باسم CVE-2026-13233 / الإشعار SA-CONTRIB-2026-053 (مصنف على أنه حرج بشكل معتدل). تم منح الفضل للمؤلف كـ مكتشف ومطور تصحيح.
دراسة لـ خلل كلاسيكي في التفويض/التحقق من الإدخال على 'نقطة اتصال' AI: قام مزود توليد الصور بالذكاء الاصطناعي بجلب عنوان URL الموجود في استجابة API للمورد العلوي باستخدام دالة عامة بدون قائمة مسموح بها من المخططات. في النشرات حيث المورد العلوي المُهيأ ليس الافتراضي الموثوق (نقطة نهاية خاصة بك / وكيل / بوابة مستضافة ذاتيًا / مرحل مخترق)، يمكن للاستجابة توجيه الخادم إلى file:// أو عنوان داخلي.
المدخل غير الموثوق الذي يصل إلى المصب هو عنوان URL لاستجابة المورد العلوي — وليس حث المستخدم.
file:// لملف محلي؛ كما قام تحليل المؤلف الداخلي بربطه بـ CWE-73 / CWE-441.3.1 / شرطي 5.3 (متوسط)؛ تم سحب تقييمات سابقة 6.5 / 7.4، وأكد التصنيف المتوسط ذلك.ai_provider_openai) < 1.1.1 و 1.2.0–1.2.1 (تم تدقيق 1.2.1) على نواة Drupal 11.2جميع عمليات التحقق تمت في صندوق رمل معزول خاص بالشبكة مقابل مورد علوي وهمي. لم يتم استدعاء واجهة برمجة تطبيقات OpenAI الحقيقية مطلقًا. كانت مؤشرات التسريب تركيبية فقط.
تم تأكيده (إثبات ديناميكي):
settings.php عبر مطابقة sha256 (35,182 بايت) — لم يتم طباعة المحتوى مطلقًا؛ وبالتالي فإن بيانات اعتماد قاعدة البيانات ضمن النطاق.غير مؤكد (لم يتم الادعاء به صراحة):
غير متأثر: api.openai.com الافتراضي عبر TLS. إعداد host يتحكم به المسؤول / مزامنة التهيئة / النشر — لا يمكن للمهاجم غير المسؤول أثناء التشغيل تغييره.
تم تمرير عنوان URL للاستجابة إلى جلب عام يكرم كل غلاف تيار PHP المسجل (file، php، http، data، phar، …). response_format الافتراضي هو url، لذا فإن الفرع الضعيف هو المسار الافتراضي. file:// هو غلاف نظام الملفات الافتراضي لـ PHP و لا يُقيَّد بواسطة allow_url_fopen (ادعاء سابق بـ "يتطلب allow_url_fopen" كان خاطئًا وتم سحبه).
أصلح الأساسية، وليس موقع الاستدعاء فقط:
http/https قبل الطلب؛ عطّل إعادة التوجيه (يمكن لـ 30x إعادة التوجيه إلى file://).file://…، http://169.254.169.254/…، وإعادة توجيه 302→file://.الاتجاه الكامل: docs/fix-direction.md.
.
├── README.md # هذا الملف (إنجليزي، رسمي)
├── README_ja.md # نسخة يابانية
├── SECURITY.md # سياسة الإبلاغ + إخلاء مسؤولية الإفصاح المسؤول
├── .gitignore # يمنع ارتكاب الأسرار/الأدلة الأولية
├── docs/
│ └── fix-direction.md # إصلاح السبب الجذري + بحث المتغيرات + مسودة الفرق الأدنى (إنجليزي)
├── reproducer/ # أداة إعادة إنتاج آمنة فقط (صندوق رمل، خادم علوي وهمي، مؤشر غير ضار)
│ ├── README.md # كيفية إعداد صندوق الرمل المعزول عن الشبكة
│ ├── verdict.md # ماذا يعني "النجاح": تطابق البايتات الخام + 200-vs-403 + رموز الخروج
│ ├── mock-openai-server.py # خادم وهمي غير ضار؛ المسار السعيد الافتراضي PNG، ssrf_demo → file:///etc/hostname فقط
│ └── docker-compose.yml # قالب: صندوق رمل Drupal معزول + خادم وهمي (أنت تضيف الهدف الضعيف)
├── detections/
│ ├── README.md
│ ├── sigma/web-egress-to-internal-after-imagegen.yml
│ ├── sigma/php-sensitive-file-open.yml
│ ├── sentinel/imagegen-egress-correlation.kql
│ └── splunk/imagegen-content-type-mismatch.spl
└── timeline.md # الجدول الزمني للإفصاح (مصدر واحد للحقيقة)
المستندات حالياً باليابانية (
.ja.md)؛ الترجمات الرسمية الإنجليزية قيد الإنجاز. محجوب من هذا المستودع: حمولات التسلح وأي دليل على قراءة ملف جاهز للاستخدام. تُظهرreproducer/العامة آلية الخلل مقابل خادم وهمي باستخدام مؤشر واحد غير ضار (/etc/hostname) — لا قراءة لمسار عشوائي، ولا استيلاء علىsettings.php، ولا IMDS. إنها ليست سلاحاً ضد المواقع المباشرة. حدّث إلى 1.1.1 / 1.2.2.
الهدف: السماح للباحث بتأكيد فئة الخلل دون تقديم استغلال لهدف حي أو كشف أسرار. كل شيء يعمل دون اتصال.