セキュリティ設定ミス-XXE 詳細
「XML 外部エンティティ」(XXE) 脆弱性クラスは、XML パーサーが関与するセキュリティ設定ミスです。
XML 標準には、ファイルや URL などの「エンティティ」を参照する方法が含まれています。多くの場合、パーサーは外部エンティティを完全に解決するのがデフォルトです。つまり、XML 文書によって、潜在的な攻撃者にファイルやその他の機密情報が漏洩する可能性があります。
簡単な例
外部エンティティを利用する XML 文書の例を少し見てみましょう。
xml
<?xml バージョン= "1.0"?>
<!DOCTYPE アウターエレメント [
<!] >
<outerElement>&外部エンティティ;</outerElement>
まず、ドキュメント内に存在してパーサーが処理できる構造/要素タイプを定義する新しい「doctype」を宣言します。
その中で、「ExternalEntity」というシステムタイプのエンティティを指定します。このエンティティは '/etc/passwd' ファイルを指しています。
「doctype」の定義に従うと、実際の XML データが得られます。「OuterElement」を定義してから、「ExternalEntity」エンティティへの参照 (「&」で示される) を追加します。
この時点で、インタプリタはエンティティ定義を検索し、定義された URL を解決して「&ExternalEntity;」の代わりに配置します。
解析プロセスが終了すると、次のような文書ができあがります。
xml
<?xml バージョン= "1.0"?>
<outerElement>
ルート:: 0:0: ルート:/ルート:/usr/bin/zsh
デーモン:x: 1:1: デーモン:/usr/sbin: /usr/sbin/nologin
ビン:: 2:2: ビン:/ビン:/ユーザー/スビン/ログイン
...
</outerElement>
緩和策
XXE から完全に保護する方法の必要性と詳細は、言語、フレームワーク、およびそのバージョンに大きく依存します。
それぞれの組み合わせにより、多くの場合、ファイルの解決を妨げる可能性のあるパーサーのいくつかの側面を無効にできますが、HTTPパスは無効にできません。あるいは、それでもエンティティの拡張が可能になり、それ自体がサービス拒否の脆弱性につながる可能性があります。
.NET
.NET 4.5.1 以前を実行している場合、次のクラスはデフォルトで脆弱です。
- XmlDocument ('XmlDocument.xmlResolver = null; 'を指定すると無効になります)
- XmlTextReader ('XmlTextReader.ProhibitDTD = true; 'で無効にする)
- XPath ナビゲーター
Secure coding made practical
Explore secure coding guidelines to understand and mitigate software vulnerabilities like the OWASP Top 10, and dive into guided training Missions to practices in real-world app simulations.