Уязвимость, позволяющая удаленно выполнить код на сервере PHP-репозитория Packagist
В Packagist, крупнейшем репозитории пакетов на языке PHP, ежемесячно обслуживающем более 400 млн загрузок и по умолчанию применяемом в пакетной менеджере Composer, выявлена критическая уязвимость, позволяющая выполнить код на сервере проекта через передачу специально оформленных значений в форму добавления нового пакета.
Уязвимость вызвана отсутствием должной проверки передаваемых значений перед их обработкой в shell-скриптах. В частности, для выполнения произвольных shell-команд в текстовое поле с URL репозитория добавляемого проекта достаточно было ввести строку вида "$(код)". На стороне сервера данный URL передается в качестве аргумента при вызове команд git, p4, svn, или hg. Для git и hg выполняется экранирование строки кавычками, но для p4 (Perforce) и svn строка передается как есть, например, при вводе "$(sleep 1)" будет запущена команда "svn info --non-interactive $(sleep 1)". Разработчики Packagist уже исправили проблему добавив экранирование при помощи вызова ProcessExecutor::escape.
К сожалению халатное отношение к безопасности присуще разработчикам многих современных репозиториев пакетов, что ставит под вопрос гарантию целостности пакетов в подобных системах. Например, выявивший проблему исследователь безопасности, в прошлом году обнаружил похожую проблему в RubyGems, позволяющую выполнить код на сервере RubyGems.org при загрузке специально оформленного gem-пакета, а также продемонстрировал возможность запуска своего кода на некоторых зеркалах NPM, нашел способ удаления произвольных файлов из репозитория PyPI. Исследователь также выявил уязвимость в применяемой в NPM сети доставки контента, которая позволяла осуществить подстановку любого JavaScript-кода.