جوهر المشكلة يكمن في خطأ منطقي داخل Starlette أثناء إعادة بناء عنوان URL للطلب. عندما يصلك طلب HTTP، يقوم الموجّه (Router) بتوجيه الطلب بناءً على المسار الخام الموجود في سطر الطلب. لكن لاحقًا، عندما يتحقق تطبيقك من صلاحية المستخدم، فإنه يسأل الكائن request.url. هنا مكمن الخطر: يقوم Starlette بإعادة بناء هذا العنوان عبر دمج ترويسة Host القادمة من المهاجم مع مسار الطلب، دون أدنى تدقيق .
يمكن للمهاجم استغلال ذلك بإرسال طلب إلى مسار محمي مثل /admin/secure لكن مع ترويسة Host مسمومة على النحو التالي:
Host: legitimate.com/health?x=
النتيجة مذهلة: الموجّه يُرسل الطلب بشكل صحيح إلى معالج المسار السري /admin/secure. ولكن حين يحين وقت فحص التفويض، يقرأ الوسيط الأمني (Authorization Middleware) المسار من request.url.path فيجد أنه يشير إلى /health! لو كان هذا المسار مدرجًا في قائمة بيضاء كفحص صحي عام، فإن المخترق يعبر دون أي كلمة مرور أو رمز دخول .
فريق X41 D-Sec لخص الثغرة بعبارة بليغة: "ببساطة، إدراج حرف واحد في ترويسة HTTP Host يكفي لخداع الخادم" .
هذه الثغرة ليست مجرد خطأ برمجي في مكتبة عادية. Starlette هي المحرك الخفي الذي يستخدمه جل مطوري بايثون، حيث يُحمل ما يقارب 325 مليون مرة أسبوعيًا. جميع المشاريع التي تعتمد على إصدارات Starlette الأقدم من 1.0.1 متأثرة بشكل مباشر .
أبرز الأنظمة المهددة تشمل:
أثار التقييم الرسمي لهذه الثغرة جدلاً واسعًا في أوساط الأمن السيبراني:
ثلاثة عوامل تجعل تقييم 6.5 خطيرًا ومضللاً:
أصدر فريق Encode الإصدار Starlette 1.0.1 في 22 مايو 2026 وهو يوفر الإصلاح الشامل. التصحيح مُسجل في النشرة الأمنية على GitHub تحت اسم GHSA-86qp-5c8j-p5mr .
ماذا يفعل التصحيح تحديدًا؟
request.url Host مشوهة، يتجاهلها Starlette ويعود لاستخدام scope["server"] (بيانات اتصال الخادم الحقيقية)، مما يضمن أن request.url.path تعكس دائمًا المسار الفعلي المطلوب الترقية هي خط الدفاع الأول ولكن الحماية الشاملة تتطلب إجراءات فورية متعددة:
التصحيح الفوري: في كل بيئة افتراضية وصورة حاوية ومسار نشر، نفذ:
pip install --upgrade starletteوأعد تشغيل جميع الخدمات المتأثرة. هذا يشمل تثبيتات Starlette المباشرة وكذلك FastAPI وvLLM وLiteLLM وخوادم MCP .
تثبيت ومراجعة تبعيات المشروع: أطر العمل مثل FastAPI قد لا تفرض تلقائيًا الإصدار الأدنى من Starlette، بل تكتفي بنطاق واسع. يجب التصريح بشكل صريح بـ starlette>=1.0.1 في ملفات requirements.txt أو pyproject.toml أو poetry.lock. استخدم الأمر pip list | grep starlette.
فحص كل مكون في حزمة AI: أي خدمة Python تقدم HTTP، مثل تطبيقات FastAPI المخصصة أو نقاط نهاية استدلال LLM أو وكلاء التنسيق أو الوكلاء المتوافقين مع OpenAI، قد تحوي إصدارًا ضعيفًا من Starlette. أجرِ تدقيقًا بنيويًا كاملاً .
تحصين الخوادم الوسيطة وجدران الحماية (WAF): اضبط إعدادات nginx، Envoy، HAProxy، Cloudflare، أو AWS ALB لرفض أو تطهير ترويسات Host المشوهة قبل أن تصل لتطبيق Python. هذا يوفر دفاعًا عميقًا يمنع الاستغلال حتى لو تأخر التصحيح الأساسي .
تعديل منطق التأمين: الخلل الجذري كان عدم التطابق بين مسار التوجيه وrequest.url.path. حيثما أمكن، غيّر أكواد التأمين الوسيطة لتعتمد على request.scope["path"] الآتي من سياق ASGI الخام وغير القابل للتسميم عبر ترويسة Host . ينصح فريق X41 D-Sec بالابتعاد عن التأمين المبنى على المسار أصلاً والتوجه نحو آليات تحقق ملازمة لنقاط النهاية
.
اختبار التعرض: أصدر الباحثون ماسحًا ضوئيًا عبر الإنترنت لمساعدة المؤسسات في معرفة ما إذا كانت خوادمها عرضة للهجوم . استخدم هذا الماسح مع اختبار اختراق شامل حول حدود المصادقة.
Comments
0 comments