「NoSQLのデータベースを使えば、インジェクションは成立しないのでは?」
「NoSQLインジェクションの対策は何から取り組むべきなのか?」
NoSQLインジェクションとは、NoSQLのデータベースに対して実行されるインジェクション攻撃です。インジェクション攻撃とは、入力値に悪意のある文字列を「注入(インジェクション)」する攻撃のことです。
NoSQLデータベースを使用することで、SQLインジェクションのような攻撃が防げるという考え方があるかもしれませんが、実際にはNoSQLデータベースを使用していても攻撃が成功する可能性があります。
まだ馴染みのない方も多いと思いますが、ビッグデータの活用など、NoSQLの需要が高まっている昨今、インジェクション攻撃への対策を実施しておかないと大きな被害につながる恐れがあります。
そこで本記事では、以下の点について解説します。
- NoSQLとは
- NoSQLインジェクションの仕組みと実例
- NoSQLインジェクションへの対策例
本記事をお読みいただくことで、NoSQLインジェクションの概要と基本的な対策について理解ができます。さらに対策を実施したい方におすすめの施策や、よりコストをおさえてセキュアなWebアプリケーションを開発するための手法についても解説しているため、ぜひ参考にしてみてください。
NoSQLデータベースを導入している企業の方、必見!
NoSQLインジェクションの対策は何から取り組むべき?
特殊文字のサニタイズやクエリストリングのバリデーションなどが代表的な対策です。また、漏れなく対応するためには、Webシステム全体の脆弱性をチェックし、最適な対策を実施する工程を加えましょう。方法はこちらの資料をご覧ください。
NoSQLインジェクションとは?
NoSQLインジェクションとは、NoSQLのデータベースに対して成立するインジェクション攻撃のことです。
ここではまずNoSQLと、NoSQLインジェクション攻撃の仕組みについて解説します。
NoSQLとは?
NoSQLとは「Not only SQL」の略称で、リレーショナルデータベース以外のデータベースの総称です。リレーショナルデータベースとNoSQLデータベースは、データの構造や処理性能、検索精度や拡張性が異なります。
リレーショナルデータベース(RDB)とは、データ間の関係を定義して管理するデータベースのことで、Excelのように表形式でデータを管理します。代表的な製品としては、Oracle DatabaseやSQLServer、My SQLなどがあります。「リレーショナルデータベース」いう単語にはピンと来なくても、これらの製品名は聞いたことがあるのではないでしょうか。「SQL」と呼ばれるデータベース言語を使うことで、参照や検索がしやすいという特徴があります。
リレーショナルデータベースは表形式で直感的に理解しやすく、SQLで操作もしやすかったことから広く普及していました。しかしその反面、データの量が多くなると処理速度が低下したり、データ構造を固定する必要があったりといった課題もありました。
NoSQLはリレーショナルデータベースとは違い、表形式ではデータを管理しません。様々な形式のデータをそのまま保存できるため、画像や動画といった決まった構造を持たないデータを保存でき、拡張性や処理速度に優れている、といった特徴があります。ビッグデータの活用が広まる中で、より柔軟かつ高速に大量のデータを処理できるデータベースとして、NoSQLが普及しています。
NoSQLに分類される代表的なデータベースとして、以下が挙げられます。
製品名 | 特徴 |
---|---|
MongoDB | 処理速度が速く外部システムとの連携が容易、NoSQLでは最も高いシェアを誇る。 |
CouchDB | 複数のサーバーやデバイス間でデータの同期が可能、AWSやGCPでフルマネージドサービスとして利用できる。 |
DynamoDB | Amazonが提供するフルマネージドサービス。システムの規模に関わらず高速で一貫したパフォーマンスを実現。 |
Redis | インメモリデータベースで高速処理が特徴、オンプレミス、クラウド両方で利用可能。 |
Riak | シンプルな構造で拡張性と可用性が特徴、処理性能も高い。時系列データなどに最適。 |
Cassandra | ビッグデータ用分散データベース。大量のセンサーデータやログデータなどの非構造化データを効率的に格納する。 |
HBase | リアルタイムの処理能力が高い。拡張性に優れ、処理対象の増加にも柔軟に対応可能。 |
Neo4j | 最も人気のあるOSSグラフデータベース。オンプレミス、クラウドの両方で利用可能。 |
NoSQLインジェクションとは?
NoSQLは表形式でデータを保存しないことから、SQLも使用しません。そのため、NoSQLのデータベースを利用すれば「SQLインジェクション」のような攻撃を回避できると誤解されている場合があります。しかし実際には、NoSQLのデータベースでも「NoSQLインジェクション」という脆弱性を突いた攻撃手法が確認されています。
SQLインジェクションの脆弱性は、データベースを操作するSQL文の扱いに不備がある場合に生じます。SQLインジェクション攻撃は、Webアプリケーションの入力値に不正な文字列を挿入し、用意されていたSQL文に干渉する攻撃です。不正なログインやデータの不正な取得・改ざん・削除といった被害が発生する恐れがあり、危険性の高い攻撃の1つです。
NoSQLのデータベースも、データを操作する際には「クエリ」と呼ばれる命令文を使います。そのため、このクエリの組立て方法に不備があれば、NoSQLのデータベースであっても、このクエリに干渉するような入力値を挿入することで、インジェクション攻撃を実行できる場合があります。NoSQLを使っているからといって安心せず、必要な対策を実施しなければなりません。
NoSQLインジェクション攻撃の実例
それでは、NoSQLインジェクション攻撃は、具体的にはどのように成立するのでしょうか。
例えば、代表的なNoSQLのデータベースに「MongoDB」があります。MongoDBは圧倒的なシェアを誇っており、世界のNoSQL市場をリードしているデータベースです。
MongoDBの主な特徴はスピードで、特定の操作を行うための演算子が用意されています。今回例にあげる演算子は「$ne」です。これは「not equal」の略称で、一致しない値を出力します。例えば、「’$ne’:”test”」と使えば、「test」という文字列に一致しないデータを出力します。
NoSQLインジェクション攻撃の例として、この演算子を悪用することで、ユーザーIDの一覧を検索する以下のようなクエリを作成することが可能です。
db.userlist.find(
{user_name: {‘$ne’:””}}
)
上記のようなクエリが実行された場合、返ってくるデータは、「user_name」の値が「””」で囲まれた文字列に一致しないデータ、すなわち全てのデータです。「””」で何も囲んでおらず空白になっているため、「空白」に一致しないデータ=なんらかの値を持っているデータ全てを参照することが可能となります。
NoSQLのクエリの組立てに不備がある場合、上記のように、NoSQLのクエリに干渉するような文字列を挿入することで、全ユーザーのIDを取得するといった攻撃が可能となります。
NoSQLインジェクションの対策
一般にNoSQLは単純なクエリ操作に留まることが多く、SQLほど複雑な処理ができません。そのため、SQLインジェクション対策ほど複雑な対策は求められませんが、NoSQLと一口に言っても様々な形式があるため、製品に合わせたセキュリティ対策が必要になります。
ここでは、NoSQLインジェクションの代表的な対策を2つご紹介します。まず特殊文字のサニタイズを確実に実施し、二次的・保険的な対策としてクエリストリングのバリデーションを実施するという順番での取り組みがおすすめです。
特殊文字のサニタイズ
1つ目の対策は、特殊文字のサニタイズです。NoSQLインジェクション攻撃は、入力値にクエリに干渉するような特殊な文字を挿入することから成立します。そのため、特殊な意味を持つ文字をサニタイズし、クエリに干渉しないようにすれば、NoSQLインジェクション攻撃を防ぐことができます。
クエリに干渉するような特殊文字の種類はデータベースの種類によっても異なりますが、一般的には以下のような文字が対象となります。
- ‘
- “
- \
- ;
- {
- }
詳しくは、各ベンダーのマニュアルなどを参照してください。
クエリストリングのバリデーション
2つ目の対策例は、クエリストリングのバリデーション(検証)です。先ほどご紹介したように、NoSQLインジェクション攻撃では、クエリに干渉し得るような文字列が入力値に挿入され、開発者の意図しないクエリストリングが作られてしまうことで成立します。
そこで、クエリストリングのバリデーションを実施し、不当なクエリストリングが作成されている場合にはエラーを返す、といった実装をすることで、NoSQLインジェクションの対策になります。
さらに対策したい場合は
NoSQLは、大容量のデータを高速で処理できるという共通項はあるものの、「NoSQL」という名前のデータベースがある訳ではなく、製品によって仕組みが異なります。その多様さから、NoSQLインジェクション対策が確立されているとは言い難く、漏れなく対策することが難しい脆弱性です。
自社で対策を実施しても不安が残る場合には、「脆弱性診断の実施」や「脆弱性診断ツールの導入」といった対応を検討してみてください。
脆弱性診断の実施
脆弱性の対策を漏れなく実施するのは難しいものです。特にセキュリティについての専門的な知識がない場合はなおさらでしょう。診断ベンダーなどの第三者に脆弱性診断を依頼して、NoSQLインジェクションの脆弱性を洗い出してもらうことをおすすめします。
脆弱性診断を実施すれば、検出された場合の該当箇所や具体的な対応策の提示もしてもらえるだけでなく、他の危険な脆弱性の有無もチェックしてもらえるので、セキュアなWebアプリケーションの開発に役立ちます。
「脆弱性診断(セキュリティ診断)とは|必要性からやり方まで、すべて解説」では、脆弱性診断の概要、種類やサービスを選ぶ際のポイントについて説明しています。脆弱性診断について知ることは、自社のニーズに合うセキュリティ対策を検討する上での判断材料になりますので、ご一読いただくことをおすすめします。
脆弱性診断ツールの導入
ベンダーへの脆弱性診断の依頼には工数やコストがかかるため、頻繁に実施するのは難しいものです。ベンダーに依頼せず、自社で診断を実施することも検討してみると良いでしょう。
脆弱性診断ツールを導入すれば、自社の好きなタイミングで診断を実施できるため、ベンダーに依頼するよりもスピーディーな対応が可能です。また、頻繁に診断を依頼する場合は、ツールに置き換えることでコストをおさえることもできます。自社のWebアプリケーションのセキュリティをより手軽に強化したい場合は、診断ツールの導入も検討してみることをおすすめします。
脆弱性診断ツールについては、「脆弱性診断ツール(サービス)|有料・無料の違いと5つの選定ポイント」にて詳細を解説しております。併せてご覧ください。
まとめ|クエリ対応と脆弱性診断でNoSQLインジェクション対策を
NoSQLインジェクションとは、NoSQLのデータベースに対して実行されるインジェクション攻撃です。
攻撃は、以下の方法で防ぐことが出来ます。
- 特殊文字のサニタイズ
- クエリストリングのバリデーション
特殊な意味を持つ文字のサニタイズや、クエリストリングのバリデーションを実施し、入力値がクエリに干渉しないようにすれば、NoSQLインジェクション攻撃のリスクを大幅に下げることが可能です。
自社で対策を実施しても不安が残る場合には、「脆弱性診断の実施」や「脆弱性診断ツールの導入」によるセキュリティの強化が有効です。
脆弱性診断
- 脆弱性が検出された箇所の報告
- 具体的な対応策の提示
- 他の危険な脆弱性の有無もチェック
脆弱性診断ツール
- 脆弱性診断を自社に導入することで外部委託による工数やコストが削減できる
- 好きなタイミングで迅速な診断を実施
- 手軽にセキュリティを強化したい場合におすすめ
脆弱性診断、脆弱性診断ツールを導入することで、その多様さから漏れなく対策することが難しいと言われるNoSQLインジェクションを見つけることができます。自社に合った対策を検討し、Webアプリケーションを安全に運用しましょう。