
#CVE-2022-31630 – 概念実証エクスプロイト
警告: このコードは教育目的および隔離されたラボ環境でのテストのみを目的として作成されています。許可なく他のシステムで使用することは違法であり無責任です。
📌 説明
CVE-2022-31630 は、PHP の GD 拡張、具体的には imageloadfont() 関数における Out-of-Bounds (OOB) 読み取りの脆弱性です。この脆弱性により、PHP アプリケーションによってロードされるフォントファイルを制御できる攻撃者が、割り当てられたバッファの境界を超えてデータを読み取ることができます。考えられる影響は以下のとおりです。
· サービス拒否 (クラッシュ) – アプリケーションが応答を停止します。 · 情報漏洩 – メモリ内の機密データ (キー、トークン、その他のデータ断片など) が読み取られる可能性があります。
影響を受ける PHP バージョン
· PHP 7.4.x で 7.4.33 より前 · PHP 8.0.x で 8.0.25 より前 · PHP 8.1.x で 8.1.12 より前
PHP 7.4.33 は、この CVE のパッチが最初に適用されたバージョンです。このリポジトリは、脆弱なバージョン (≤ 7.4.32) とパッチ適用済みバージョン (≥ 7.4.33) の動作の違いを示す概念実証 (PoC) を提供します。
🔍 技術詳細
この脆弱性は、GD フォントファイル (.gdf 形式) の読み取り時に入力検証が不十分なことに起因します。フォントファイルのヘッダ構造は次のとおりです。
バイトオフセット サイズ (バイト) 説明 0 2 Magic number (0x01BE) 2 2 文字数 (nchars) 4 2 文字幅 (width) (ピクセル) 6 2 文字高さ (height) 8 2 1文字あたりのバイト数 (char_offset)
width の値が非常に大きく (例: 65535) 設定されると、文字ビットマップを格納するバッファサイズの計算が誤ったものになります。その結果、割り当てられるバッファが小さすぎます。その後、imagechar() 関数がそのフォントから文字を読み取ると、バッファの境界外のメモリにアクセスします – これが Out-of-Bounds 読み取りです。
🧪 テスト要件
· Docker (隔離環境を実行するため) · PHP 7.4.32 または 7.4.33 (Docker イメージ php:7.4.32-cli / php:7.4.33-cli を使用可能) · GD 拡張 (コンテナ内でインストールされます)
🚀 PoC の使用方法
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
脆弱なバージョン (7.4.32) をテストする場合:
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
パッチ適用済みバージョン (7.4.33) をテストする場合:
docker run -it --rm -v $(pwd):/app php:7.4.33-cli bash
cd /app
apt-get update
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype --with-jpeg
docker-php-ext-install gd
php exploit_cve-2022-31630.php
📊 出力例
| PHPバージョン | 期待される結果 |
|---|---|
| 7.4.32 (脆弱) | プログラムがセグメンテーションフォルトでクラッシュするか、メモリリークが発生する(メモリ内のダミーデータが見える)。 |
| 7.4.33 (修正済み) | 実行は正常に完了し、output.png画像ファイルが保存され、クラッシュは発生しない。 |
🛡️ 緩和策
· PHP をパッチを含む最新バージョンに更新してください: · PHP 7.4.33 以降 · PHP 8.0.25 以降 · PHP 8.1.12 以降 · すぐに更新できない場合は、GD 拡張または imageloadfont() 関数を本当に必要でない限り無効にしてください。 · アプリケーションに最小権限の原則を適用し、メモリリークが発生した場合の影響を最小限に抑えてください。
📚 参考文献
· NVD の CVE-2022-31630 · php-src のパッチコミット · PHP リリースアナウンス
⚠️ 免責事項
このリポジトリは教育およびセキュリティ研究を目的として提供されています。作者はこのコードの悪用について一切責任を負いません。自身が所有する環境、または書面による許可を得た環境でのみテストしてください。
インドネシアのサイバーセキュリティコミュニティのために作成されました。