Coders Conquer Security:シェア&ラーンシリーズ - XXEインジェクション

2019年8月01日発行
ケーススタディ

Coders Conquer Security:シェア&ラーンシリーズ - XXEインジェクション

XML External Entity Injection攻撃(XXE injectionと略されることもある)は、発生から数年経っても話題になっている古典的な脆弱性に比べると、比較的新しい攻撃です。しかし、現在、ハッキングコミュニティの間では非常に人気があり、成功例を重ねることでさらに人気が高まっています。

実際、OWASPは、XXEインジェクションを、サイトが注意し、積極的に防御する必要があるトップ10の脆弱性の1つとして挙げています。しかし、心配する必要はありません。XXEインジェクションは、サイバー攻撃で使用されている他のエクスプロイトよりも強力なものではありません。ただ、少しだけ新しく、少しだけ理解されていないだけです。防ぐことができますし、実際に完全に止めることもできます。

このエピソードでは、以下のことを学びます。

  • 攻撃者がXXEインジェクションを使用する方法
  • XXE注入が危険な理由
  • この脆弱性を防ぐことができる技術

攻撃者はどのようにXXEインジェクションを引き起こすのか?

XXEインジェクションの脆弱性は、悪意のあるユーザーがXMLコードを送信する機能を与えられた場合に発生する可能性があります。悪意のあるユーザは、この機能を使って、外部のエンティティへの参照を作成します。この外部参照とコードは、デフォルト設定のXMLパーサーや、脆弱な設定のXMLパーサーをすり抜けるように設計されています。

この攻撃者は、XML規格がエンティティの概念をある種の記憶装置として定義しているが、その記憶装置は外部にも内部にもあるという事実を利用しています。適切に使用すれば、XMLプロセッサがリモートリソースにアクセスできるようになります。多くの場合、攻撃者はこの機能を利用して、Webサイトの内部構造を探ったり、リモートリソースにアクセスしようとする大規模なシステムプロセスを起動してサービス拒否攻撃を行ったり、さらにはローカルホストから自分がコントロールするリモートホストにデータをダンプしたりするなど、XMLデータベースに含まれるパスワードや個人情報などの重要なデータを流出させるのに適した手法となっています。

攻撃に使われる実際のコードは、実体のある機能を利用するだけの非常に単純なものであることが多い。例えば、ハッカーがマスターパスワードファイルにアクセスすることができるようなものです。

<!ENTITY hackwithxxe SYSTEM file:///etc/password>

なぜXXEインジェクションは危険なのか?

XXEインジェクション攻撃が非常に危険であり、また蔓延している理由はいくつかあります。1つは、現在あまり理解されていない脆弱性であること。そして、この脆弱性を悪用することで攻撃者が得られる利益は相当なものです。1つは、持続的な攻撃者が内部ネットワークのすべてのパスをゆっくりとマッピングしたり、ポートをスキャンしたりできることです。これにはかなりの時間がかかるかもしれませんが、ハッカーは信頼されたXMLパーサーによってクリアされたXMLコードをサーバーに送信しているだけなので、ターゲットネットワーク上のアクティブな防御によってハッカーの活動が発見される可能性はほとんどありません。

いったんマップが作成されると、攻撃者は同じXXEインジェクション技術を使用して、必要なファイルを取得し、直接情報を盗んだり、有効なユーザー認証情報を侵害して二次攻撃に利用したりすることができます。最後に、ただ騒ぎ立てて悪意を持ちたい攻撃者は、サービス拒否攻撃を誘発し、システムを停滞させるように設計された遠隔地のリソースにアクセスするようにアプリケーションに命令するといったことができます。  

XXEインジェクション脆弱性の解消

XXEインジェクション攻撃が急増しているため、多くのXMLパーサーは外部エンティティ(DTDと呼ばれることもある)をデフォルトで完全に無効にし始めています。このような場合、重要なのは、その機能を有効にしないことです。

しかし、DTDを許可しているパーサーでも、その機能を無効にすることができます。一般的には、完全にブロックするためには以下のような記述が必要になりますが、必要なコードを正確に把握するためには、ローカルフレームワークのドキュメントを確認してください。

factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)。

セキュリティの原則に従って、すべてのユーザーの入力をサニタイズし、アプリケーション全体のフィルタを使用して検証する必要があります。GET や POST のパラメータ、HTTP ヘッダー、Cookie も忘れずに入れてください。また、パーサーに処理させたい特定の DTD やコマンドのホワイトリストを作成し、それ以外のものを禁止することもできます。

ホワイトリストやフィルタリングは有効ですが、XXEインジェクション攻撃が増加しているため、機能が必要でない場合はDTDサポートを完全に無効にすることをお勧めします。

XXE Injectionsの詳細情報

さらに、OWASPがXXEインジェクション攻撃についてどのように述べているかを読んでみてください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御知識を試すこともできます。この脆弱性やその他の脅威への対策については、Secure Code Warrior ブログをご覧ください。

