flawopen.com/XXE/Lecteurs XML .NET
XmlReader est-il sûr contre XXE dans .NET ?
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.
// 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);
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:
- ✓XmlReader.Create avec les paramètres par défaut — DtdProcessing.Prohibit est la valeur par défaut. Définissez-la explicitement aux entrées non fiables pour qu’une modification ultérieure n’active pas les DTD par inadvertance.
- ✓XmlReaderSettings.XmlResolver — .NET Framework 4.5.2 a fixé la valeur par défaut à null ; les versions antérieures pouvaient utiliser XmlUrlResolver. Définissez explicitement null et vérifiez l’option de compatibilité EnableLegacyXmlSettings.
- ✓XmlTextReader — l’utilisation directe de cette API héritée a des valeurs par défaut différentes et peut analyser les DTD. Préférez XmlReader.Create avec des paramètres explicites ; n’associez jamais de resolver réseau ou fichier à du XML non fiable.
- ✓XmlDocument et LINQ to XML — le comportement dépend du chargement et de la version cible. Fournissez un XmlReader renforcé et définissez tout resolver disponible à null.
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
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.
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.
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
- Microsoft Learn — XmlReaderSettings et sécurité
- Microsoft Learn — changements du parsing XML dans .NET Framework 4.5.2
- Microsoft Learn — XmlReader.Create et résolution
- Microsoft Learn — XmlTextReader.XmlResolver
- OWASP — prévention XXE
- CWE-611 — référence à une entité externe XML
- Valeurs par défaut XXE de DocumentBuilderFactory en Java