flawopen.com/XXE/Leitores XML do .NET
O XmlReader é seguro contra XXE no .NET?
Pense no DTD como uma autorização para o parser buscar arquivos indicados no XML. XmlReader.Create rejeita DTDs por padrão, então um documento não confiável não pode usar esse caminho a menos que a aplicação o habilite. APIs legadas e a versão-alvo ainda importam: proíba DTDs explicitamente e desative a resolução externa na fronteira de análise.
// Leitor legado direto: a análise de DTD pode ser habilitada // e um resolver externo pode buscar recursos referenciados. var legacy = new XmlTextReader(stream) { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; while (legacy.Read()) { } // Habilitar DTDs explicitamente para XML não confiável é arriscado: var unsafeSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; using var reader = XmlReader.Create(stream, unsafeSettings);
var settings = new XmlReaderSettings {
// Rejeite qualquer documento que contenha um DTD.
DtdProcessing = DtdProcessing.Prohibit,
// Defesa em profundidade: não busque recursos externos.
XmlResolver = null,
// Escolha limites adequados à entrada legítima do aplicativo.
MaxCharactersInDocument = 1_000_000,
MaxCharactersFromEntities = 1_024,
};
using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);
Qual API XML e versão do .NET você usa?
.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:
- ✓XmlReader.Create com configurações padrão — DtdProcessing.Prohibit é o padrão. Defina-o explicitamente na entrada de dados não confiáveis para que uma alteração futura não habilite DTDs sem querer.
- ✓XmlReaderSettings.XmlResolver — o .NET Framework 4.5.2 alterou o padrão para null; versões anteriores podiam usar XmlUrlResolver. Defina null explicitamente e verifique a opção de compatibilidade EnableLegacyXmlSettings.
- ✓XmlTextReader — o uso direto dessa API legada tem outros padrões e pode analisar DTDs. Prefira XmlReader.Create com configurações explícitas; nunca associe um resolver de rede ou arquivo a XML não confiável.
- ✓XmlDocument e LINQ to XML — o comportamento depende de como o documento é carregado e da versão-alvo. Passe um XmlReader protegido e defina qualquer resolver disponível como null.
A alteração do .NET Framework 4.5.2 definiu XmlReaderSettings.XmlResolver como null e inicializou MaxCharactersFromEntities em 10 milhões; ela não tornou todas as APIs XML nem todas as configurações equivalentes. Uma opção de compatibilidade pode restaurar os padrões antigos. Defina a política do parser explicitamente, limite o tamanho do documento e verifique a versão e a configuração reais de execução.
Perguntas frequentes
Sim. XmlReaderSettings.DtdProcessing tem o padrão Prohibit, que lança uma exceção quando encontra um DTD. Mesmo assim, defina-o explicitamente e use XmlResolver = null como defesa em profundidade.
Por segurança, XmlReaderSettings.XmlResolver passou a ter o padrão null, e MaxCharactersFromEntities é inicializado em 10 milhões. A opção EnableLegacyXmlSettings pode restaurar o comportamento anterior; verifique a configuração implantada, não apenas a versão-alvo.
Pode afetar. Esses formatos contêm XML, mas o resultado depende do parser e das configurações específicas. Faça cada ponto de entrada XML não confiável usar um leitor protegido, limite o tamanho da entrada e siga também as recomendações de segurança da biblioteca do formato.
Fontes e referências
- Microsoft Learn — XmlReaderSettings e segurança
- Microsoft Learn — mudanças de análise XML no .NET Framework 4.5.2
- Microsoft Learn — XmlReader.Create e resolução
- Microsoft Learn — XmlTextReader.XmlResolver
- OWASP — prevenção de XXE
- CWE-611 — referência a entidade externa XML
- Padrões de XXE no DocumentBuilderFactory do Java