Python製非同期ORMにおける重大な(CVSS 9.8)SQLインジェクション脆弱性の詳細な分析。再現、解析、修正を含む。
Ormar は、Python向けの人気のある非同期ミニORMであり、FastAPIやStarletteと併用されることが一般的です。バージョン 0.9.9から0.22.0 には、min() および max() 集計メソッドにSQLインジェクションの脆弱性が存在します。
根本原因は「部分的な実装」バグです。sum() と avg() は列パラメータが実際の数値フィールドを参照していることを検証する一方、min() と max() はこのチェックを完全にスキップし、ユーザー入力をそのまま sqlalchemy.text() — 生のSQLシンク — に渡します。
攻撃者は「列」パラメータとしてサブクエリを注入できます:
# 想定される使用法
await Item.objects.max("price") # → SELECT max(price) FROM items
# 攻撃ペイロード
await Item.objects.max("(SELECT password FROM users LIMIT 1)")
# → SELECT max((SELECT password FROM users LIMIT 1)) FROM items
# 管理者のパスワードが返される!
| 属性 | 値 |
|---|---|
| CVE ID | CVE-2026-26198 |
| CVSSスコア | 9.8(Critical) |
| CWE | CWE-89: SQLインジェクション |
| 影響を受けるバージョン | ormar 0.9.9 – 0.22.0 |
| 修正バージョン | ormar 0.23.0 |
| 公開日 | 2026年2月24日 |
| 認証の必要性 | 不要 — 認証なし |
├── README.md ← 現在地
├── vulnerable_app.py ← 脆弱なパターンを含む最小限のFastAPIアプリ
├── exploit_demo.py ← インジェクションの動作を示す安全なPoC
├── patched_app.py ← 入力検証を備えた修正版
├── test_vulnerability.py ← 脆弱性の存在と修正の有効性を証明するテスト
├── requirements.txt
└── analysis/
└── root_cause.md ← バグの詳細なコードレベル分析
git clone https://github.com/YOUR_USERNAME/CVE-2026-26198-analysis.git
cd CVE-2026-26198-analysis
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# テストを実行(外部DB不要 — SQLiteを使用)
python -m pytest test_vulnerability.py -v
# 対話型エクスプロイトデモを実行
python exploit_demo.py
修正では、列パラメータが sqlalchemy.text() に到達する前に、モデルの実際のフィールドと一致することを検証します。これはホワイトリスト方式によって実現されます。モデルのフィールド定義に存在する列名のみが許可されます。
実装は patched_app.py、完全な分析は analysis/root_cause.md を参照してください。
sum()/avg() は検証されているのに min()/max() は検証されていないという事実が、誤った安心感を生み出しました。MIT