
إصلاح ثغرة تلوث النموذج الأولي (CVE-2023-26136) لحزمة tough-cookie
Prototype pollution هي ثغرة في JavaScript تمكن المهاجم من إضافة خصائص عشوائية إلى نماذج الكائنات العامة، والتي قد تُورث بعد ذلك إلى الكائنات المعرفة من قبل المستخدم. مصدر Prototype pollution هو أي إدخال يمكن للمستخدم التحكم به يمكنك من إضافة خصائص عشوائية إلى كائنات النموذج. المصادر الأكثر شيوعًا هي كما يلي: URL JSON Web Messages
بالنسبة لحزمة tough-cookies (الإصدار 2.5.0) المصدر الأول ذو الصلة الأكبر هو عبر URL يحدث ذلك كما يلي:
إليك مثال لطلب:
https://vulnerable-website.com/?__proto__[badProperty]=payload
عند تحليل سلسلة الاستعلام إلى أزواج مفتاح:قيمة، قد يفسر محلل URL proto كسلسلة عشوائية.
في مرحلة ما، قد تقوم عملية الدمج التكراري بتعيين قيمة evilProperty باستخدام عبارة مكافئة للتالية:
targetObject.__proto__.badProperty = 'payload';
__proto__ له استخدام خاص في JavaScript. كما نعلم، إذا لم يتم العثور على خاصية P1 لكائن ما، فسيتم البحث عنها في النموذج الأولي لهذا الكائن
مثال
function myClass() {
this.P1 = 'value';
}
let mc = new myClass();
console.log(mc.P1); //Value
console.log(mc.P2); //Undefined
mc.__proto__.P2 = 'value2';
let mc2 = new myClass();
console.log(mc.P2); //value2
بعد تغيير __proto__ - جميع النسخ التي تم إنشاؤها من myClass ستحتوي على الخاصية P2
بالنسبة لحزمة tough-cookies (الإصدار 2.5.0) يمكن رؤية هذه الثغرة من مقتطف الكود التالي:
await new Promise((resolve, reject) => {
cookiejar.setCookie(
"Slonser=polluted; Domain=__proto__; Path=/notauth",
"https://__proto__/admin",
{ loose: true },
(err, cookie) => {
if (err) {
reject(err);
} else {
resolve(cookie);
}
}
);
});
تم اكتشاف أن الفئة CookieJar تستخدم MemoryCookieStore كمخزن افتراضيًا. وفي عدة طرق من MemoryCookieStore يتم تهيئة الكائنات كما يلي:
this.idx = {};
هذا يعني أنه بالنسبة لـ this.idx يمكن إضافة خصائص بقيم (والتي قد تكون قيمًا إشكالية) عبر __proto__. لمنع ذلك - تم تغيير التهيئة في عدة أماكن كما يلي:
this.idx = Object.create(null);
هذا ينشئ كائنًا فارغًا بدون نموذج أولي. تمت إضافة اختبار memstore_vulnerability_fix_test.js للتحقق من الإصلاح