ثغرة أمنية في ملفات cdnj التي سمحت بتنفيذ تعليمات برمجية على خوادم Cloudflare

تم التعرف على ثغرة أمنية خطيرة في شبكة تسليم المحتوى cdnjs الخاصة بـ Cloudflare، والتي تم تصميمها لتسريع تسليم مكتبات JavaScript، مما يسمح بتنفيذ تعليمات برمجية عشوائية على خوادم CDN. ويتفاقم خطر المشكلة بسبب حقيقة أن حوالي 12.7% من جميع المواقع على الإنترنت تستخدم خدمة تنزيل مكتبات جافا سكريبت، كما أن اختراق البنية التحتية يجعل من الممكن استبدال المكتبات التي يوفرها أي من هذه المواقع.

تقوم خدمة cdnjs بتنزيل الحزم من Git أو مستودع NPM، وبعد ذلك تسمح لأي موقع باستخدام شبكة توصيل محتوى Cloudflare مجانًا لتسريع تحميل مكتبات JavaScript. عند دراسة كود مكونات cdnjs المنشورة على GitHub، تم الكشف عن أنه لتفريغ حزم NPM في أرشيفات tgz، يتم استخدام وحدة الأرشيف/tar القياسية في لغة Go، والتي تنتج قائمة بالملفات كما هي، دون تطبيع المسارات . في حالة قيام البرنامج النصي بفك محتويات القائمة بناءً على القائمة المحددة، فإن وجود ملفات مثل "../../../../../../../tmp/test" يمكن أن يكون ممكنًا يؤدي إلى الكتابة فوق الملفات التعسفية في النظام، بقدر ما تسمح به حقوق الوصول.

تم اقتراح أن المهاجم يمكن أن يتقدم بطلب لإضافة مكتبته إلى cdnjs وتحميل أرشيف مصمم خصيصًا يحتوي على ملفات ذات أحرف "../" في المسار إلى مستودع NPM. على خوادم cdnjs، يتم تنفيذ عملية "التحديث التلقائي" بشكل دوري، حيث يقوم المعالج بتنزيل إصدارات جديدة من المكتبة المقترحة وتفريغ المحتويات. باستخدام الملفات ذات المسارات "../"، يمكن للمهاجم الكتابة فوق الملفات باستخدام البرامج النصية للخدمة وتنفيذ التعليمات البرمجية الخاصة بها على الخادم الذي تم تنفيذ التفريغ عليه.

وفي حالة تنزيل التحديثات من Git، تم اكتشاف أن معالج تنزيل التحديثات لم يأخذ في الاعتبار الروابط الرمزية عند نسخ الملفات من Git. أتاحت هذه الميزة تنظيم قراءة أي ملفات من الخادم عن طريق إضافة روابط رمزية إلى Git.

تقرر بدء التجارب مع عرض توضيحي لقرصنة cdnjs للحصول على جائزة في HackerOne من خلال اختبار الفرضية المتعلقة بقراءة الملف. تمت إضافة رابط رمزي test.js إلى مستودع Git الخاص بمكتبة JavaScript التي يتم تقديمها عبر CDN، مع الإشارة إلى ملف /proc/self/maps. بعد نشر نسخة جديدة من المكتبة، قام معالج التحديث بمعالجة هذا المستودع ونشر الملف المحدد في cdnjs (تم إنشاء test.js كرابط رمزي وعندما تم طلب هذا الملف، تم إرجاع محتويات /proc/self/maps ).

وباستبدال رابط رمزي للملف /proc/self/environ، لاحظ مؤلف الدراسة أن البيانات المقدمة تحتوي على قيم متغيرات البيئة GITHUB_REPO_API_KEY وWORKERS_KV_API_TOKEN. قام المتغير الأول بتخزين مفتاح API للوصول للكتابة إلى مستودع robocdnjs على GitHub. يقوم المتغير الثاني بتخزين الرمز المميز في وحدة تخزين KV في cdnjs. وباستخدام المعلومات الواردة، يمكن للمهاجم إجراء تغييرات على ملفات cdnjs وتهديد البنية التحتية بالكامل.

المصدر: opennet.ru

إضافة تعليق