FlawOpen

flawopen.com/XXE/Segurança do parser XML Java

XXE em Java: DocumentBuilderFactory é segura por padrão?

CWE-611: Improper Restriction of XML External Entity ReferenceGuia de referência Java XML
Resposta curta — o acesso externo não é bloqueado por padrão

O JDK habilita alguns limites de processamento seguro por padrão, mas a configuração DOM e SAX padrão não bloqueia o acesso a recursos externos. Um XML pode, portanto, provocar acesso a arquivos ou à rede se o aplicativo não o restringir explicitamente. O comportamento também pode mudar quando um provedor JAXP de terceiros substitui o parser integrado. Configure o parser realmente usado; não deduza segurança apenas pela versão do Java.

INSEGURO
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+: habilite explicitamente as restrições JAXP.
// Se uma configuração necessária não for suportada, falhe.
// O parser pode permitir acesso externo por padrão.
REFORÇADO
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// Nunca teste usando arquivos ou serviços reais.
factory.setFeature(
    XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setFeature(
    "http://apache.org/xml/features/"
    + "disallow-doctype-decl", true);
factory.setAttribute(
    XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setXIncludeAware(false);

// Os limites de tamanho são aplicados separadamente.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Por que rejeitar DOCTYPE é o controle DOM preferido

Quando suportado, rejeitar DOCTYPE impede o processamento de entidades externas definidas em DTDs e declarações de entidade. Ative FEATURE_SECURE_PROCESSING explicitamente e restrinja o acesso a DTD externo em defesa em profundidade; o FSP habilitado por padrão no JDK não significa que conexões externas sejam negadas. Mantenha XInclude desabilitado, salvo necessidade. Se o provedor não aceitar uma configuração exigida, falhe ao inicializar o parser em vez de continuar com proteção parcial.

Se o aplicativo precisa aceitar DTDs, não habilite acesso externo. Desative entidades externas gerais e de parâmetro, carregamento de DTD externo e XInclude; defina ACCESS_EXTERNAL_DTD como string vazia e mantenha limites de processamento. setExpandEntityReferences(false) altera a representação na árvore; não substitui o bloqueio de recursos externos.

Proteja cada processador JAXP separadamente

A política também vale para o processamento XML, mas os controles variam por API. Revise SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator e JAXB. StAX não aceita FEATURE_SECURE_PROCESSING; desative DTDs e entidades externas com propriedades próprias. Restrinja também esquemas e folhas de estilo externos. Use exemplos específicos da OWASP e confirme qual provedor está ativo.

Não trate as configurações de um parser como proteção global da JVM. O provedor selecionado pela busca JAXP pode diferir do JDK integrado, e processadores compostos podem criar parsers internos. Teste o runtime, o provedor e o caminho de código usados em produção.

Perguntas frequentes

FEATURE_SECURE_PROCESSING bloqueia entidades externas por padrão?

Não quando está apenas habilitado por padrão. A Oracle documenta que o FSP padrão aplica limites de processamento, mas conexões externas continuam permitidas até que o FSP seja ativado explicitamente pela API ou que propriedades de acesso externo sejam configuradas. Defina a política explicitamente e verifique o provedor.

JDKs mais novos mudaram os padrões?

As versões do JDK adicionaram restrições e limites, mas o guia JAXP da Oracle ainda distingue FSP ativado por padrão da negação explícita de acesso externo. Provedores de terceiros também variam. Configure os controles exigidos em vez de depender da versão ou do classpath.

E se documentos válidos exigirem DTD?

Prefira um catálogo ou resolver local confiável. Se DTD for necessário, bloqueie protocolos externos e carregamento de entidades, mantenha os limites JAXP e desative XInclude salvo necessidade. Essa política é mais complexa que rejeitar DOCTYPE; teste-a com o provedor e os documentos legítimos.

Fontes e referências

Veja também Injeção de entidade externa XML (XXE, CWE-611): como funciona e como evitar — flawopen.com Segurança XML XXE em Python: ElementTree, Expat e lxml XmlReader do .NET é seguro contra XXE?