リソースを見る
リソースを見る

著者

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Coders Conquer Security:シェア&ラーンシリーズ - XXEインジェクション

2019年8月01日発行
By

XML External Entity Injection攻撃(XXE injectionと略されることもある)は、発生から数年経っても話題になっている古典的な脆弱性に比べると、比較的新しい攻撃です。しかし、現在、ハッキングコミュニティの間では非常に人気があり、成功例を重ねることでさらに人気が高まっています。

実際、OWASPは、XXEインジェクションを、サイトが注意し、積極的に防御する必要があるトップ10の脆弱性の1つとして挙げています。しかし、心配する必要はありません。XXEインジェクションは、サイバー攻撃で使用されている他のエクスプロイトよりも強力なものではありません。ただ、少しだけ新しく、少しだけ理解されていないだけです。防ぐことができますし、実際に完全に止めることもできます。

このエピソードでは、以下のことを学びます。

  • 攻撃者がXXEインジェクションを使用する方法
  • XXE注入が危険な理由
  • この脆弱性を防ぐことができる技術

攻撃者はどのようにXXEインジェクションを引き起こすのか?

XXEインジェクションの脆弱性は、悪意のあるユーザーがXMLコードを送信する機能を与えられた場合に発生する可能性があります。悪意のあるユーザは、この機能を使って、外部のエンティティへの参照を作成します。この外部参照とコードは、デフォルト設定のXMLパーサーや、脆弱な設定のXMLパーサーをすり抜けるように設計されています。

この攻撃者は、XML規格がエンティティの概念をある種の記憶装置として定義しているが、その記憶装置は外部にも内部にもあるという事実を利用しています。適切に使用すれば、XMLプロセッサがリモートリソースにアクセスできるようになります。多くの場合、攻撃者はこの機能を利用して、Webサイトの内部構造を探ったり、リモートリソースにアクセスしようとする大規模なシステムプロセスを起動してサービス拒否攻撃を行ったり、さらにはローカルホストから自分がコントロールするリモートホストにデータをダンプしたりするなど、XMLデータベースに含まれるパスワードや個人情報などの重要なデータを流出させるのに適した手法となっています。

攻撃に使われる実際のコードは、実体のある機能を利用するだけの非常に単純なものであることが多い。例えば、ハッカーがマスターパスワードファイルにアクセスすることができるようなものです。

<!ENTITY hackwithxxe SYSTEM file:///etc/password>

なぜXXEインジェクションは危険なのか?

XXEインジェクション攻撃が非常に危険であり、また蔓延している理由はいくつかあります。1つは、現在あまり理解されていない脆弱性であること。そして、この脆弱性を悪用することで攻撃者が得られる利益は相当なものです。1つは、持続的な攻撃者が内部ネットワークのすべてのパスをゆっくりとマッピングしたり、ポートをスキャンしたりできることです。これにはかなりの時間がかかるかもしれませんが、ハッカーは信頼されたXMLパーサーによってクリアされたXMLコードをサーバーに送信しているだけなので、ターゲットネットワーク上のアクティブな防御によってハッカーの活動が発見される可能性はほとんどありません。

いったんマップが作成されると、攻撃者は同じXXEインジェクション技術を使用して、必要なファイルを取得し、直接情報を盗んだり、有効なユーザー認証情報を侵害して二次攻撃に利用したりすることができます。最後に、ただ騒ぎ立てて悪意を持ちたい攻撃者は、サービス拒否攻撃を誘発し、システムを停滞させるように設計された遠隔地のリソースにアクセスするようにアプリケーションに命令するといったことができます。  

XXEインジェクション脆弱性の解消

XXEインジェクション攻撃が急増しているため、多くのXMLパーサーは外部エンティティ(DTDと呼ばれることもある)をデフォルトで完全に無効にし始めています。このような場合、重要なのは、その機能を有効にしないことです。

しかし、DTDを許可しているパーサーでも、その機能を無効にすることができます。一般的には、完全にブロックするためには以下のような記述が必要になりますが、必要なコードを正確に把握するためには、ローカルフレームワークのドキュメントを確認してください。

factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)。

セキュリティの原則に従って、すべてのユーザーの入力をサニタイズし、アプリケーション全体のフィルタを使用して検証する必要があります。GET や POST のパラメータ、HTTP ヘッダー、Cookie も忘れずに入れてください。また、パーサーに処理させたい特定の DTD やコマンドのホワイトリストを作成し、それ以外のものを禁止することもできます。

ホワイトリストやフィルタリングは有効ですが、XXEインジェクション攻撃が増加しているため、機能が必要でない場合はDTDサポートを完全に無効にすることをお勧めします。

XXE Injectionsの詳細情報

さらに、OWASPがXXEインジェクション攻撃についてどのように述べているかを読んでみてください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御知識を試すこともできます。この脆弱性やその他の脅威への対策については、Secure Code Warrior ブログをご覧ください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。