このリポジトリには、CVE-2026-7482(Ollama の GGUF モデルローダー(0.17.1 より前のバージョン)における認証不要の領域外(OOB)読み取り脆弱性)に対する 1-Day Proof of Concept(PoC)エクスプロイトチェーンが含まれています。
注記: これは 1-Day リサーチによる再現です。私は元の CVE を発見したわけではありません。この PoC は、公開されたアドバイザリの詳細に基づいて、教育および防御研究を目的として脆弱性の仕組みを実証するために設計されました。
悪意を持って細工された、切り詰められた GGUF ファイルを /api/create エンドポイントに供給することで、攻撃者は fs/ggml/gguf.go および server/quantization.go 内の量子化パーサーに、割り当てられたヒープバッファを超えて読み取らせることができます。漏洩したメモリは、その後、/api/push エンドポイントを介して、結果として得られるモデルアーティファクトを攻撃者が制御する Docker レジストリにプッシュすることで外部に持ち出されます。
この 1-Day リサーチでは、クラッシュの再現は簡単でしたが、サーバーをクラッシュさせたり API 検証ブロックに引っかかったりすることなく安定した外部持ち出しを達成するには、特定のアーキテクチャの偽造が必要でした:
F16(general.file_type = 1)としてタグ付けする必要があります。Q4_K_M ダウン量子化を要求します。ペイロードが F16 として認識されるため、C++ の ggml バックエンドは、安全な 1:1 メモリコピーを実行する代わりにペイロードを処理することを強制されます。token_embd.weight)は、最も内側の次元が正確に 256 である 2D マトリックス(例: [num_rows, 256])として整形されている必要があります。これにより、Q4_K_M ブロック要件に厳密に適合し、バックエンドがレイヤーをスキップするのを防ぎます。pip install requests numpy gguf
また、外部に持ち出された Docker レイヤーのプッシュをキャッチするために、公開アクセス可能な HTTP リスナー(Ngrok など)も必要です。
1. 不正レジストリを起動する 漏洩したメモリブロブをキャッチするためのリスナーを起動します。
sudo python3 registry.py
2. 悪意のあるペイロードを偽造する
切り詰められた GGUF ファイルを生成します。スクリプト内の TARGET_LEAK_SIZE_MB を調整して、リクエストごとにスクレイピングするヒープメモリの量を制御できます。(推奨: マップされていないページのセグフォルトを回避するために 0.5MB から 2.0MB)
python3 forge.py
3. エクスプロイトを発火させる
exploit.py を編集してターゲット IP と不正レジストリの URL を含め、実行します:
python3 exploit.py
4. アーティファクトを分析する
レジストリは漏洩したヒープダンプを exfils/ ディレクトリに保存します。
データ整合性に関する注記(量子化の罠): エクスプロイトはサーバーのヒープメモリを最大数メガバイトまで正常にキャプチャして外部に持ち出しますが、データは OOB 読み取り中に Ollama の Q4_K_M ダウン量子化アルゴリズムにさらされます。バックエンドは生のメモリバイトを float16 にキャストし、損失の多い 4 ビットブロック圧縮スキームを適用します。その結果、漏洩したメモリは数学的に改変されます。標準的な ASCII 抽出ツールではバイナリのガベージが生成されるため、この特定の強制パスを介した平文の認証情報の回復は実際には実行不可能です。
このプロジェクトは、教育および許可された脆弱性研究の目的のみを対象としています。所有していない、またはテストする明示的な許可がないシステムに対してこのツールを使用しないでください。