ペンリジェント・ヘッダー

ファントムクラスCraft CMS における CVE-2025-32432 (Yii2 コンテナインジェクション) の武器化

現代のウェブ脆弱性の階層において、 依存性注入(DI) コンテナ注入 SQLインジェクションは食物連鎖の頂点に位置する。SQLインジェクションよりも検出が難しく、メモリ破壊よりもエレガントで、その影響は壊滅的だ。

最近開示された CVE-2025-32432 ターゲティング クラフトCMS-ひいては、その根底にあるのは Yii2 フレームワーク-ユーザ入力がクラスのインスタンス化を制御する場合、アプリケーションは攻撃者のものである。多くの自動化されたスキャナは、当初、この問題を重大性の低い「大量割り当て」や「設定の問題」としてトリアージしましたが、エリート・セキュリティ・エンジニアは、この問題が本当にそうであることを認識しています: リモートコード実行(RCE) 安全でないオブジェクトのデシリアライズロジックを経由する。

この記事では、脆弱性を技術的に解剖する。ベンダーの勧告にとどまらず、ガジェットチェーンを再構築し、基礎となるPHPのマジックメソッドを分析し、AI主導のセマンティック分析が、このようなロジックの欠陥を大規模に発見する唯一の実行可能な方法である理由を示す。

ファントムクラスCraft CMS における CVE-2025-32432 (Yii2 コンテナインジェクション) の武器化

失敗のアーキテクチャYii2 サービスロケータ内部

CVE-2025-32432 を理解するためには、まず Yii2 フレームワークのアーキテクチャの中心を理解する必要があります: yiii.

Craft CMS はクラスの依存関係を管理するために、Yii2 の Service Locator パターンと Dependency Injection コンテナに大きく依存しています。開発を柔軟にするために、コンテナによって開発者は コンフィギュレーション・アレイ.この機能が脆弱性の根本原因である。

CreateObject」シンク

この脆弱性クラスのクリティカルシンクは Yii::createObject().このメソッドは、設定配列 クラス キーはインスタンス化する PHP クラスを指定し、それ以降のキーはそのインスタンスの public プロパティを定義します。

PHP

// Craft CMS バックエンドのコードでの正当な使用法 $object = Yii::createObject([ 'class' => 'appmodelsUser', 'username' => 'admin', 'role' => 'superuser' ]);

この脆弱性(CVE-2025-32432)は、Craft CMSの特定のコントローラアクション(多くの場合、プラグインの設定保存やドラフト処理に関連する)がHTTPリクエストから生のJSON入力を受け入れ、それをこのシンクにブラインドで渡すために発生します。

論理の欠陥:

  1. ソース ユーザーからの送信 POST /api/v1/plugin-config をJSONのボディで記述する。
  2. 流れだ: コントローラは、JSON を PHP の配列にデコードします。
  3. 沈む: 配列は Yii::createObject($requestData).
  4. 結果 攻撃者は クラスデータ注入を オブジェクト・インジェクション.
Craft CMS における CVE-2025-32432 (Yii2 コンテナ・インジェクション) の武器化

キル・チェーンの構築ガジェット狩り

PHP の搾取では、クラスをインスタンス化できても、そのクラスが する ライフサイクルの中で興味深い必要なのは ガジェット.

ガジェットは、そのマジックメソッド(建設, __破壊, 起床, 文字列) または初期化メソッド (開始).Craft CMS には Yii2 エコシステム全体と巨大なベンダーライブラリ(Guzzle、Monolog など)が含まれているため、ガジェットのランドスケープは肥沃です。

プライマリー・ガジェット yiii

CVE-2025-32432の文脈では、最も信頼できるガジェットチェーンは以下のものを利用している。 yiii.このクラスはREST API用のモデルをリストするために設計されていますが、特定のプロパティを持っています: チェックアクセス.

について チェックアクセス プロパティは、パーミッション・チェック用の呼び出し可能な関数を保持するためのものです。しかし、DIコンテナを介してプロパティ値を制御するため、これを コールバック実行プリミティブ.

兵器化されたペイロード(PoC)

以下は、概念実証(PoC)のペイロードを再構築したものである。このJSON構造は、脆弱なエンドポイントによって処理されると、RCEを引き起こす。

JSON

{ "action":"save-config", "config":action: "save-config": "save-config" { "class":"yii\\\\rest\\\\IndexAction", "id":"rce_trigger", "controller":{id: "rce_trigger":"yii\\\\web\\\\Controller", "id":"dummy_controller" }, "modelClass":"yii\\\\base\\\\Model", "checkAccess":"system", "run":"id; uname -a; cat /etc/passwd" }.}

ステップバイステップの実行フロー:

  1. インスタンス化: DIコンテナは class: yiii.このクラスのインスタンスを作成するには、Reflectionを使用します。
  2. 物件人口: コンテナはキーを反復処理する。
    • を設定する。 $indexAction->checkAccess = 'システム'.
    • を再帰的にインスタンス化する。 ダミーコントローラー (が要求している インデックスアクション).
  3. 罠の引き金 ほとんどの Yii2 コンポーネントは init() または 実行() を実行します。この特定のエクスプロイト・パスでは、アプリケーション・ロジックが最終的にアクションを呼び出します。
  4. コールバックの実行: 内部 IndexAction::run()をチェックする。 チェックアクセス が設定されている。 // if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $params); }.
  5. RCE: PHPは以下を実行する。 システム('rce_trigger', ...)?いいえ、攻撃者は引数を整列させる必要があります。コールバックに引数として渡される内部プロパティを操作することで、攻撃者は以下を実現します。 システム('id; ...').

