「JSON文字列へのインジェクション」と「パラメータの追加」:NoSQLを使うなら知っておきたいセキュリティの話(2)(2/2 ページ)
MongoDBを用いたWebアプリケーションで生じる可能性がある4種類の脆弱性のうち、今回は「JSON文字列へのインジェクション」と「パラメータの追加」のメカニズムと対策について説明します。
パラメータの追加
パラメータの追加とは、正常なリクエストには存在しないパラメータを追加することにより、本来は固定であるデータ項目を書き換えてデータベースに登録させる攻撃です。攻撃の手法などは、NoSQLとは直接関連しない「Mass Assignment」と呼ばれる攻撃方法に近いものです。
そういう意味で本件はNoSQLに固有の問題というわけではありません。しかし、固定化されないスキーマを持つMongoDBのようなデータベースを使ったアプリケーションにおいて、より多く発生し得る脆弱性であると考えられます。
脆弱なアプリケーションの例
下記はPHPで書かれた会員登録機能のプログラムの一部です。
// POSTメソッドの場合はデータ登録を実行 if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 登録するユーザーは一般会員扱いにする $member = array('type' => 'member'); // 各パラメータ(name, birthyear, mail)を$member連想配列に格納 foreach ($_POST['mform'] as $key => $value) { if (is_string($value)) { $member[$key] = $value; } } // DBに$member連想配列を登録 $db->members->insert($member); } // GETメソッドの場合は登録フォームを表示 else { echo '<form method="post"> 名前: <input type="text" name="mform[name]"> 生年: <input type="text" name="mform[birthyear]"> Mail: <input type="text" name="mform[mail]"> <input type="submit" value="登録"> </form>'; }
ユーザーは登録フォームでボタンを押下して会員登録を行います。会員登録処理は、個別のパラメータ名を指定するのではなく、foreachのループ処理によってmform[xxx]という形式のリクエストパラメータをすべてデータベースに格納します。プログラム中でtypeを'member'にする処理を行っていますが、これを回避してtypeが'admin'のユーザーを登録させることが攻撃の目標です。
攻撃例
攻撃方法は下記のリクエストパラメータを追加するだけです。
追加パラメータ例: mform[type]=admin
するとforeachループ内の処理によって$member['type']が'admin'に上書きされてしまいます。データベースには下記のデータが登録されます。末尾のtypeが'admin'になっていることが分かります。
array('name' => 'foobar', 'birthyear' => '1990', 'mail' => 'a@example.jp', 'type' => 'admin')
また、下記のようにパラメータを追加すると、そのデータがデータベースに登録されてしまいます。
追加パラメータ例: mform[foobar]=12345
実害はありませんが、想定外のデータが登録されるという意味で好ましくはありません。
対策
この問題への対策は、プログラムが受け入れるパラメータを制限することです。通常は、プログラム中に定義した、許可するパラメータのリスト(ホワイトリスト)を基に制限を行います。前回説明した検索処理におけるホワイトリストは、本ケースのような登録処理においても有効です。
別の対策としては、foreachループの後ろに「$member['type'] = 'member'」といった処理を入れることによりtype値を上書きする方法も考えられますが、これはあまりよい対策ではありません。その理由としては、そもそも想定外のデータ項目(上の例で言うと「foobar」)がデータベースに登録される余地がある対策は望ましくないこと、そしてMongoDBやドライバの特殊文字の扱いによっては対策を回避される恐れがあることが挙げられます。
【関連リンク】
MongoDB Null Byte Injection Attack - Web App Security
http://www.idontplaydarts.com/2011/02/mongodb-null-byte-injection-attacks/
Mongo Security - PHP Manual
http://www.php.net/manual/ja/mongo.security.php
以上、MongoDBを使うWebアプリケーションのセキュリティについて説明してきました。次回はCassandraやRedis、memcachedなど、それ以外のNoSQLについて取り上げます。
寺田 健(てらだ たけし)
プロフェッショナルサービス事業部
シニアセキュリティスペシャリスト
ポータル・サイトなどでのWebアプリケーションのシステム開発・運用経験を生かし、セキュリティコンサルタントとして、Webアプリケーション・スマートフォンアプリケーションなどのセキュリティ診断や関連する研究開発に従事している。ECサイトや金融機関などのWebサイト検査の実績を持つ。CISSP、情報セキュリティアドミニストレータ。
Copyright © ITmedia, Inc. All Rights Reserved.