XXE(XML外部エンティティ攻撃) えっくすえっくすいー
簡単に言うとこんな感じ!
XMLっていうデータ形式の「外部ファイルを読み込む機能」を悪用して、サーバーの中の秘密ファイルを盗み見る攻撃だよ!「ちょっとこのファイルも一緒に読んでね」って命令を忍び込ませる感じなんだ。
XXEとは
XXE(XML External Entity / XML外部エンティティ攻撃) とは、XMLデータを処理するアプリケーションの脆弱性を突いた攻撃手法です。XMLには「エンティティ」と呼ばれる変数のような仕組みがあり、外部ファイルやURLを参照できる「外部エンティティ」機能が悪用されます。
攻撃者は細工したXMLデータをサーバーに送りつけ、本来アクセスできないはずのサーバー内ファイル(パスワードファイルや設定ファイルなど)の内容を読み取ったり、内部ネットワークへの不正アクセス(SSRF)を引き起こしたりします。
OWASP Top 10(Webアプリの重大脆弱性ランキング)にも長年ランクインしており、2017年版では単独カテゴリとして4位に記載されるほど危険度が高い攻撃です。XMLを扱うAPIやファイルアップロード機能を持つシステムは特に注意が必要です。
XXEの仕組みと攻撃パターン
XMLの「エンティティ」は、文書内で繰り返し使う文字列を定義する仕組みです。問題は、外部エンティティ(External Entity) と呼ばれる機能で、ファイルパスやURLを指定して外部リソースを読み込めてしまう点にあります。
攻撃の仕組みを図で見てみよう
【通常のXML通信】
攻撃者 Webサーバー
│ │
│ 正常なXMLデータ送信 │
│ ─────────────────────> │
│ │ → データを処理して返す
│ <───────────────────── │
│ 正常な応答 │
【XXE攻撃】
攻撃者 Webサーバー 内部ファイル
│ │ /etc/passwd
│ 悪意あるXML送信 │ │
│ (外部エンティティ定義) │ │
│ ─────────────────────> │ │
│ │ ───読み込み───> │
│ │ <──ファイル内容── │
│ <───────────────────── │
│ ファイルの中身が返る! │
攻撃XMLの例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<userInput>
<name>&xxe;</name>
</userInput>
上記のXMLでは &xxe; の部分がサーバー上の /etc/passwd(Linuxのユーザー情報ファイル)の内容に置き換えられて処理されてしまいます。
主な攻撃パターン
| 攻撃パターン | 概要 | 危険度 |
|---|---|---|
| ファイル読み取り | サーバー内の設定ファイル・パスワードを盗む | ★★★★★ |
| SSRF(内部ネットワーク探索) | http:// スキームで内部システムへアクセス | ★★★★★ |
| サービス妨害(Billion Laughs) | エンティティを入れ子にしてメモリを枯渇させる | ★★★★☆ |
| ブラインドXXE | 直接応答に出ないが外部サーバーへデータを送信 | ★★★★☆ |
| XXE to RCE | 特定環境でリモートコード実行につなげる | ★★★★★ |
語呂合わせで覚えよう
「X(エックス)なファイルを X(エックス)ックリ盗む E(イー)ッ!」 → XML Xternal Entity = 外部ファイルをこっそり盗む攻撃
歴史と背景
- 1998年 — XML 1.0仕様がW3Cで策定。外部エンティティ機能はこの時点から仕様に含まれていた
- 2002年頃 — XML-RPCやSOAP WebサービスのAPIが普及し、XML処理が広くWebに使われ始める
- 2009年頃 — XMLパーサーの外部エンティティ処理によるセキュリティリスクが本格的に研究・報告され始める
- 2012年 — OWASP Top 10にXXEの危険性が注目されるようになる
- 2017年 — OWASP Top 10 2017でXXEが独立した4位の項目として掲載。業界全体での認知が高まる
- 2018〜2019年 — Facebook、Apple、PayPalなどの大手サービスでもXXEの脆弱性が発見され、バグバウンティで多額の報奨金が支払われる
- 2021年 — OWASP Top 10 2021では「セキュリティの設定ミス」カテゴリに統合されるも、依然として重大な脅威として扱われる
- 現在 — REST APIでJSONが主流になったことで減少傾向にあるが、XML処理を行うレガシーシステムや帳票・EDI連携では依然リスクが高い
XXEが起きやすい場所と対策
狙われやすいシステム
XXE vs 類似攻撃の比較
| 攻撃名 | 狙うもの | 入口 | 特徴 |
|---|---|---|---|
| XXE | XMLパーサーの外部エンティティ機能 | XMLデータを受け取るAPI・フォーム | ファイル読み取り・SSRF |
| SQLインジェクション | データベースへの問い合わせ | テキスト入力フォーム | DBの不正操作 |
| XSS | ブラウザ上のスクリプト実行 | テキスト入力フォーム | ユーザーへの攻撃 |
| SSRF | 内部ネットワークへのアクセス | URLを処理する機能全般 | XXEの二次被害にも |
発注者・管理者が確認すべきポイント
【システム発注・選定時のチェックリスト】
□ XMLを受け取る機能(APIやファイル取込)はあるか?
→ あれば開発会社にXXE対策を明示的に要件として盛り込む
□ SVGファイルや帳票のアップロード機能はあるか?
→ XXE対策を施したパーサーを使用しているか確認
□ 使用しているXMLパーサーのバージョンは最新か?
→ 古いパーサーはデフォルトで外部エンティティが有効な場合あり
□ WASPやセキュリティ診断(脆弱性診断)は実施しているか?
→ XXEは自動スキャンツールで検出可能な脆弱性
関連する規格・RFC
| 規格・番号 | 内容 |
|---|---|
| OWASP Top 10 2017 – A4 | XXEを独立カテゴリとして掲載。対策ガイドライン収録 |
| OWASP Top 10 2021 – A05 | セキュリティの設定ミスに統合されたが引き続き言及 |
| CWE-611 | XML External Entity Reference(共通脆弱性タイプ一覧での識別番号) |
| CVE(各パーサー固有) | Java(Xerces)、Python(lxml)、PHPのSimpleXMLなど各パーサーのCVEが多数存在 |
| W3C XML 1.0仕様 | 外部エンティティ機能の元となった仕様。Section 4.2.2で定義 |
関連用語
- SQLインジェクション — SQLを不正に操作するWebアプリへの代表的な攻撃手法
- XSS(クロスサイトスクリプティング) — 悪意あるスクリプトをブラウザ上で実行させる攻撃
- SSRF(サーバーサイドリクエストフォージェリ) — サーバーを踏み台にして内部ネットワークへ不正アクセスする攻撃
- OWASP Top 10 — Webアプリケーションの重大な脆弱性ランキング
- XML — データを構造化して表現するマークアップ言語
- 脆弱性診断 — システムのセキュリティ上の弱点を発見する検査手法