セキュリティ設定の不備 - XXEの詳細
「XML外部エンティティ(XXE)」脆弱性は、XMLパーサーに関連するセキュリティ設定の不備の一種です。
XML標準には、ファイルやURLなどの「エンティティ」を参照する仕組みが含まれています。多くのパーサーでは、デフォルトで外部エンティティを完全に解決する設定になっているため、XMLドキュメントを悪用してファイルや機密情報が攻撃者に漏洩する恐れがあります。
簡単な例
外部エンティティを使用したXMLドキュメントの例を見てみましょう。
xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
<!ENTITY externalEntity SYSTEM "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>
まず、ドキュメント内に存在し、パーサーによって処理可能な構造や要素型を定義する「doctype」を宣言します。
その中で、「externalEntity」というSYSTEM型のエンティティを指定します。このエンティティは「/etc/passwd」ファイルを指しています。
「doctype」定義の後に、実際のXMLデータが続きます。「outerElement」を定義し、そこに「&」で示される「externalEntity」エンティティへの参照を追加します。
この時点で、インタープリターはエンティティ定義を検索し、定義されたURLを解決して「&externalEntity;」の部分を置き換えます。
解析プロセスが終了すると、ドキュメントは以下のようになります。
xml
<?xml version="1.0" ?>
<outerElement>
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
....
</outerElement>
緩和策
XXEに対する完全な保護の必要性と具体的な方法は、使用する言語、フレームワーク、およびそのバージョンに大きく依存します。
多くの場合、組み合わせによってパーサーの特定の機能を無効化し、ファイルの解決を防ぐことは可能ですが、HTTPパスの解決までは防げないことがあります。また、エンティティの展開が許可されたままだと、それ自体がサービス拒否(DoS)攻撃の脆弱性につながる可能性があります。
.NET
.NET 4.5.1以前を使用している場合、以下のクラスはデフォルトで脆弱です。
- XmlDocument(‘xmlDocument.XmlResolver = null;’で無効化)
- XmlTextReader(‘xmlTextReader.ProhibitDtd = true;’で無効化)
- XPathNavigator
実践的なセキュアコーディング
OWASP Top 10のようなソフトウェアの脆弱性を理解し軽減するためのセキュアコーディングガイドラインを確認しましょう。また、実践的なアプリシミュレーションを通じて学べるトレーニングミッションにもぜひ挑戦してください。