# CVE-2026-84361: Composer Perforce P4PORT コマンド実行 PoC [English version](README.en.md) ## Docker での実行 Docker Compose を使うと、影響を受ける Composer 2.10.2 と Perforce `p4` クライアントを含む隔離環境で検証できます。実行コンテナはネットワーク無効、読み取り専用、capability 全削除とし、書き込み可能なのは tmpfs の `/tmp` と `/work` だけです。 ```bash # イメージをビルド(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](https://github.com/Saku0512)) ## 免責事項 教育目的および明示的に許可を得た環境でのセキュリティ検証にのみ使用してください。許可なく他者のシステムや CI 環境で実行してはいけません。 ## 脆弱性の詳細 - **CVE ID**: CVE-2026-84361 - **種別**: OS コマンドインジェクション (CWE-78) - **影響**: Composer 実行ユーザー権限での任意コマンド実行 - **影響を受けるバージョン**: Composer `>= 1.0, < 2.2.30` および `>= 2.3.0, < 2.10.3` - **修正済みバージョン**: 2.2.30 / 2.10.3 成立には、`p4` が PATH 上にあること、攻撃者が Perforce source メタデータを制御できること、対象パッケージが source からインストールされることのすべてが必要です。Packagist.org は Perforce source メタデータを許可しないため、Packagist のみの利用形態は影響を受けません。 ## PoC の使い方 ### 1. 前提条件 - PHP - 検証対象の Composer(未修正バージョン) - Perforce `p4` クライアント ```bash php -v p4 -V ``` ### 2. 安全な dry-run デフォルトでは `p4` を起動せず、危険な P4PORT と実行予定のコマンドだけを表示します。 ```bash php poc.php ``` ### 3. 許可済みのローカル検証 `--execute` は `p4` に `rsh:` P4PORT を渡します。ペイロードは `sys_get_temp_dir()` 配下の一意なマーカー作成だけを行い、既定で後始末します。 ```bash php poc.php --execute ``` `[+] VULNERABLE` が出れば、P4PORT 経由でローカルコマンドが実行されたことを確認できます。マーカーを残すには `--keep-marker` を追加します。 ### 4. Composer を経由した再現 同梱の `composer.json` は、攻撃者が配布する inline package repository の最小例です。隔離環境の未修正 Composer と `p4` で次を実行します。 ```bash composer update --prefer-source ``` 修正版は、`p4` を起動する前に無効な Perforce port として `source.url` を拒否します。 ## 対策 Composer を 2.2.30 または 2.10.3 以降へ更新してください。信頼できるリポジトリと lock file だけを使用し、Perforce を使わない環境では `p4` を PATH から除外してください。 ## 参考情報 - [GitHub Security Advisory: GHSA-rvx4-ffvw-m9q3](https://github.com/composer/composer/security/advisories/GHSA-rvx4-ffvw-m9q3) - [修正コミット (2.10 系)](https://github.com/composer/composer/commit/0aac50528e83ed635cf788333635897469440220) - [修正コミット (2.2 系)](https://github.com/composer/composer/commit/199ad81a9cc6a2a5164ad79a8da26b2e19e521af)