CA3075 : traitement DTD non sécuriséCA3075: Insecure DTD Processing

TypeNameTypeName InsecureDTDProcessingInsecureDTDProcessing
CheckIdCheckId CA3075CA3075
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Si vous utilisez des instances de DtdProcessing non sécurisées ou référencez des sources d’entités externes, l’analyseur peut accepter une entrée non fiable et divulguer des informations sensibles à des personnes malveillantes.If you use insecure DtdProcessing instances or reference external entity sources, the parser may accept untrusted input and disclose sensitive information to attackers.

Description de la règleRule description

Un définition de Type de Document (DTD) est une des deux façons pour un analyseur XML de déterminer la validité d’un document, tel que défini par le World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0.A Document Type Definition (DTD) is one of two ways an XML parser can determine the validity of a document, as defined by the World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Cette règle recherche les propriétés et instances où les données non fiables sont acceptées pour informer les développeurs de menaces de Information Disclosure éventuelles, qui peuvent entraîner des attaques par déni de service .This rule seeks properties and instances where untrusted data is accepted to warn developers about potential Information Disclosure threats, which may lead to Denial of Service (DoS) attacks. Cette règle se déclenche quand :This rule triggers when:

  • DtdProcessing est activé sur l’instance de XmlReader , ce qui résout les entités XML externes à l’aide de XmlUrlResolver.DtdProcessing is enabled on the XmlReader instance, which resolves external XML entities using XmlUrlResolver.

  • La propriété InnerXml dans le code XML est définie.The InnerXml property in the XML is set.

  • DtdProcessing propriété est définie pour l’analyse.DtdProcessing property is set to Parse .

  • L’entrée non fiable est traitée avec XmlResolver au lieu de XmlSecureResolver .Untrusted input is processed using XmlResolver instead of XmlSecureResolver .

  • XmlReader.CreateThe XmlReader.Create méthode est appelée avec un non sécurisé XmlReaderSettings instance ou aucune instance du tout.method is invoked with an insecure XmlReaderSettings instance or no instance at all.

  • XmlReader est créé avec les paramètres par défaut non sécurisées ou des valeurs.XmlReader is created with insecure default settings or values .

    Dans chacun de ces cas, le résultat est le même : le contenu du système de fichiers ou des partages réseau de l’ordinateur où le code XML est traité sera exposé à la personne malveillante et peut ensuite être utilisé comme un vecteur d’attaque par déni de service.In each of these cases, the outcome is the same: the contents from either the file system or network shares from the machine where the XML is processed will be exposed to the attacker, which may then be used as a DoS vector.

Comment corriger les violationsHow to fix violations

  • Intercepter et traiter toutes les exceptions XmlTextReader correctement pour éviter la divulgation d’informations de chemin d’accès.Catch and process all XmlTextReader exceptions properly to avoid path information disclosure .

  • Utilisez XmlSecureResolver pour limiter les ressources auxquelles XmlTextReader peut accéder.Use the XmlSecureResolver to restrict the resources that the XmlTextReader can access.

  • Empêchez XmlReader d’ouvrir des ressources externes en affectant à la propriété XmlResolver la valeur null.Do not allow the XmlReader to open any external resources by setting the XmlResolver property to null.

  • Vérifiez que la propriété DataViewSettingCollectionString de DataViewManager est affectée depuis une source fiable.Ensure that the DataViewSettingCollectionString property of DataViewManager is assigned from a trusted source.

    .NET 3.5 et versions antérieures.NET 3.5 and earlier

  • Désactivez le traitement DTD si vous utilisez des sources non fiables en affectant à la propriété ProhibitDtd la valeur true .Disable DTD processing if you are dealing with untrusted sources by setting the ProhibitDtd property to true .

  • La classe XmlTextReader a une demande d’héritage de confiance totale.XmlTextReader class has a full trust inheritance demand.

    .NET 4 et versions ultérieures.NET 4 and later

  • Évitez d’activer DtdProcessing si vous utilisez des sources non fiables en définissant le XmlReaderSettings.DtdProcessing propriété Prohibit ou ignorer.Avoid enabling DtdProcessing if you're dealing with untrusted sources by setting the XmlReaderSettings.DtdProcessing property to Prohibit or Ignore.

  • Vérifiez que la méthode Load() accepte une instance de XmlReader dans tous les cas InnerXml.Ensure that the Load() method takes an XmlReader instance in all InnerXml cases.

Note

Cette règle peut signaler des faux positifs sur certaines instances de XmlSecureResolver valides.This rule might report false positives on some valid XmlSecureResolver instances. Nous travaillons sur la résolution de ce problème pour le milieu de l’année 2016.We're working on solving this issue by mid 2016.

Quand supprimer les avertissementsWhen to suppress warnings

Sauf si vous êtes sûr que l’entrée provient d’une source fiable, ne supprimez aucune règle de cet avertissement.Unless you're sure that the input is known to be from a trusted source, do not suppress a rule from this warning.

Exemples de pseudo-codePseudo-code Examples

ViolationViolation

using System.IO;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlSchema schema = XmlSchema.Read(tr, null); // warn
            return schema;
        }
    }
}

SolutionSolution

using System.IO;
using System.Xml;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlTextReader reader = new XmlTextReader(tr) { DtdProcessing = DtdProcessing.Prohibit };
            XmlSchema schema = XmlSchema.Read(reader , null);
            return schema;
        }
    }
}

ViolationViolation

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings();
        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);  // warn
        }
    }
}

SolutionSolution

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings()
        {
            DtdProcessing = DtdProcessing.Prohibit
        };

        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);
        }
    }
}

ViolationsViolations

using System.Xml;

namespace TestNamespace
{
    public class DoNotUseSetInnerXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument() { XmlResolver = null };
            doc.InnerXml = xml; // warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class DoNotUseLoadXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument(){ XmlResolver = null };
            doc.LoadXml(xml); // warn
        }
    }
}

SolutionSolution

using System.Xml;

public static void TestMethod(string xml)
{
    XmlDocument doc = new XmlDocument() { XmlResolver = null };
    System.IO.StringReader sreader = new System.IO.StringReader(xml);
    XmlTextReader reader = new XmlTextReader(sreader) { DtdProcessing = DtdProcessing.Prohibit };
    doc.Load(reader);
}

ViolationViolation

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            serializer.Deserialize(stream); // warn
        }
    }
}

SolutionSolution

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            XmlTextReader reader = new XmlTextReader(stream) { DtdProcessing = DtdProcessing.Prohibit } ;
            serializer.Deserialize(reader );
        }
    }
}

ViolationViolation

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XPathDocument doc = new XPathDocument(path); // warn
        }
    }
}

SolutionSolution

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XmlTextReader reader = new XmlTextReader(path) { DtdProcessing = DtdProcessing.Prohibit };
            XPathDocument doc = new XPathDocument(reader);
        }
    }
}

ViolationViolation

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
    }
}

SolutionSolution

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
    }
}

ViolationsViolations

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            XmlReaderSettings settings = new XmlReaderSettings(){ DtdProcessing = DtdProcessing.Parse };
            XmlReader reader = XmlReader.Create(path, settings); // warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod()
        {
            var reader = XmlTextReader.Create(""doc.xml""); //warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            try {
                XmlTextReader reader = new XmlTextReader(path); // warn
            }
            catch { throw ; }
            finally {}
        }
    }
}

SolutionSolution

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            XmlReaderSettings settings = new XmlReaderSettings(){ DtdProcessing = DtdProcessing.Prohibit };
            XmlReader reader = XmlReader.Create(path, settings);
        }
    }
}