Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-40176 — CVE-2026-40176の差分概念実証。悪意のあるリポジトリURLを介したComposerのPerforceドライバーにおけるOSコマンドインジェクションを実証し、影響を受けるバージョンと修正済みバージョンに対する自動A/Bテストを含む。 | Kitploit
ツール/GitHubGitHub/ikarolaborda/cve-2026-40176
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテストコマンド&コントロール学習と教育
GitHubikarolaborda/cve-2026-40176

CVE-2026-40176

CVE-2026-40176の差分概念実証。悪意のあるリポジトリURLを介したComposerのPerforceドライバーにおけるOSコマンドインジェクションを実証し、影響を受けるバージョンと修正済みバージョンに対する自動A/Bテストを含む。

リポジトリを見る
143ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-40176 — Composer Perforce ドライバーコマンドインジェクション(概念実証)

Composer の Perforce リポジトリドライバーにおけるコマンドインジェクションの脆弱性を実証し、差分検証 する自己完結型のOOPスタイルPHP概念実証(PoC)です。

このPoCは、同じ悪意のある composer.json を2つのComposerバイナリ(影響を受ける リリース 2.9.5 と 修正済み リリース 2.9.6)に対して実行し、影響を受けるバージョンでは発火するが修正済みバージョンでは発火しない副作用(インジェクションされたシェルコマンドによって書き込まれるマーカーファイル)を観察することでバグを証明します。

⚠️ 許可されたセキュリティ研究および防御的テスト専用です。 責任ある利用 を参照してください。


目次

  • 概要
  • 脆弱性
  • PoCの仕組み
  • インジェクションペイロード
  • 必要条件
  • セットアップ
  • 使用方法
  • 期待される出力
  • 結果の解釈
  • プロジェクト構成
  • 設計ノート
  • 制限事項と既知の問題
  • 責任ある利用
  • 参考

概要

CVECVE-2026-40176
コンポーネントComposer — Perforce(perforce)リポジトリ/VCS ドライバー
クラス攻撃者が制御するリポジトリURLを介したOSコマンドインジェクション
攻撃面type: perforce の細工された repositories エントリを含む composer.json
影響を受けるバージョンComposer 2.9.5
修正済みバージョンComposer 2.9.6
トリガー悪意のあるマニフェストに対する依存関係の解決/更新(composer update)
影響Composer を実行しているマシン上での任意のコマンド実行
PoC 言語PHP(単一ファイル、外部依存関係なし)

脆弱性

Composer は複数のバージョン管理システムからパッケージを解決できます。Perforce の場合、リポジトリはホスト、ポート、ユーザー/ストリームをエンコードした p4:// URL で識別されます。Composer の Perforce ドライバーが基盤となる p4 コマンドラインを構築する際、攻撃者が制御するURL から取得したフィールドは、シェルに渡される前に十分にサニタイズされません。

マニフェストの作成者はリポジトリURLを完全に制御できるため、被害者に悪意のある composer.json に対して composer update/composer install を実行させることができる攻撃者(例えば、改竄された依存関係、悪意のあるリポジトリ、信頼できないプロジェクトファイルを処理するCIジョブなど)は、意図された p4 呼び出しを抜け出し、Composer プロセスの権限で任意のOSコマンドを実行できます。

これは、URL/ブランチ/ストリームの値がエスケープなしでシェルコマンドに流れ込むという、過去の Composer VCS ドライバー引数インジェクションの問題と同じ系統に属します。Composer 2.9.6 は Perforce ドライバーを強化し、インジェクションされたペイロードが実行されないようにしています。

ここで実証されている動作の権威ある説明は、PoC ソース自体(CVE202640176Test.php)です。アップストリームの修正の詳細については、公式アドバイザリと Composer のチェンジログを参照してください。


PoCの仕組み

PoC は単一のクラス CVE202640176Test で、制御された A/B(差分)実験 を実行します:

  1. 事前チェック — 影響を受ける(2.9.5)と修正済み(2.9.6)の両方の Composer バイナリで --version を照会し、どちらかが起動できない場合は早期に中止します。
  2. 影響を受けるバージョンの実行(2.9.5)
    • システムの一時パスの下に分離された一時ディレクトリを作成します。
    • repositories セクションに、インジェクションされたシェルペイロードを含む悪意のある p4:// URL を持つ perforce エントリを含む composer.json を書き込みます。
    • そのディレクトリで composer update を実行します。
    • 結果を検証します。
  3. 修正済みバージョンの実行(2.9.6) — パッチ適用済みバイナリに対してまったく同じ手順を繰り返します。
  4. 復元 — finally ブロックが、プロジェクトディレクトリ内の元の composer.json を常に復元します。
  5. 判定 — 影響を受けるバージョンの実行で副作用が確認され、かつ 修正済みバージョンの実行で確認されなかった場合にのみ PASS を出力します。

