Don't enable external XML entity resolution (XXE)
Matches methods that create an XmlUrlResolver (or the obsolete XmlSecureResolver), enable XsltSettings.TrustedXslt / EnableScript / EnableDocumentFunction, or call the obsolete ProhibitDtd setter. With external entity resolution enabled, a crafted document can read local files (*file:///etc/passwd*), reach internal HTTP endpoints (SSRF) or explode memory (billion laughs). https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#net
This is CWE-611 Improper Restriction of XML External Entity Reference.
Flagged Code
This is CWE-611 Improper Restriction of XML External Entity Reference.
Flagged Code
public XmlReader OpenUntrusted(Stream xml) {
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Parse,
XmlResolver = new XmlUrlResolver() // flagged: external entities get fetched
};
return XmlReader.Create(xml, settings);
}
Fixed Codepublic XmlReader OpenUntrusted(Stream xml) {
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit, // the default
XmlResolver = null
};
return XmlReader.Create(xml, settings);
}How to fix
Leave XmlResolver null (the default in .NET Core and .NET Framework 4.5.2+), keep DtdProcessing.Prohibit (or Ignore) in XmlReaderSettings, and use XsltSettings.Default. If external resolution is required for trusted documents only, restrict the resolver to a whitelist and suppress the issue with a justification.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Don't enable external XML entity resolution (XXE)</Name>
// <Id>ND3111:DontEnableExternalXmlEntityResolution</Id>
warnif count > 0
// Third-party members are part of the code model only when the application uses them.
let xxeMembers =
// An XmlUrlResolver fetches external entities and DTDs from arbitrary URLs.
ThirdParty.Types.WithFullNameIn("System.Xml.XmlUrlResolver", "System.Xml.XmlSecureResolver")
.ChildMethods().Where(m => m.IsConstructor)
// Trusted XSLT: script blocks and document() function execute during the transform.
.Concat(ThirdParty.Types.WithFullName("System.Xml.Xsl.XsltSettings")
.ChildMethods().Where(m => m.SimpleNameEqualsAny("get_TrustedXslt", "set_EnableScript", "set_EnableDocumentFunction")))
// ProhibitDtd is obsolete; the only reason to call the setter is to set it to false.
.Concat(ThirdParty.Types.WithFullNameIn("System.Xml.XmlReaderSettings", "System.Xml.XmlTextReader")
.ChildMethods().Where(m => m.SimpleName == "set_ProhibitDtd"))
.ToHashSetEx()
where xxeMembers.Any()
from m in Application.Methods.UsingAny(xxeMembers)
let xxeMembersUsed = m.MethodsCalled.Intersect(xxeMembers).ToArray()
select new {
m,
xxeMembersUsed,
Debt = 30.ToMinutes().ToDebt(),
Severity = Severity.High
}
//<Expl>
// The *{0}* calls *{1}*, which lets an XML document pull external
// entities or run trusted XSLT features. If the XML comes from an
// untrusted source this exposes files, internal endpoints and denial of service.
//</Expl>
//<Desc>
// Matches methods that create an *XmlUrlResolver* (or the obsolete
// *XmlSecureResolver*), enable *XsltSettings.TrustedXslt* / *EnableScript*
// / *EnableDocumentFunction*, or call the obsolete *ProhibitDtd* setter.
// With external entity resolution enabled, a crafted document can read
// local files (*file:///etc/passwd*), reach internal HTTP endpoints
// (SSRF) or explode memory (*billion laughs*).
// https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#net
//
// This is CWE-611 *Improper Restriction of XML External Entity Reference*.
//
// **Flagged Code**
// ```csharp
// public XmlReader OpenUntrusted(Stream xml) {
// var settings = new XmlReaderSettings {
// DtdProcessing = DtdProcessing.Parse,
// XmlResolver = new XmlUrlResolver() // flagged: external entities get fetched
// };
// return XmlReader.Create(xml, settings);
// }
// ```
//
// **Fixed Code**
// ```csharp
// public XmlReader OpenUntrusted(Stream xml) {
// var settings = new XmlReaderSettings {
// DtdProcessing = DtdProcessing.Prohibit, // the default
// XmlResolver = null
// };
// return XmlReader.Create(xml, settings);
// }
// ```
//</Desc>
//<HowToFix>
// Leave *XmlResolver* null (the default in .NET Core and .NET Framework
// 4.5.2+), keep *DtdProcessing.Prohibit* (or *Ignore*) in
// *XmlReaderSettings*, and use *XsltSettings.Default*. If external
// resolution is required for trusted documents only, restrict the resolver
// to a whitelist and suppress the issue with a justification.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Security: all 39 items
- Software Composition Analysis (SCA) ND3120
- Transitive Software Composition Analysis (SCA) ND3121
- Don't hard-code secrets in constants ND3114
- Review credentials built from hard-coded values ND3115
- Don't use insecure deserializers ND3110
- Don't use weak hash algorithms (MD5, SHA1) ND3109
- Don't use DES/3DES/RC2 weak cipher algorithms ND3102
- Don't use weak password-based key derivation ND3123
- Don't use the ECB encryption mode ND3132
- Don't disable certificate validation ND3103
- Don't hard-code TLS/SSL protocol versions ND3122
- Review commands vulnerable to SQL injection ND3107
- Review data adapters vulnerable to SQL injection ND3108
- Review raw SQL built from composed strings ND3128
- Review LDAP filters composed from strings ND3137
- Don't enable external XML entity resolution (XXE) ND3111
- Review processes started with a composed arguments string ND3124
- Review web endpoints building file paths from their parameters ND3129
- Review custom archive extraction (Zip Slip) ND3135
- Review assemblies and types loaded from runtime-provided names ND3125
- Review web endpoints without [Authorize] nor [AllowAnonymous] ND3118
- Review state-changing endpoints opened to anonymous callers ND3130
- Review state-changing MVC actions without anti-forgery validation ND3119
- Review HTML-encoding bypasses ND3133
- Review explicitly disabled request validation ND3134
- Review redirects to a URL that is not validated as local ND3126
- Review request-influenced outbound HTTP calls (SSRF) ND3136
- Review insecure ASP.NET Core CORS policies and unguarded developer exception page ND3116
- Review cookies created without HttpOnly and Secure flags ND3117
- Review regular expressions without a match timeout (ReDoS) ND3112
- Review secrets compared with non-constant-time equality ND3113
- Review secrets passed to logging methods ND3127
- Review security operations that log nothing ND3131
- Don't use System.Random for security purposes ND3101
- Don't use CoSetProxyBlanket and CoInitializeSecurity ND3100
- Review publicly visible event handlers ND3104
- Pointers should not be publicly visible ND3105
- Seal methods that satisfy non-public interfaces ND3106
- Restrict sensitive APIs to reviewed components ND3138