flawopen.com/XXE/.NET-XML-Reader
Ist XmlReader in .NET gegen XXE geschützt?
Eine DTD ist wie eine Erlaubnis für den Parser, Dokumente abzurufen, die im XML genannt werden. XmlReader.Create weist DTDs standardmäßig zurück; nicht vertrauenswürdiges XML kann diesen Weg also nur nutzen, wenn die Anwendung ihn aktiviert. Auch ältere APIs und das Zielframework sind wichtig: Verbieten Sie DTDs ausdrücklich und schalten Sie die externe Auflösung an der Parsergrenze ab.
// Ein direkter Legacy-Reader kann DTD-Verarbeitung aktivieren // und ein externer Resolver kann referenzierte Ressourcen abrufen. var legacy = new XmlTextReader(stream) { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; while (legacy.Read()) { } // DTDs bei nicht vertrauenswürdigem XML zu aktivieren ist riskant: var unsafeSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; using var reader = XmlReader.Create(stream, unsafeSettings);
var settings = new XmlReaderSettings {
// Jedes Dokument mit einer DTD zurückweisen.
DtdProcessing = DtdProcessing.Prohibit,
// Zusätzlicher Schutz: keine externen Ressourcen abrufen.
XmlResolver = null,
// Grenzen passend zu legitimen Anwendungseingaben wählen.
MaxCharactersInDocument = 1_000_000,
MaxCharactersFromEntities = 1_024,
};
using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);
Welche XML-API und .NET-Version verwenden Sie?
.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:
- ✓XmlReader.Create mit Standardeinstellungen — DtdProcessing.Prohibit ist der Standard. Setzen Sie ihn an jeder Grenze für nicht vertrauenswürdige Eingaben ausdrücklich, damit eine spätere Änderung nicht unbemerkt DTDs aktiviert.
- ✓XmlReaderSettings.XmlResolver — .NET Framework 4.5.2 setzte den Standard auf null; ältere Ziele konnten XmlUrlResolver verwenden. Setzen Sie ausdrücklich null und prüfen Sie den Kompatibilitätsschalter EnableLegacyXmlSettings.
- ✓XmlTextReader — die direkte Verwendung dieser alten API hat andere Standardwerte und kann DTDs parsen. Bevorzugen Sie XmlReader.Create mit expliziten Einstellungen; verknüpfen Sie niemals einen Netzwerk- oder Datei-Resolver mit nicht vertrauenswürdigem XML.
- ✓XmlDocument und LINQ to XML — das Verhalten hängt vom Ladeweg und Zielframework ab. Übergeben Sie einen gehärteten XmlReader und setzen Sie verfügbare Resolver auf null.
Die Änderung in .NET Framework 4.5.2 setzte XmlReaderSettings.XmlResolver auf null und initialisierte MaxCharactersFromEntities mit 10 Millionen; sie machte weder alle XML-APIs noch alle Konfigurationen gleich. Ein Kompatibilitätsschalter kann alte Standardwerte wiederherstellen. Legen Sie die Parserrichtlinie ausdrücklich fest, begrenzen Sie die Dokumentgröße und prüfen Sie das tatsächlich verwendete Zielframework und die Laufzeitkonfiguration.
Häufige Fragen
Ja. XmlReaderSettings.DtdProcessing steht standardmäßig auf Prohibit und löst bei einer DTD eine Ausnahme aus. Setzen Sie den Wert trotzdem ausdrücklich und verwenden Sie XmlResolver = null als zusätzliche Schutzschicht.
Aus Sicherheitsgründen ist XmlReaderSettings.XmlResolver standardmäßig null; MaxCharactersFromEntities wird mit 10 Millionen initialisiert. EnableLegacyXmlSettings kann das frühere Verhalten wiederherstellen. Prüfen Sie die bereitgestellte Konfiguration, nicht nur das Zielframework.
Das kann es. Diese Formate enthalten XML, doch die Wirkung hängt vom Parser und seinen Einstellungen ab. Verwenden Sie an jedem Eingang für nicht vertrauenswürdiges XML einen gehärteten Reader, begrenzen Sie die Eingabegröße und beachten Sie zusätzlich die Sicherheitshinweise der jeweiligen Formatbibliothek.
Quellen und Referenzen
- Microsoft Learn — XmlReaderSettings und Sicherheit
- Microsoft Learn — XML-Parsingänderungen in .NET Framework 4.5.2
- Microsoft Learn — XmlReader.Create und Resolververhalten
- Microsoft Learn — XmlTextReader.XmlResolver
- OWASP — XXE-Prävention
- CWE-611 — XML External Entity Reference
- XXE-Standardwerte von Java DocumentBuilderFactory