
PHPフレームワークCodeIgniterのCVE-2023-32692(バリデーションルールインジェクション)に対して脆弱なサンプルアプリケーション
CVE-2023-32692 は、CodeIgniter 4 PHP フレームワークにおけるコードインジェクションの脆弱性で、バージョン 4.0.0 から 4.3.4 に影響します。これは 4.3.5(2023年6月リリース)で修正されました。このリポジトリは、この脆弱性を試してみたい人向けのデモ環境です。
脆弱性の詳細は MOGWAI LABSブログ で確認できます。
このリポジトリには、この脆弱性を実証する最小限のCodeIgniter 4アプリケーションが含まれています。ローカルにPHPをインストールしなくても、VS Code(または互換性のあるエディタ)から直接起動できるように、Dev Container 設定が同梱されています。
基盤となるDockerコンテナはPHP 8.3を使用し、デバッグを可能にするXDebug拡張機能をインストールします。CodeIgniterフレームワークに必要な追加のPHPモジュールは、ローカルの「Devcontainer features」としてインストールされます。基本的には、その機能を試してみたかったからです。
次のVS Code拡張機能が含まれています(すべてコンテナ内にインストールされ、VS Codeインスタンスにはインストールされません)。
| Extension | Purpose |
|---|---|
xdebug.php-debug | PHP XDebugサポート — 脆弱なコードパスをステップ実行 |
bmewburn.vscode-intelephense-client | コードナビゲーションのためのPHP Intelephense |
humao.rest-client | 同梱のリクエストテンプレートを実行するHTTPクライアント |
composer によって自動的にインストールされるため、ここで何かする必要はありません。cp env .env
Dev ContainerにはApacheが含まれていますが、このPoCにはPHP組み込みの開発サーバーで十分です。VS Code内でターミナルを開き、次を実行します:
./spark serve --host 0.0.0.0
アプリケーションは http://localhost:8080 で利用できます。コンテナの外から、通常のWebブラウザでアクセスできます。
.vscode/launch.json は、XDebugがTCPポート9003で待ち受けるように設定します(Dev Containerの Dockerfile にも設定されています):
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
]
}
PHP開発サーバーを起動する前にデバッグリスナーを起動します: VS Codeのサイドバーにある「Run and Debug」アイコンをクリックし、「Listen for Xdebug」の横にある再生ボタンを押します。

脆弱なエンドポイントは app/Controllers/Poc.php に実装されています。次の2つのルートを公開しています:
| Route | Description |
|---|---|
POST /poc/update | 脆弱なエンドポイント — 文字列ベースのバリデーションルールを使用 |
POST /poc/updateSafe | 安全なエンドポイント — 配列ベースのバリデーションルールを使用 |
Poc::update() にブレークポイントを設定し、CodeIgniterのバリデーションエンジン内で {id} プレースホルダーがルール文字列にどのように展開されるかをトレースしてください。関連するフレームワークコードは vendor/codeigniter4/framework/system/Validation/Validation.php にあります。
http_requests/ フォルダには、VS Code REST Client拡張機能用のすぐに使えるテンプレートが含まれています:
| File | Description |
|---|---|
reqular_request.http | ベースラインの正当なリクエスト — インジェクションなし、バリデーションは通常どおり成功 |
任意の .http ファイルを開き、リクエストブロックの上にある Send Request をクリックして実行します。
basic_poc.http | id パラメータ経由で追加のバリデーションルールを注入 |
system_call.http | インジェクションを悪用して system() を呼び出し、OSコマンドを実行します(touch /tmp/pwn) |