検証(「悪用された」と見なす基準)

各実行について、validateRun() は次の3つをチェックします:

チェック証明されること
マーカーファイルが存在し、実行IDを含むインジェクションされた touch/echo ペイロードが実際に実行された — すなわち、コマンドインジェクションが成功した。
Composer の出力に p4 が含まれるPerforce ドライバーのコードパスに到達した(ペイロードが無関係なステップではなく、正しいコンポーネントによって処理された)。
解析された Composer バージョン == 期待値実行されたのが正しいバイナリ(2.9.5 vs 2.9.6)であった。

実行が「OK」となるのは、3つすべてが合格した場合のみです。テスト全体が 合格 となるのは、影響を受けるバージョンの実行がOKで、修正済みバージョンの実行が 不合格 の場合です — これは、その後パッチが適用された実際の脆弱性の正確なシグネチャです。


インジェクションペイロード(解説)

悪意のあるリポジトリURLは writeComposerJson() で構築されます:

p4://127.0.0.1:1666:attacker_user;touch <marker> && echo '<runId>' > <marker>:client_test

分解すると:

  • p4://127.0.0.1:1666:attacker_user — 正しく形成されたように見える Perforce URL(ホスト、ポート 1666、ユーザー)。
  • ;touch <marker> && echo '<runId>' > <marker> — インジェクションされたシェルコマンド。先頭の ; は意図された p4 コマンドを終了させます。touch はマーカーファイルを作成し、echo '<runId>' > <marker> は一意の実行IDをそのファイルに書き込みます。これにより、PoC はペイロード(無関係なプロセスではなく)がファイルを生成したことを確認できます。
  • :client_test — URL の残りの解析を妥当に見せるための末尾テキスト。

影響を受ける ドライバーではシェルのメタ文字が解釈され、マーカーファイルが作成されます。修正済み ドライバーでは値が適切にエスケープ/クォートされるため、同じ文字列は無害なデータとして扱われ、マーカーは作成されません。

注:PoC は一意のタイムスタンプ付き実行IDを使用し、マーカーを分離された一時ディレクトリ内に書き込むため、ペイロードは破壊的ではなく、無害で自己クリーンアップされます。


必要条件

  • PHP 7.4+(PHP 8.x CLI で開発/テスト済み)。PoC 自体はコア関数のみを使用します — ハーネスを実行する ために Composer パッケージは不要です。
  • 2つの Composer バイナリ(PHAR 形式):
    • Composer 2.9.5(影響を受けるバージョン)
    • Composer 2.9.6(修正済みバージョン)
  • POSIX 互換のシェル環境(exec() は cd … && php … を実行)。Linux/macOS 向けに設計されています。
  • プロジェクトディレクトリ内のベース composer.json(起動時に読み取られ、各一時実行にコピーされ、その後復元されます)。

通常、稼働中の Perforce サーバーは 不要 です。脆弱性は Composer が p4 コマンドラインを 構築する 方法にあり、インジェクションされたペイロードは実際の p4 接続の前/周辺で実行されます。Composer が Perforce 接続エラーをログに記録する場合がありますが、これは想定どおりで、マーカーファイルによる証明には影響しません。


セットアップ

  1. PoC をクローン/配置 します(作業ディレクトリ内)。

  2. composer.json を用意 します(PoC と同じディレクトリに)。最小限のもので十分です:

    {
      "name": "research/cve-2026-40176-poc",
      "description": "Base manifest for the CVE-2026-40176 differential PoC",
      "require": {}
    }
    
  3. 2つの Composer バイナリを取得 し、PoC が期待する場所に配置します(デフォルトは以下のとおり):

    /usr/local/bin/composer-2.9.5.phar   # affected
    /usr/local/bin/composer-2.9.6.phar   # fixed
    

    公式アーカイブから特定の Composer リリースをダウンロードできます。例:

    curl -Lo /usr/local/bin/composer-2.9.5.phar https://getcomposer.org/download/2.9.5/composer.phar
    curl -Lo /usr/local/bin/composer-2.9.6.phar https://getcomposer.org/download/2.9.6/composer.phar
    

    パスが異なる場合は、CVE202640176Test.php の末尾にある2つのコンストラクタ引数を編集してください。


