flawopen.com/XXE/.NET XML リーダー
.NET の XmlReader は XXE に安全ですか?
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);
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:
- ✓既定設定の XmlReader.Create — DtdProcessing.Prohibit が既定値です。後の設定変更で意図せず DTD が有効にならないよう、信頼できない入力の境界で明示してください。
- ✓XmlReaderSettings.XmlResolver — .NET Framework 4.5.2 で既定値が null に変更されました。それ以前は XmlUrlResolver の場合があります。明示的に null を設定し、互換スイッチ EnableLegacyXmlSettings を確認してください。
- ✓XmlTextReader — 旧 API を直接使う場合は既定動作が異なり、DTD を解析することがあります。明示設定した XmlReader.Create を使い、信頼できない XML にネットワークまたはファイルの resolver を結び付けないでください。
- ✓XmlDocument と LINQ to XML — 動作は読み込み方法と対象フレームワークによって異なります。強化した XmlReader を渡し、利用可能な resolver は null にしてください。
.NET Framework 4.5.2 では XmlReaderSettings.XmlResolver の既定値が null になり、MaxCharactersFromEntities は初期化時に 1,000 万に設定されました。ただし、すべての XML API や構成が同じという意味ではありません。互換スイッチで旧既定値に戻る場合があります。パーサーの方針を明示し、文書サイズを制限して、実際の対象フレームワークと実行時設定を確認してください。
よくある質問
はい。XmlReaderSettings.DtdProcessing の既定値は Prohibit で、DTD を検出すると例外を送出します。それでも明示的に設定し、縦深防御として XmlResolver = null を指定してください。
セキュリティ上の理由から XmlReaderSettings.XmlResolver の既定値が null になり、MaxCharactersFromEntities は 1,000 万に初期化されます。EnableLegacyXmlSettings で旧動作が戻る場合があるため、対象フレームワークだけでなくデプロイ設定も確認してください。
関係する可能性があります。これらの形式には XML が含まれますが、影響はパーサーと設定によります。信頼できない XML の各入口で強化した reader を使い、入力サイズを制限し、形式ライブラリ固有の安全指針も確認してください。