XXE(XML External Entity)攻撃とは、XMLパーサが外部エンティティの参照を許可している場合に発生する脆弱性を悪用した攻撃です。XMLの仕様では、外部リソースをエンティティとして宣言し、後で参照できるようになっていますが、この機能を悪用すると、システム内のファイルを不正に読み取ったり、リモートサーバーへのリクエストを送信させたりすることが可能です。
XML外部エンティティの例
以下のようなXMLデータがあるとします。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
&xxe;
</root>
この場合、&xxe;というエンティティ参照が解決される際に、システム内のファイル(/etc/passwd)が読み込まれてしまいます。これはサーバー側のファイルを外部に漏洩させる危険な操作です。
XXE攻撃の仕組み
XXE攻撃は、主に以下の流れで行われます。
1. 悪意のあるXMLデータを送信
攻撃者は、XMLを利用するWebアプリケーションに対して、外部エンティティを含む特別に細工されたXMLを送信します。これにより、サーバーが外部エンティティを参照して、内部ファイルやリソースにアクセスするよう仕向けます。
2. エンティティの解決
XMLパーサがこの悪意あるエンティティを解釈し、システム内のリソースや外部のURLを参照します。これにより、攻撃者はファイルの内容を読み取ったり、サーバーにリクエストを送信させたりすることができます。
3. 情報漏洩やリモートリクエストの実行
攻撃者は、XMLパーサによって解決されたエンティティから機密情報を入手したり、別のシステムへの攻撃を行うためにリソースを利用します。
XXE攻撃のリスク
XXE攻撃が成功すると、システムやネットワークに対して深刻な影響を及ぼします。具体的には、次のようなリスクがあります。
1. 機密情報の漏洩
攻撃者は、サーバー上の機密ファイル(例:設定ファイル、パスワードファイル、データベース接続情報など)を読み取り、システムの内部情報を盗むことができます。例えば、Linuxサーバーの/etc/passwdファイルを読み取ることで、ユーザー情報にアクセスできます。
2. サーバー内でのリモートコード実行
XXEを利用してリモートでコードを実行することが可能になる場合があります。これにより、サーバーが攻撃者に制御され、さらなる攻撃(リモートコード実行、ランサムウェアのインストールなど)が行われる可能性があります。
3. 外部サービスへのリクエスト送信
攻撃者が悪意のあるリモートサーバーにリクエストを送信させることで、サーバーを踏み台にして他のターゲットに攻撃を仕掛けることが可能です。これはSSRF(Server-Side Request Forgery:サーバーサイドリクエスト偽造)と呼ばれる攻撃手法です。
4. サービス拒否(DoS)
攻撃者が膨大な外部リソースを要求するようなエンティティを作成し、システムのリソースを消耗させることで、サービス拒否(DoS)状態に追い込むこともできます。
XXE攻撃の防止策
XXE攻撃を防ぐためには、XMLの処理に関連する設定や、入力データの検証を強化する必要があります。以下の対策を実施することで、攻撃のリスクを低減できます。
1. 外部エンティティの無効化
XMLパーサの設定で、外部エンティティの処理を無効化することが重要です。これにより、攻撃者が細工した外部エンティティを利用できなくなります。主要なプログラミング言語やフレームワークには、外部エンティティを無効化するための設定があります。
例:Javaでの外部エンティティ無効化
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
2. 入力データのバリデーション
受け取ったXMLデータの構造や内容を検証し、不正な入力が含まれていないかチェックします。外部エンティティだけでなく、他の潜在的な脆弱性も事前に検証することで、攻撃のリスクを減らすことができます。
3. 安全なパーサの使用
外部エンティティを無効化するデフォルト設定を持つ、安全なXMLパーサを使用します。多くの最新ライブラリでは、XXE攻撃に対する防御が標準で有効化されている場合があります。
4. JSONや他のフォーマットの使用
XMLの代わりに、JSONなどの他の安全なデータフォーマットを使用することも一つの有効な手段です。JSONは外部エンティティを持たないため、XXE攻撃のリスクがありません。
まとめ
XXE(XML External Entity)攻撃は、XMLパーサが外部エンティティを処理する際に発生する深刻な脆弱性です。この攻撃により、機密情報の漏洩やサーバーの制御が奪われるリスクがあります。XXE攻撃を防ぐためには、XMLパーサの設定で外部エンティティを無効化することや、安全なパーサの使用、入力データのバリデーションが重要です。
セキュリティ対策をしっかり講じることで、こうした攻撃からシステムを守り、信頼性の高いサービスを提供することができます。