使用方法

php CVE202640176Test.php

ハーネスは両方の Composer バージョンを順に実行し、最終的な判定を出力します。実行が失敗した場合でも、元の composer.json は自動的に復元されます(作業は使い捨ての一時ディレクトリで行われます)。


Docker での実行(推奨)

このリポジトリには、環境を正確に再現するコンテナ化されたラボが同梱されています:PHP CLI ランタイムと、PoC が期待するパスにある2つの固定バージョンの Composer リリースで構成され、実行時には完全にネットワーク分離されます。

docker compose run --rm poc

これにより cve-2026-40176-lab:latest がビルドされ(ビルド中に Composer 2.9.5 と 2.9.6 をダウンロードし、それぞれの --version を検証)、非特権かつ外部通信なしのコンテナ内で差分テストが実行されます。

ラボが保証すること:

  • 本物のバイナリ。 両方の Composer リリースは公式アーカイブから取得され、ビルド時にバージョンチェックされます — 固定されたバージョンが利用できない場合、ビルドは明確に失敗します。
  • 分離。 poc サービスは internal ブリッジネットワーク上で実行され(ホスト/インターネットへの外部通信なし)、cap_drop: ALL と no-new-privileges が設定されています。インジェクションペイロードは封じ込められたままです。
  • ホストのセットアップ不要。 ホストに PHAR を配置したり、パスを手動で編集したりする必要はありません。

ビルド引数でバージョンを再固定できます(PoC の2つのコンストラクタパスと同期している必要があります):

docker compose build --build-arg COMPOSER_AFFECTED_VERSION=2.9.5 --build-arg COMPOSER_FIXED_VERSION=2.9.6

オプション — 稼働中の Perforce サーバー。 full-lab プロファイルの下で p4d サービスを利用できます(docker compose --profile full-lab up)。マーカーによる証明には 不要 ですが、稼働中の p4:// エンドポイントを必要とする研究者向けに用意されています。PoC のペイロードは 127.0.0.1:1666 をターゲットにしているため、別の p4d コンテナ経由でルーティングするには、PoC の URL をホスト p4d に向ける必要があります。


再現ステータス(観察結果)

正直な結果: 実際に公開されている Composer 2.9.5 および 2.9.6 に対して、PoC は 現在発火しません。ラボは INCONCLUSIVE / FAIL を報告します。

影響を受ける Composer(2.9.5)を PoC の悪意のあるマニフェストに対して実行すると、p4/シェルコマンドが構築される 前 に、Composer 内部で例外がスローされます:

In PerforceDriver.php line 40:
  [ErrorException]
  Undefined array key "depot"

PerforceDriver::initialize() は最初に $this->repoConfig['depot'] を読み取りますが、PoC のリポジトリエントリは type と url のみを提供します(depot キーはありません)。ドライバーはその時点で中止されるため、URL 内のインジェクションされた ;touch <marker> ペイロードには到達せず、マーカーは作成されません。ネットワーク分離が原因では ありません — 完全な外部通信が可能な場合でも同じエラーが発生します。

これが意味すること:

  • Docker ラボ自体は正しく、本物の影響を受ける/修正済みバイナリに対して差分ハーネスを忠実に実行します。INCONCLUSIVE という結果は、環境ではなく PoC ペイロード の特性です。
  • 実際の Perforce コマンド構築パスを実行するには、PoC のリポジトリ設定に少なくとも depot キーが必要です(現実的には full-lab プロファイルの下で稼働中の p4d エンドポイントも必要です)。そこまでペイロードを洗練させることは、「ラボを立ち上げる」を超えたエクスプロイト開発であり、ここでは意図的にスコープ外とされています。

以下の「期待される出力」は PoC の 意図された/理想化された 結果であり、参考用に保持されています。実際のドライバーに対して現在のペイロードが生成するものではありません。


期待される出力

成功したデモンストレーションはおおよそ次のようになります(パスとIDは異なります):

ツールをダウンロード