CA3075: Processamento de DTD não seguro
Property | Valor |
---|---|
ID da regra | CA3075 |
Título | Processamento de DTD não seguro |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
Se você usar instâncias de DtdProcessing inseguras ou referenciar origens de entidade externa, o analisador poderá aceitar a entrada não confiável e divulgar as informações confidenciais para invasores.
Descrição da regra
Uma definição de tipo de documento (DTD) é uma das duas maneiras pelas quais um analisador XML pode determinar a validade de um documento, conforme definido pela XML (linguagem XML) 1.0 do World Wide Web Consortium (W3C). Essa regra busca propriedades e instâncias em que dados não confiáveis são aceitos para alertar os desenvolvedores sobre possíveis ameaças de divulgação não autorizada de informação ou ataques de DoS (Negação de Serviço). Essa regra dispara quando:
O DtdProcessing está habilitado na instância XmlReader, que resolve entidades XML externas usando XmlUrlResolver.
A propriedade InnerXml no XML está definida.
A propriedade DtdProcessing é definida como Analisar.
A entrada não confiável é processada usando XmlResolver em vez de XmlSecureResolver.
O método XmlReader.Create é invocado com uma instância insegura de XmlReaderSettings ou nenhuma instância.
XmlReader é criado com configurações ou valores padrão inseguros.
Em cada um desses casos, o resultado é o mesmo: o conteúdo do sistema de arquivos ou os compartilhamentos de rede do computador em que o XML é processado será exposto ao invasor ou o processamento de DTD pode ser usado como um vetor do DoS.
Como corrigir violações
Capture e processe todas as exceções XmlTextReader corretamente para evitar a divulgação de informações de caminho.
Use o XmlSecureResolver para restringir os recursos que o XmlTextReader pode acessar.
Não permita que XmlReader abra os recursos externos. Para isso, defina a propriedade XmlResolver como nulo.
Garanta que a propriedade DataViewManager.DataViewSettingCollectionString seja atribuída de uma fonte confiável.
.NET Framework 3.5 e versões anteriores
Desabilite o processamento de DTD se você estiver lidando com fontes não confiáveis. Para isso, defina a propriedade ProhibitDtd como true.
A classe XmlTextReader tem uma demanda de herança de confiança total.
.NET Framework 4 e versões posteriores
Evite habilitar o DtdProcessing se você estiver lidando com fontes não confiáveis. Para isso, defina a propriedade XmlReaderSettings.DtdProcessing como Prohibit ou Ignore.
Verifique se o método Load() usa uma instância XmlReader em todos os casos InnerXml.
Observação
Essa regra pode relatar falsos positivos em algumas instâncias válidas do XmlSecureResolver.
Quando suprimir avisos
A menos que você tenha certeza de que se sabe que a entrada vem de uma fonte confiável, não suprima uma regra desse aviso.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Violação 1
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;
}
}
}
Solução 1
using System.IO;
using System.Xml;
using System.Xml.Schema;
class TestClass
{
public XmlSchema Test
{
get
{
var src = "";
TextReader tr = new StreamReader(src);
XmlReader reader = XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null });
XmlSchema schema = XmlSchema.Read(reader , null);
return schema;
}
}
}
Violação 2
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
}
}
}
Solução 2
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);
}
}
}
Violação 3
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
}
}
}
Solução 3
using System.Xml;
public static void TestMethod(string xml)
{
XmlDocument doc = new XmlDocument() { XmlResolver = null };
System.IO.StringReader sreader = new System.IO.StringReader(xml);
XmlReader reader = XmlReader.Create(sreader, new XmlReaderSettings() { XmlResolver = null });
doc.Load(reader);
}
Violação 4
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
}
}
}
Solução 4
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));
XmlReader reader = XmlReader.Create(stream, new XmlReaderSettings() { XmlResolver = null });
serializer.Deserialize(reader );
}
}
}
Violação 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XPathDocument doc = new XPathDocument(path); // warn
}
}
}
Solução 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XmlReader reader = XmlReader.Create(path, new XmlReaderSettings() { XmlResolver = null });
XPathDocument doc = new XPathDocument(reader);
}
}
}
Violação 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
}
}
Solução 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
}
}
Violação 7
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 {}
}
}
}
Solução 7
using System.Xml;
namespace TestNamespace
{
public class TestClass
{
public void TestMethod(string path)
{
XmlReaderSettings settings = new XmlReaderSettings() { XmlResolver = null };
XmlReader reader = XmlReader.Create(path, settings);
}
}
}
Observação
Embora XmlReader.Create seja a maneira recomendada de criar uma instância XmlReader, há diferenças de comportamento de XmlTextReader. Um XmlReader de Create normaliza \r\n
para \n
em valores XML, e XmlTextReader preserva a sequência \r\n
.