【のーえすきゅーえるいんじぇくしょん】

NoSQLインジェクション とは?

公開:
💡 入力を悪用し、NoSQLデータベースへの問い合わせを改ざんする攻撃
📌 このページのポイント
入力は「値」? それとも「条件」? 商品名:りんご危険な受け取り方守る設計値条件値だけにするルールが変わる形はアプリが決める項目・型を検証して、値として渡すJSONとして正しくても、安全とは限らない
オブジェクトで検索条件を表す製品の模式例です。円柱はNoSQLデータベース、矢印は問い合わせへ入力を渡す向き。許可する項目と型を検証し、構文や安全なAPIは製品ごとに確認します。
ひよこ ひよこ
SQL文を使っていない検索機能なら、注入攻撃は起きない?
ペンギン先生 ペンギン先生
NoSQLにも起こり得るよ。受け取った入力を問い合わせに混ぜ、単なる値ではなく検索条件として解釈させてしまうと、意図しないデータを返すなどの問題につながるんだ。
ひよこ ひよこ
例えば、商品名を受け取るだけでも?
ペンギン先生 ペンギン先生
文字列を期待する場所で、比較条件を含むオブジェクトまで受け取って検索に渡す実装なら問題になり得るよ。MongoDBのように問い合わせをオブジェクトで表す製品でも、値の型を確かめることが大切なんだ。
ひよこ ひよこ
JSONとして読めれば大丈夫、ではないんだね。
ペンギン先生 ペンギン先生
そう。形式が正しくても、渡してよい項目や型とは限らないよ。問い合わせの形はアプリ側で決め、入力を検証して値として渡そう。必要のない演算子を利用者に指定させない設計にするんだ。
ひよこ ひよこ
SQLインジェクションの対策を、そのまま使える?
ペンギン先生 ペンギン先生
入力と命令を分ける考え方は共通だけれど、構文やAPIは製品ごとに違うよ。使う製品の安全な問い合わせ方法を確認しよう。なおCWE-943は、SQLなども含む問い合わせの弱点をまとめた分類だよ。
もっと詳しく知りたい人へ

画面の入力欄で型を制限すれば十分?

不十分です。画面を通さずAPIへリクエストが送られる場合もあります。サーバー側で許可する項目と型を検証し、各APIのアクセス制御も行います。DB接続アカウントの権限は必要な操作に絞ります。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「NoSQLインジェクション」って出てきたら「入力を通じてNoSQLへの問い合わせを変えられる攻撃」と思えばだいたいOK!

参考資料

← 用語集にもどる