FlawOpen

flawopen.com/XXE/.NET XML リーダー

.NET の XmlReader は XXE に安全ですか?

CWE-611: XML External Entity Reference要点
要点

DTD は、XML に記された文書をパーサーが取得するための許可証のようなものです。XmlReader.Create は既定で DTD を拒否するため、アプリが有効にしない限り、信頼できない文書からその経路は使えません。旧 API と対象フレームワークも重要です。DTD を明示的に禁止し、解析境界で外部解決を無効にしてください。

危険 — 旧式または弱められた設定
// 旧 reader を直接使うと DTD 解析が有効になる場合がある
// 外部 resolver が参照先を取得する。
var legacy = new XmlTextReader(stream) {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
while (legacy.Read()) { }

// 信頼できない XML で DTD を明示的に有効にするのは危険:
var unsafeSettings = new XmlReaderSettings {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
using var reader = XmlReader.Create(stream, unsafeSettings);
強化済み — DTD と外部リソースを拒否
var settings = new XmlReaderSettings {
    // DTD を含む文書をすべて拒否する。
    DtdProcessing = DtdProcessing.Prohibit,
    // 多層防御:外部リソースを取得しない。
    XmlResolver = null,
    // 正規の入力に合う上限を設定する。
    MaxCharactersInDocument = 1_000_000,
    MaxCharactersFromEntities = 1_024,
};

using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);

使用している XML API と .NET のバージョンは?

.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:

.NET Framework 4.5.2 では XmlReaderSettings.XmlResolver の既定値が null になり、MaxCharactersFromEntities は初期化時に 1,000 万に設定されました。ただし、すべての XML API や構成が同じという意味ではありません。互換スイッチで旧既定値に戻る場合があります。パーサーの方針を明示し、文書サイズを制限して、実際の対象フレームワークと実行時設定を確認してください。

よくある質問

XmlReader.Create は既定で DTD を禁止しますか?

はい。XmlReaderSettings.DtdProcessing の既定値は Prohibit で、DTD を検出すると例外を送出します。それでも明示的に設定し、縦深防御として XmlResolver = null を指定してください。

.NET Framework 4.5.2 では何が変わりましたか?

セキュリティ上の理由から XmlReaderSettings.XmlResolver の既定値が null になり、MaxCharactersFromEntities は 1,000 万に初期化されます。EnableLegacyXmlSettings で旧動作が戻る場合があるため、対象フレームワークだけでなくデプロイ設定も確認してください。

SOAP、SAML、Office 文書の解析にも関係しますか?

関係する可能性があります。これらの形式には XML が含まれますが、影響はパーサーと設定によります。信頼できない XML の各入口で強化した reader を使い、入力サイズを制限し、形式ライブラリ固有の安全指針も確認してください。

参考資料

関連項目 XML 外部実体(XXE)インジェクション(CWE-611):仕組みと防ぎ方 — flawopen.com Java XXE:DocumentBuilderFactory は既定で安全? Python XML の XXE 対策:ElementTree、Expat、lxml