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

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と呼ばれているんだよ。
← 用語集にもどる