FlawOpen

flawopen.com/XXE/Lecteurs XML .NET

XmlReader est-il sûr contre XXE dans .NET ?

CWE-611: XML External Entity ReferenceRéponse courte
Réponse courte

Imaginez qu’une DTD soit une autorisation donnée au parser pour récupérer les documents nommés dans le XML. XmlReader.Create refuse les DTD par défaut : un document non fiable ne peut donc pas emprunter cette voie à moins que l’application l’active. Les API héritées et la version cible comptent aussi : refusez explicitement les DTD et désactivez la résolution externe à la frontière de parsing.

NON SÉCURISÉ — patterns hérités ou affaiblis
// Un lecteur hérité direct peut activer le parsing DTD
// et un resolver externe peut récupérer les ressources citées.
var legacy = new XmlTextReader(stream) {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
while (legacy.Read()) { }

// Réactiver les DTD pour du XML non fiable est risqué :
var unsafeSettings = new XmlReaderSettings {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};
using var reader = XmlReader.Create(stream, unsafeSettings);
RENFORCÉ — refuser DTD et ressources externes
var settings = new XmlReaderSettings {
    // Refusez tout document contenant une DTD.
    DtdProcessing = DtdProcessing.Prohibit,
    // Défense en profondeur : ne récupérez aucune ressource externe.
    XmlResolver = null,
    // Adaptez les limites aux entrées légitimes de l’application.
    MaxCharactersInDocument = 1_000_000,
    MaxCharactersFromEntities = 1_024,
};

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

Quelle API XML et quelle version de .NET utilisez-vous ?

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

La modification de .NET Framework 4.5.2 a défini XmlReaderSettings.XmlResolver à null et initialisé MaxCharactersFromEntities à 10 millions ; elle n’a pas rendu toutes les API XML ni toutes les configurations équivalentes. Une option de compatibilité peut rétablir les anciens paramètres. Définissez explicitement la politique du parser, bornez la taille du document et vérifiez la version et la configuration réelles d’exécution.

Questions fréquentes

XmlReader.Create interdit-il les DTD par défaut ?

Oui. XmlReaderSettings.DtdProcessing vaut Prohibit par défaut et lève une exception lorsqu’une DTD est rencontrée. Définissez-le malgré tout explicitement et utilisez XmlResolver = null en défense en profondeur.

Qu’est-ce qui a changé dans .NET Framework 4.5.2 ?

Pour des raisons de sécurité, XmlReaderSettings.XmlResolver vaut désormais null par défaut et MaxCharactersFromEntities est initialisé à 10 millions. L’option EnableLegacyXmlSettings peut rétablir le comportement antérieur ; vérifiez la configuration déployée, pas seulement la version cible.

Cela concerne-t-il SOAP, SAML ou les documents Office ?

C’est possible. Ces formats contiennent du XML, mais l’effet dépend du parser et de ses paramètres. Faites passer chaque entrée XML non fiable par un lecteur renforcé, bornez sa taille et consultez aussi les consignes de sécurité de la bibliothèque concernée.

Sources et références

À voir aussi Injection d'entité externe XML (XXE, CWE-611) : fonctionnement et prévention — flawopen.com XXE Java : DocumentBuilderFactory est-elle sûre par défaut ? Sécurité XXE XML en Python : ElementTree, Expat et lxml