
tough-cookie المُصحح v2.5.0 لإصلاح ثغرة تلوث النموذج الأولي CVE-2023-26136 باستخدام Object.create(null) في MemoryCookieStore، بما في ذلك عرض الاستغلال واختبارات الوحدة.
يحتوي هذا المستودع على نسخة مُصحَّحة من حزمة tough-cookie، الإصدار 2.5.0، لمعالجة الثغرة الحرجة تلوث النموذج الأولي (CVE-2023-26136). تسمح هذه الثغرة للمهاجمين بالتلاعب بسلسلة النموذج الأولي عن طريق حقن خصائص في كائنات JavaScript. قد يؤدي ذلك إلى سلوك غير متوقع، ومخاطر أمنية مثل تنفيذ التعليمات البرمجية عن بُعد، ومشاكل توافق في التطبيقات التي تعتمد على هذه الحزمة.
الإصدارات الأقدم من حزمة tough-cookie قبل v4.1.3 معرضة لـ تلوث النموذج الأولي عند استخدام CookieJar بوضع rejectPublicSuffixes=false. تنشأ الثغرة من معالجة غير صحيحة لملفات تعريف الارتباط، وتحديداً عندما يتم تعيين cookie.domain إلى __proto__. يسمح هذا للمهاجمين بتعديل كائن Object.prototype الأساسي، مما قد يتسبب بمشاكل واسعة النطاق عبر التطبيق.
لمزيد من التفاصيل حول CVE-2023-26136، اطّلع على:
يمكن أن يؤدي تلوث النموذج الأولي إلى عدة مخاطر حرجة، بما في ذلك:
الثغرات الأمنية: من خلال تعديل Object.prototype الأساسي، يمكن للمهاجمين التلاعب بسلوك الكائنات، مما قد يُتيح رفع الصلاحيات، الوصول إلى بيانات حساسة، أو تجاوز آليات الأمان في التطبيق.
حرمان الخدمة (DoS): يمكن أن يتسبب تلويث سلسلة النموذج الأولي بسلوك غير متوقع في النظام، مما يؤدي إلى أعطال، حلقات لا نهائية، أو استنزاف الموارد، مما يجعل التطبيق غير متاح للمستخدمين الشرعيين.
مشاكل التوافق: تغيير Object.prototype يمكن أن يُحدث أخطاء وسلوكاً غير متوقع عند التفاعل مع مكتبات أو أطر عمل أخرى. قد تتعطل التبعيات التي تعتمد على سلاسل النموذج الأولي، مما يؤدي إلى مشاكل تكامل أو سلوك تطبيق خاطئ أثناء التحديثات.
سلوك تطبيق غير متوقع: يمكن أن يؤدي تلوث النموذج الأولي إلى سلوك برمجي غير منتظم، بما في ذلك فساد البيانات، خروقات أمنية، وربما تعريض التطبيق لمزيد من الاستغلال.
يتضمن التصحيح تعديل فئة MemoryCookieStore، وتحديداً طريقة putCookie، لمنع تلوث النموذج الأولي عن طريق إنشاء كائنات بدون نموذج أولي. التغييرات الرئيسية تشمل:
Object.create(null) بدلاً من {} لإنشاء كائنات بدون نموذج أولي.cookie.domain = __proto__.لتثبيت النسخة المُصحَّحة من tough-cookie، استخدم الأمر التالي:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
يتضمن هذا المستودع اختبار وحدة مصمم للتحقق من نجاح معالجة ثغرة تلوث النموذج الأولي.
الاختبار، المسمى prototype_pollution_test، يتحقق تحديداً من أن تعيين ملفات تعريف الارتباط بنطاق __proto__ لم يعد يؤثر على سلسلة النموذج الأولي في JavaScript. يضمن ذلك منع تلوث النموذج الأولي، مما يحافظ على سلامة التطبيق.
لتشغيل الاختبارات وتأكيد الإصلاح، نفّذ الأمر التالي:
npm test
لتوضيح الاستغلال في كل من النسخة الأصلية والمنقحة، اتبع الخطوات أدناه:
قم بتثبيت النسخة المعرضة للثغرة من tough-cookie:
npm install [email protected] && node index.js
المخرجات المتوقعة:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
يشير هذا إلى أن النموذج الأولي لكائن قد تم تلويثه، مما يؤكد وجود الثغرة في النسخة الأصلية.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
المخرجات المتوقعة:
EXPLOIT FAILED
يظهر هذا أن الاستغلال قد تم منعه بنجاح، مما يؤكد إصلاح ثغرة تلوث النموذج الأولي.
تضمنت عملية معالجة ثغرة تلوث النموذج الأولي في tough-cookie v2.5.0 عدة خطوات منهجية لضمان أن الإصلاح كان شاملاً وفعالاً. فيما يلي نظرة عامة على النهج الذي اتبعته:
بدأت بالبحث عن تلوث النموذج الأولي (CVE-2023-26136) لفهم تأثيره. تسمح الثغرة للمهاجمين بحقن خصائص في سلسلة النموذج الأولي عبر خاصية cookie.domain، مما قد يتسبب في مخاطر أمنية مثل تنفيذ التعليمات البرمجية عن بُعد.
استكشفت المشكلات والمناقشات على GitHub حول الثغرة، بما في ذلك الإصلاح في tough-cookie v4.1.3، الذي يستخدم Object.create(null) لمنع تلوث النموذج الأولي. ساعدني هذا في تحديد التغييرات اللازمة لإصلاح v2.5.0.
قارنت بين v2.5.0 و v4.1.3 لفهم الاختلافات وتحديد التغييرات الضرورية. التعديل الرئيسي تضمن استخدام كائنات بدون نموذج أولي لمنع الاستغلال.
قمت بتحديث فئة MemoryCookieStore لاستخدام Object.create(null) بدلاً من {}، مما يضمن عدم حدوث تلوث النموذج الأولي.
كتبت اختبارات وحدة للتحقق من الإصلاح، وأنشأت نصاً برمجياً لعرض الاستغلال (index.js) لإظهار كيف يتم منع الثغرة في النسخة المُصحَّحة.
أخيراً، قمت بتوثيق الإصلاح، بما في ذلك تعليمات التثبيت والاختبار، وحزم النسخة المُصحَّحة (tough-cookie-2.5.0-PATCHED.tgz) لتسهيل التوزيع.
الملفات المضافة/المعدلة من v2.5.0
index.js: النص البرمجي الرئيسي لعرض الثغرة والإصلاح.lib/memstore.js: فئة MemoryCookieStore المعدلة لمنع تلوث النموذج الأولي.test/ietf_data/parser.json: تم تحديثه لتعديل التواريخ القديمة في بيانات الاختبار.test/prototype_pollution_test.js: اختبارات وحدة للتحقق من إصلاح تلوث النموذج الأولي.tough-cookie-2.5.0-PATCHED.tgz: النسخة المُصحَّحة من حزمة tough-cookie.