
إصلاح حزمة المصدر المفتوح التي تستخدم tough-cookie 2.5.0 - CVE-2023-26136،
الإصدارات من الحزمة tough-cookie قبل 4.1.3 معرّضة لثغرة تلوّث النماذج الأولية (Prototype Pollution) بسبب المعالجة غير الصحيحة لملفات تعريف الارتباط عند استخدام CookieJar في وضع rejectPublicSuffixes=false. تنشأ هذه المشكلة من الطريقة التي يتم بها تهيئة الكائنات.
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
تلوّث النماذج الأولية (Prototype Pollution) هو ثغرة تؤثر على JavaScript. يشير تلوّث النماذج الأولية إلى القدرة على حقن خصائص في النماذج الأولية لبنى لغة JavaScript الموجودة، مثل الكائنات. تسمح JavaScript بتغيير جميع سمات الكائن، بما في ذلك سماتها السحرية مثل proto وconstructor وprototype. يتلاعب المهاجم بهذه السمات لاستبدال النموذج الأولي لكائن تطبيق JavaScript الخاص بالكائن الأساسي أو تلويثه عن طريق حقن قيم أخرى. ثم يتم توريث الخصائص الموجودة على Object.prototype بواسطة جميع كائنات JavaScript عبر سلسلة النماذج الأولية. عندما يحدث ذلك، يؤدي الأمر إما إلى رفض الخدمة عن طريق إطلاق استثناءات JavaScript، أو العبث بكود مصدر التطبيق لإجبار مسار الكود الذي يحقنه المهاجم، مما يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد.
هناك طريقتان رئيسيتان يحدث بهما تلوّث النماذج الأولية:
ملاحظة مهمة: https://github.com/salesforce/tough-cookie/issues/282 https://security.snyk.io/package/npm/tough-cookie/2.5.0
=> لإصلاح الثغرة في صنف MemoryCookieStore، تحتاج إلى تعديل طريقة putCookie لمنع تلوّث النماذج الأولية عندما يتم تعيين cookie.domain إلى proto.
https://github.com/salesforce/tough-cookie/pull/283
أ. غيّر tough_cookie_2.5.0\node_modules\tough-cookie\lib\memstore.js
تم تغيير جميع حالات إنشاء كائن جديد في memstore.js من {} Object.create(Object.prototype) إلى Object.create(null)
بحيث نستخدم مثيلات كائنات لا تحتوي على خاصية نموذج أولي يمكن تلويثها.
console.log(a = Object.create(null)); في الكائن a - لا توجد خصائص (أو __ proto __)ب. تم إنشاء ملف جديد، /node_modules/tough-cookie/lib/test-unit.js
يُستخدم في VanillaJS وهو موجود في مجلد الاختبارات في ملف cookie_jar_test.js "Issue #282 - Prototype pollution"
الأمر: node test-unit.js
ج. تم إنشاء ملف جديد، /node_modules/tough-cookie/lib/testVerifyVulnerable.js
للتحقق من إصلاح السلوك القابل للاستغلال.
الأمر: node testVerifyVulnerable.js
change.diff: https://github.com/ronmadar/Open-Source-Seal-Security/blob/cf768f1932f087c30ebec7fe60c3fca323b4e54b/change.diff
أ. الحزمة العادية tough-cookie V 2.5.0
الأمر: npm install [email protected] && node index.js
ب. حزمة tough-cookie V 2.5.0 المضغوطة بصيغة tgz مع التغييرات
الأمر: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
ج.
تلوّث النماذج الأولية: بإضافة خصائص مباشرة إلى Object. prototype، هناك خطر تلويث سلسلة النماذج الأولية بالكامل. يمكن أن يؤدي هذا إلى سلوك غير متوقع عبر التطبيق، حيث قد يتأثر أي كائن يمر عبر سلسلة النماذج الأولية.
المخاطر الأمنية: في سياق تطبيق ويب، يمكن للمهاجمين استغلال تلوّث النماذج الأولية للتلاعب بالكائنات والخصائص، مما قد يؤدي إلى ثغرات أمنية مثل تصعيد الامتيازات وتسريب المعلومات.
مشكلات التوافق: تعديل النماذج الأولية الأساسية مثل Object. prototype يمكن أن يقدم مشكلات توافق مع مكتبات أو أطر عمل أخرى تعتمد على السلوك القياسي. يمكن أن يسبب هذا أخطاء أو سلوكًا غير متوقع عند دمج التبعيات أو تحديثها. د. مكتوب أعلاه.
كيفية تثبيت هذا المشروع