
انحدار مستقل دون اتصال لـ CVE-2026-44431 عبر إصدارات urllib3 المثبتة، مع نسب الإبلاغ الأصلي.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · أُعيد إنتاجه في 27 سبتمبر 2026
يحمل الطلب ثلاث ترويسات حساسة إلى أصل واحد. تغيّر إعادة التوجيه الوجهة. فهل لا يزال الطلب التالي يحملها؟
تُشغّل هذه الاختبارات الانحدارية المستقلة تنفيذ إعادة التوجيه الفعلي من إصدارين محددين من urllib3. يحتفظ الإصدار 2.6.3 بالترويسات الثلاث جميعها عبر واجهة المستوى المنخفض المتأثرة. أما الإصدار 2.7.0 فيزيلها. وتبقى ترويسة حميدة على قيد الحياة، ولا تزال الطلبات العادية تعمل.
| الحالة | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| إعادة توجيه عبر الأصول من المستوى المنخفض | الاحتفاظ بـ 3 ترويسات حساسة | الاحتفاظ بـ 0 |
| الحالة نفسها بأسماء بحروف صغيرة | الاحتفاظ بـ 3 | الاحتفاظ بـ 0 |
| ضابط واجهة المستوى العالي | الاحتفاظ بـ 0 | الاحتفاظ بـ 0 |
| استجابة 200 مباشرة | الاحتفاظ بـ 3 كما هو مقصود | الاحتفاظ بـ 3 كما هو مقصود |
| إعادة التوجيه معطّلة صراحةً | استدعاء واحد؛ إرجاع 302 | استدعاء واحد؛ إرجاع 302 |
| مجموعة الإزالة المخصصة تضيف علامة حميدة | الاحتفاظ بالترويسات الأربع جميعها | إزالة الأربع جميعها |
اجتازت 12/12 من توقعات السيناريوهات. يتحقق كل سيناريو أيضًا من حالة الاستجابة، وعدد استدعاءات النقل، ومجموعة الترويسات الأولية، ونتيجة الترويسة الحميدة، وعدم تحوّل ترويسات المستدعي. النتيجة الثغرة هي نتيجة أساس متوقعة، وليست فحصًا أمنيًا ناجحًا.
تتضمن النتائج القابلة للقراءة آليًا الوسائط الملتقطة، وتجزئات wheels الدقيقة، وبيئة التشغيل، وتجزئات مصدر الاختبار، والإسناد، ووقت إعادة الإنتاج.
تحدد الاستشارة الأصلية، المنشورة في 7 مايو 2026، مشكلة تعرّض للمعلومات في مسار إعادة التوجيه من المستوى المنخفض عبر الوكيل في urllib3. وتُدرج الإصدارات >=1.23, <2.7.0 كمتأثرة. قد يؤدي استدعاء ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) إلى نقل الترويسات الحساسة المُهيّأة إلى طلب مُعاد توجيهه إلى أصل آخر. وقد كانت واجهة المدير عالية المستوى تزيلها بالفعل.
يطبّق الإصلاح الأصلي الدالة Retry.remove_headers_on_redirect قبل الطلب العودي من المستوى المنخفض. وتتبع حالة الترويسات ذات الحروف الصغيرة لدينا اهتمام الاختبار الانحداري الأصلي بحالة أحرف أسماء الترويسات. وتتحقق حالة الإزالة المخصصة من أن القاعدة تحترم المجموعة المُهيّأة، بما يتجاوز الأسماء الافتراضية الثلاثة فقط.
تشير الاستشارة إلى christos-cantina-security كمُبلّغ، وillia-v كمنسّق، وsethmlarson كمراجع للإصلاح. ومساهمة Sergio Rodriguez هنا هي أداة الاختبار المستقلة دون اتصال والتحليل قبل/بعد. وهذا إعادة إنتاج لـ CVE المنشور الخاص بهم.
استخدم Python 3.10 أو أحدث. لا حاجة إلى pip install أو بيئة افتراضية: يُستورد كل إصدار مباشرةً من wheel الخاص به المكتوب بلغة Python الخالصة في عملية فرعية معزولة جديدة.
من جذر مستودع المحفظة:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
يقوم الأمر الأول بتنزيل الـ wheels الدقيقتين إلى دليل .cache/wheels/ المتجاهَل في المختبر ويتحقق من تجزئات SHA-256 الخاصة بهما مقابل البيان. ويستخدم الأمر الثاني ذلك المخزّن المؤقت دون تنزيل. لنسخة مصدرية مستقلة، شغّل python -B run_replay.py --fetch، ثم الأمر نفسه دون --fetch. ويقبل --cache دليل مخزّن مؤقت محلي مختلف.
يُستبدل HTTPConnectionPool._make_request بنقل ذي استجابتين: استجابة 302 بموقع ثابت، ثم استجابة 200. وتلتقط الحالة الوسائط الواصلة إلى ذلك الحد. ويُنفَّذ تحليل urllib3، وسياسة إعادة المحاولة، وتصفية الترويسات، ومعالجة إعادة التوجيه العودية دون تغيير من الـ wheel المحدد.
جميع الوجهات أسماء .invalid محجوزة ثابتة؛ وجميع قيم الترويسات تبدأ بـ DUMMY. وترفع دوال إنشاء المقابس و DNS فورًا. ويُرفض فحص قدرة IPv6 عند الاستيراد في المكتبة ويُسجَّل بشكل منفصل؛ ولا تحاول سيناريوهات إعادة التشغيل أي عمليات شبكية. لا يوجد خادم يستمع أو هدف حي.
يتحقق هذا من معالجة وسائط إعادة التوجيه. ولا يقيس حركة مرور الوكيل من طرف إلى طرف. الإصدار 2.7.0 هو أول إصلاح لهذا الـ CVE تحديدًا؛ وهذه المقارنة التاريخية ليست توصية باختياره على الإصدارات المدعومة الأحدث.
نصوص الحالات والتحليل هي عمل أصلي ضمن المحفظة. urllib3 مشروع أصلي موزّع تحت رخصة MIT؛ ولا يُعاد توزيع شفرته و wheels إصداراته في أرشيف مصدر المحفظة. بل تُنزَّل بشكل منفصل من PyPI وتُستورد دون تغيير للتجربة.