コーダーがセキュリティを制する:共有&学習シリーズ - XMLインジェクション

XMLインジェクションは、ハッカーがXMLデータベースをホストするシステムを侵害するために編み出した、厄介な攻撃手法です。これには、医薬品から映画まで、あらゆる詳細な情報を格納する従来のデータベース全般が含まれます。XMLデータストアの中には、ユーザーの認証に使用されるものもあり、そこに新しいXMLコードを注入することで、ホストシステムが正規のものとして受け入れる新しいユーザーを作成できてしまうのです。
攻撃者がXMLインジェクションを実行するには、XMLデータベースに依存している、あるいは少なくともアクセスしているアプリケーションが必要です。そのような環境でユーザー入力が適切に検証されていない場合、データストアに不正なXMLコードが追加される可能性があります。攻撃者のスキル次第では、XMLコードの追加によって甚大な被害が生じたり、データベース全体へのアクセス権を奪われたりすることさえあります。
読み進めていくと、XMLインジェクションが以前解説したSQLインジェクションと密接に関連していることがわかるでしょう。ターゲットとするデータベースの種類は異なりますが、攻撃の仕組みは非常に似ています。幸いなことに、対策も同様です。一方の攻撃を防ぐ方法を学べば、もう一方の対策にも大いに役立ちます。
本エピソードでは、以下の内容を学びます。
- XMLインジェクションの仕組み
- なぜこれほど危険なのか
- 完全に阻止するための防御策
攻撃者はどのようにXMLインジェクションを仕掛けるのか?
XMLインジェクションは、権限のないユーザーがXMLコードを作成し、既存のXMLデータベースに挿入できた場合に成功します。これには、XMLデータベースに依存または接続しているアプリケーションと、攻撃者が攻撃を仕掛けるための保護されていないデータ経路の2つが必要です。
ユーザー入力がサニタイズ(無害化)されていない、あるいは適切に制限されていない状態でサーバーに送信されると、XMLインジェクションはほぼ確実に成功します。これにより、攻撃者は通常のクエリ文字列の末尾に独自のコードを書き込んだり、注入したりできるようになります。成功すれば、サーバーを騙してXMLコードを実行させ、レコードの追加や削除、さらにはデータベース全体を露呈させることも可能になります。
ハッカーは、通常のクエリにXMLコードを追加することでXMLインジェクション攻撃を実行します。これは検索フィールドからログインページまで、あらゆる場所で行われる可能性があります。Cookieやヘッダーが含まれることもあります。
例えば、登録フォームにおいて、ユーザー名やパスワードのフィールドの後に以下のようなコードを追加するケースが考えられます。
<user></user>
<role>administrator</role>
<username>John_Smith</username><password>Jump783!Tango@12</password>
この例では、管理者権限を持つ「John_Smith」という新しいユーザーが作成されてしまいます。この新しいユーザーは、パスワードの複雑性ルールを遵守しているようですが、残念ながらその正体は攻撃者です。
ハッカーは、必ずしも毎回このような大きな成果を狙うとは限りません。クエリを操作してサーバーから返されるさまざまなエラーメッセージを記録することで、XMLデータベースの構造を把握できる場合があります。そして、その情報は他の攻撃を強化するために利用されます。
なぜXMLインジェクションはこれほど危険なのか?
XMLインジェクション攻撃の危険度は、ターゲットとなるXMLデータベースにどのような情報が格納されているか、あるいはその情報がどのように利用されているかによって異なります。例えば、ユーザー認証にXMLデータベースが使用されている場合、XMLインジェクションによって攻撃者にシステムへのアクセス権を与えてしまう可能性があります。最悪の場合、ターゲットネットワークの管理者権限を奪取される恐れもあり、これは極めて危険な状況です。
従来のデータベースに対するXMLインジェクションの場合、情報の窃取、誤ったデータの追加、あるいは重要なデータの上書きといった危険があります。XMLコードの習得はそれほど難しくなく、一部のコマンドは非常に強力で、情報フィールド全体を上書きしたり、データストアの内容をすべて表示させたりすることが可能です。
一般的に、価値のない情報を格納するためにデータベースを構築する人はいません。ハッカーはそのことを知っているため、データベースを標的にします。もしそのデータに従業員や顧客の個人情報が含まれていれば、侵害されることで社会的信用の失墜、経済的損失、多額の罰金、さらには訴訟に発展する可能性があります。
XMLインジェクション攻撃の阻止
XMLインジェクションは、実行の難易度が低く、XMLデータベースが広く普及していることから、比較的よく見られる攻撃です。しかし、こうした攻撃は古くから存在しており、実行を完全に防ぐための確実な対策がいくつか確立されています。
攻撃を阻止する最善の方法の一つは、アプリケーションを設計する際に、プリコンパイルされたXMLクエリのみを使用するようにすることです。これにより、クエリの機能は許可されたアクティビティのサブセットに限定されます。プリコンパイルされたクエリ関数と一致しない余分な引数やコマンドが含まれている場合、それらは実行されません。それほど厳格な制限を設けない場合は、パラメータ化を利用することも可能です。これは、ユーザー入力を特定の種類のクエリやデータ(整数のみなど)に制限するものです。これらのパラメータから外れるものはすべて無効とみなされ、クエリは強制的に失敗します。
また、プリコンパイルされたクエリやパラメータ化されたクエリと併せて、カスタマイズされたエラーメッセージを使用することも推奨されます。クエリ失敗時にデフォルトの詳細なエラーメッセージを返すのではなく、アプリケーション側でそれらの応答をインターセプトし、より汎用的なメッセージに置き換えるべきです。理想的には、ユーザーにクエリが失敗した理由は伝えても、データベース自体に関する情報は一切与えないようにします。カスタムメッセージをいくつかの選択肢に限定しておけば、攻撃者は失敗したクエリから有用な情報を収集することができなくなります。
XMLインジェクションは、登場当初は非常に高い成功率を誇っていました。しかし、それから長い年月が経過した現在では、突破不可能な防御策を容易に構築できるようになっています。
XMLインジェクションに関する詳細情報
詳細については、OWASPによるXMLインジェクションの解説をご覧ください。また、学んだ防御知識を試すには、Secure Code Warriorプラットフォームの無料デモをご利用ください。このプラットフォームでは、サイバーセキュリティチームを究極のサイバー戦士へと育成します。この脆弱性やその他の脅威への対策について詳しくは、Secure Code Warriorブログをご覧ください。
AI主導の開発をリリース前にガバナンスする
AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。
他のブログ記事を見る
セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
AIを活用した開発をリリース前にセキュアに
開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。



.avif)