
Proof-of-concept for CVE-2026-84361, demonstrating command injection in Composer's Perforce driver via malicious P4PORT, with Docker-based verification and mitigation guidance.
Docker Compose を使うと、影響を受ける Composer 2.10.2 と Perforce p4 クライアントを含む隔離環境で検証できます。実行コンテナはネットワーク無効、読み取り専用、capability 全削除とし、書き込み可能なのは tmpfs の /tmp と /work だけです。
# イメージをビルド(p4 は公式配布元から取得し SHA-256 を照合)
docker compose build
# p4 の rsh: 動作を直接検証する(既定)
docker compose run --rm poc
# 脆弱な Composer を経由して検証する
docker compose run --rm poc /usr/local/bin/run-composer-poc.sh
最後のコマンドは、コンテナ内の一時ワークスペースで composer update --prefer-source を実行します。Perforce server ではないマーカーコマンドを使うため Composer 自体は失敗し得ますが、マーカーが作られれば [+] VULNERABLE を表示して正常終了します。
Composer の Perforce VCS ドライバに存在する CVE-2026-84361 のローカル検証用 PoC です。影響を受ける Composer は、パッケージの source.type が perforce の場合に、攻撃者が制御できる source.url を p4 クライアントの P4PORT として渡します。
p4 は rsh: / jsh: P4PORT をネットワーク接続先ではなくローカルコマンドとして扱います。そのため、信頼できないパッケージメタデータまたは composer.lock を source インストールすると、Composer を実行したユーザーまたは CI アカウントの権限でコマンドが実行されます。
この PoC のペイロードは、一時領域に空のマーカーファイルを作るだけです。
発見者: saku0512 (GitHub)
教育目的および明示的に許可を得た環境でのセキュリティ検証にのみ使用してください。許可なく他者のシステムや CI 環境で実行してはいけません。
>= 1.0, < 2.2.30 および >= 2.3.0, < 2.10.3成立には、p4 が PATH 上にあること、攻撃者が Perforce source メタデータを制御できること、対象パッケージが source からインストールされることのすべてが必要です。Packagist.org は Perforce source メタデータを許可しないため、Packagist のみの利用形態は影響を受けません。
p4 クライアントphp -v
p4 -V
デフォルトでは p4 を起動せず、危険な P4PORT と実行予定のコマンドだけを表示します。
php poc.php
--execute は p4 に rsh: P4PORT を渡します。ペイロードは sys_get_temp_dir() 配下の一意なマーカー作成だけを行い、既定で後始末します。
php poc.php --execute
[+] VULNERABLE が出れば、P4PORT 経由でローカルコマンドが実行されたことを確認できます。マーカーを残すには --keep-marker を追加します。
同梱の composer.json は、攻撃者が配布する inline package repository の最小例です。隔離環境の未修正 Composer と p4 で次を実行します。
composer update --prefer-source
修正版は、p4 を起動する前に無効な Perforce port として source.url を拒否します。
Composer を 2.2.30 または 2.10.3 以降へ更新してください。信頼できるリポジトリと lock file だけを使用し、Perforce を使わない環境では p4 を PATH から除外してください。