【えっくすえっくすいー】

XXE(XML外部エンティティ攻撃) とは?

💡 XMLの「外部ファイル読み込み」機能を使って、金庫の中身を引き出す
📌 このページのポイント
XXE攻撃の仕組み 攻撃者 Attacker 悪意あるXMLリクエスト DOCTYPE foo [ ENTITY xxe SYSTEM "file:///etc/passwd" ] XMLパーサー 外部エンティティを処理 送信 サーバーファイル /etc/passwd 設定ファイル・SSHキー 読み込む ファイル内容がレスポンスに混入 パーサーが外部エンティティ処理を無効にしていれば攻撃は成立しない (setFeature で EXTERNAL_GENERAL_ENTITIES = false に設定)
XMLパーサーが外部ファイルを読み込む機能を悪用する
ひよこ ひよこ

XXEってなに?XMLって関係あるの?

ペンギン先生 ペンギン先生

XMLには外部のファイルやURLを「エンティティ」として定義して文書内に埋め込める機能があるんだよ。XXEはその機能を悪用して、サーバー上の秘密ファイルを読み取る攻撃だね。

ひよこ ひよこ

外部エンティティってどういう仕組みなの?

ペンギン先生 ペンギン先生

XMLのDOCTYPE宣言で "<!ENTITY 名前 SYSTEM 'ファイルパスURL'>" と書くと、パーサーがその内容を読み込んで埋め込んでくれる仕組みだよ。例えば "file:///etc/passwd" と書けばサーバーのパスワードファイルが引き込まれてしまうんだね。

ひよこ ひよこ

攻撃者はどんなものを盗めるの?

ペンギン先生 ペンギン先生

/etc/passwd のようなシステムファイル、アプリの設定ファイル、SSHの秘密鍵などが狙われるよ。さらに "http://内部サーバー/..." のURLを指定すればSSRFとして内部ネットワークへのリクエストにも使えてしまうんだね。

ひよこ ひよこ

なんでこんな危ない機能が残ってるの?

ペンギン先生 ペンギン先生

外部エンティティはもともと「文書の再利用」のための便利機能として設計されたんだよ。昔のXMLパーサーデフォルトで有効にしていたし、今でも設定を変えていないパーサーが多いから脆弱性として残り続けているんだね。

ひよこ ひよこ

どうやって直せばいいの?

ペンギン先生 ペンギン先生

XMLパーサーの外部エンティティ処理を無効化するだけでいいんだよ。Javaなら SAXParser の setFeature で FEATURE_EXTERNAL_GE を false に設定するのが典型的な対策だね。XMLが不要な場面ではJSONに切り替えるのも有効だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「XXE」って出てきたら「XMLの外部読み込み機能でファイルを盗む攻撃」と思えればだいたいOK!
📖 おまけ:英語の意味
「XML External Entity」 = XML外部エンティティ
💬 XML(データ記述言語)のExternal Entity(外部エンティティ)機能を悪用する攻撃で、頭文字をとってXXEと呼ばれているんだよ。
← 用語集にもどる