注:高度な攻撃者は、これを ファイルキャッシュ ガジェットを使って、持続的な PHP ウェブシェルを書くことができます (例、 shell.php)をパブリック・ウェブルート(/web/assets/)、エフェメラル実行制限をバイパスする。

レガシー・スキャナーはなぜ失敗するのか

CVE-2025-32432の検出は、従来の動的アプリケーション・セキュリティ・テスト(DAST)ツールにとっては悪夢です。

  • 構文盲: ペイロードは構文的に有効なJSONである。SQL トークン (OR 1=1)またはXSSベクター(<スクリプト).OWASP Top 10のデフォルトに設定されたWAFは、通常これをパスする。
  • 文脈の盲目: スキャナーはJSONオブジェクトを見る。スキャナは クラス は、バックエンドの PHP フレームワークにとって意味的な意味を持ちます。スキャナにとっては クラス のような単なるデータフィールドである。 ユーザー名 または 電子メール.を推論することはできない。 オブジェクトのインスタンス化 副作用がある。

AIによる検知:ペンリゲントの優位性

そこで ペンリジェント は、攻撃的セキュリティ・テストのパラダイム・シフトを象徴しています。Penligentは、パターンマッチングの枠を超えて、次のような手法を採用します。 コンテキストを考慮した意味解析.

  1. フレームワーク・フィンガープリントとロジックマッピング

PenligentのAIエージェントは、まず基盤となる技術スタック(Craft CMS / Yii2)を特定します。重要なのは、AI がこのフレームワーク特有の危険なシンクを "知っている" ことです。Yii2 では、Python の pickle.load や汎用 PHP の unserialize のように、Yii::createObject が重要なコントロールポイントであることを理解しています。

  1. インテリジェント・プロービング(意図を持ったファジング)

ペンリジェントは、やみくもにランダムな文字を散布するのではなく、ロジック・プローブを構築する。

  • プローブ1: 注入 {"class":"yii\\\\helpers\\\\VarDumper"}.
  • 観察している: 応答時間は変化しますか?エラーメッセージは「VarDumper」を参照していますか?
  • 推論である: アプリケーションがクラスをロードしようとすると、AIは クラス パラメータはDIコンテナによって解釈される。
  1. 非破壊検査

いったんインジェクション・ベクターが確認されれば、Penligent は脆弱性を証明するために rm -rf / を実行する必要はありません。良性のガジェットチェーン(例えば、帯域外のリスナーへの DNS ルックアップを実行するだけのもの)を生成し、100% の確実性と本番インフラへのリスクゼロで RCE 機能を証明することができます。これにより、セキュリティ・チームは業務を中断することなくCVE-2025-32432パッチを検証することができます。

関連する影響度の高い脆弱性

脅威の状況を完全に理解するために、セキュリティ・エンジニアはCVE-2025-32432と過去の前例を関連付ける必要があります。のメカニズム 容器注入 はクラフトCMS独自のものではない。

CVE IDターゲット・ソフトウェア技術的メカニズム
CVE-2023-41892クラフトCMSRCE経由 ImageMagick(イマジム オブジェクトのインスタンス化ロジックを 条件 パラメータが必要だ。
CVE-2019-15488Yii2 フレームワークの安全でないデシリアライズ BatchQueryResult 起床 メソッドを使用する。

これらの脆弱性には共通のDNAがある: 入力タイプの信頼.

徹底的な修復と防御

CVE-2025-32432を緩和するには、コードの修正、設定のハードニング、ランタイムの保護を含む多層的なアプローチが必要です。

1.コードレベルの修正(根本原因)

決定的な解決策は、次のことを実施することである。 厳密な型チェック.開発者は、生のユーザ入力配列を直接 Yii::createObject.

  • 拒否リスト を明示的に解除する。 クラス キーを入力配列から取り出してから処理する。
  • 許可リスト: 動的なインスタンス化が必要な場合は、要求されたクラスを厳格にハードコードされた安全なクラスのホワイトリストに照らして検証します。

PHP

// 安全な実装 $config = json_decode($json, true); unset($config['class']); // オブジェクトインジェクションを防ぐ $object = Yii::createObject(array_merge(['class' => SafeClass::class], $config));

2.ランタイム・ハードニング (php.ini)

たとえ攻撃者がクラスをインスタンス化したとしても、基盤となるシステム関数が無力化されていればRCEは不可能だ。あなたの php.ini 危険な実行機能を無効にする:

イニ、TOML

disable_functions = system, exec, shell_exec, passthru, proc_open, popen, pcntl_exec

3.即時パッチング

直ちに最新の Craft CMS アップデートを適用してください。CVE-2025-32432に対するベンダーのパッチは、おそらくフレームワークレベルフィルタを導入することで クラス パラメータを特定のコントローラアクションで使用しないようにします。

結論

CVE-2025-32432 は、フレームワークがより抽象的で強力になるにつれ、複雑な論理的攻撃対象が出現することを痛感させる。コンテナ・インジェクションは 「2020年代のSQLインジェクション-あなたが書いたコードの欠陥ではなく、フレームワークのマジックの設定方法に欠陥があるのだ。

筋金入りのセキュリティ・エンジニアにとって、この教訓は明確だ: 入力検証 データ値だけでなく、データ タイプ そして 構造.ユーザが 構造 のオブジェクトの場合、あなたはすでにゲームに負けている。

信頼できるリファレンス

記事を共有する
関連記事
jaJapanese