FlawOpen

flawopen.com/XXE/.NET-XML-Reader

Ist XmlReader in .NET gegen XXE geschützt?

CWE-611: XML External Entity ReferenceKurzantwort
Kurzantwort

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.

UNSICHER — alte oder abgeschwächte Muster
// 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);
GEHÄRTET — DTDs und externe Ressourcen ablehnen
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:

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

Verbietet XmlReader.Create DTDs standardmäßig?

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.

Was änderte sich in .NET Framework 4.5.2?

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.

Betrifft das SOAP, SAML oder Office-Dokumente?

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

Siehe auch XML External Entity Injection (XXE, CWE-611): Funktionsweise und Schutz — flawopen.com Java-XXE: Ist DocumentBuilderFactory standardmäßig sicher? Python XML-XXE-Sicherheit: ElementTree, Expat und lxml