FlawOpen

flawopen.com/XXE/Leitores XML do .NET

O XmlReader é seguro contra XXE no .NET?

CWE-611: XML External Entity ReferenceResposta curta
Resposta curta

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.

INSEGURO — padrões legados ou enfraquecidos
// 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);
PROTEGIDO — rejeite DTDs e recursos externos
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:

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

XmlReader.Create proíbe DTDs por padrão?

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.

O que mudou no .NET Framework 4.5.2?

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.

Isso afeta SOAP, SAML ou documentos do Office?

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

Veja também Injeção de entidade externa XML (XXE, CWE-611): como funciona e como evitar — flawopen.com XXE em Java: DocumentBuilderFactory é segura por padrão? Segurança XML XXE em Python: ElementTree, Expat e lxml