
بحث فروق التصحيحات (patch-diff) لقضايا urllib3 المنشورة: إصدارات مثبّتة، وأدوات اختبار أصلية دون اتصال، وسلوك قبل/بعد، وضوابط غير ضارة.
أنشأه ويصونه Sergio Rodriguez (SSH-PuR66). أدوات التجربة والتحليل من إعدادي؛ أما الثغرات المنشورة وشيفرة urllib3 والإصلاحات الأصلية فتحتفظ بإسنادها الأصلي.
منهجية بحث المؤلف · أداة إعادة توجيه · دراسة تأطير المقاطع
يغيّر إعادة التوجيه الوجهة بينما تبقى ثلاثة ترويسات حساسة ملتصقة. ويقبل محلّل التأطير مدخلات يرفضها الإصدار التالي. يحوّل Afterimage إصلاحات البروتوكول المنشورة إلى تجارب صغيرة قبل/بعد قابلة للفحص.
بنيتُ أدوات التجربة وحالات التحكم حول إصدارات urllib3 مثبّتة وغير معدّلة. تسجّل كل نتيجة تجزئة الحزمة والسلوك الملتقط وحدود العيّنة والإسناد الأصلي.
| الدراسة | الإصدارات المقارنة | المجموعة المسجّلة | الفحص |
|---|---|---|---|
| حدود ترويسة إعادة التوجيه · CVE-2026-44431 | urllib3 2.6.3 / 2.7.0 | 12 حالة، تشمل السلوك المتأثر وضوابط سليمة | النتائج · أداة التجربة |
| تأطير المقاطع · CVE-2026-97689 | urllib3 2.7.0 / 2.8.0 | 32 حالة محدودة دون اتصال | المنهجية والنتائج |
نوع البحث: إعادة إنتاج مستقلة لمشكلات منشورة. الحدود المقاسة: معالجة وسائط المكتبة وسلوك التأطير في الذاكرة. تظل قابلية استغلال التطبيق واستنزاف الموارد خارج نطاق نتائج هذه العيّنات.
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 من توقعات السيناريوهات. يتحقق كل سيناريو أيضًا من حالة الاستجابة وعدد استدعاءات النقل ومجموعة الترويسات الأولية ونتيجة الترويسة السليمة وأن ترويسات المستدعي لم تُعدَّل. النتيجة المتأثرة هي نتيجة أساس متوقعة، وليست فحصًا أمنيًا ناجحًا.
تتضمن النتائج القابلة للقراءة آليًا الوسائط الملتقطة وتجزئات ملفات wheel الدقيقة وبيئة التشغيل وتجزئات مصدر الاختبار والإسناد ووقت إعادة الإنتاج.
يحدد التنبيه الأصلي، المنشور في 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 الخالصة في عملية فرعية معزولة جديدة.
من جذر مستودع portfolio:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
يقوم الأمر الأول بتنزيل الملفين الدائريين (wheels) المحددين بدقة إلى دليل .cache/wheels/ المتجاهَل في المختبر، ويتحقق من تجزئات SHA-256 الخاصة بهما مقابل البيان (manifest). ويستخدم الأمر الثاني ذاكرة التخزين المؤقت هذه دون تنزيل. بالنسبة لنسخة مصدرية مستقلة، شغّل python -B run_replay.py --fetch، ثم نفس الأمر دون --fetch. يقبل --cache دليل ذاكرة تخزين مؤقت محليًا مختلفًا.
يُستبدَل HTTPConnectionPool._make_request بنقل ذي استجابتين: استجابة 302 بموقع ثابت، ثم استجابة 200. وتلتقط أداة التثبيت (fixture) الوسائط التي تصل إلى ذلك الحد. وتُنفَّذ عمليات التحليل في urllib3، وسياسة إعادة المحاولة، وتصفية الترويسات، ومعالجة إعادة التوجيه المتكررة دون تغيير من الملف الدائري المحدد.
جميع الوجهات أسماء .invalid محجوزة وثابتة؛ وجميع قيم الترويسات تبدأ بـ DUMMY. وتُطلق دوال إنشاء المقابس (sockets) وDNS استثناءً فورًا. ويُرفض فحص قدرة IPv6 الذي تجريه المكتبة عند الاستيراد ويُسجَّل بشكل منفصل؛ ولا تحاول سيناريوهات الإعادة أي عمليات شبكية. لا يوجد خادم يستمع ولا هدف حي.
يتحقق هذا من معالجة وسائط إعادة التوجيه. ولا يقيس حركة المرور عبر الوكيل من طرف إلى طرف. الإصدار 2.7.0 هو أول إصلاح لهذه الثغرة CVE تحديدًا؛ وهذه المقارنة التاريخية ليست توصية باختياره على الإصدارات المدعومة الأحدث.
سكربتات أداة التثبيت والتحليل هي عمل أصلي ضمن ملف الأعمال (portfolio). وurllib3 مشروع منبعي يُوزَّع بموجب رخصة MIT الخاصة به؛ ولا يُعاد توزيع شيفرته وملفاته الدائرية للإصدارات في أرشيف مصدر ملف الأعمال. بل تُنزَّل بشكل منفصل من PyPI وتُستورد دون تغيير لإجراء التجربة.