
Estudo de caso prático de gerenciamento de vulnerabilidades: como o Wazuh sinalizou um SSRF real (CVE-2025-68616) no WeasyPrint, e como eu reproduzi e corrigi.
Durante um exercício prático pessoal com Wazuh (SIEM/XDR open source) em uma máquina Kali Linux, o módulo Detecção de Vulnerabilidades identificou uma vulnerabilidade de severidade Alta (CVSS 7.5) no pacote WeasyPrint: uma bypass de proteção SSRF (CVE-2025-68616). Investiguei a descoberta, reproduzi o problema com uma prova de conceito local, apliquei a versão corrigida do projeto e verifiquei que a exploração não funciona mais. Este repositório documenta todo o processo: detecção, análise, PoC e remediação.
Wazuh é uma plataforma de segurança open source (SIEM + XDR) que combina, entre outras coisas, coleta de logs, monitoramento de integridade de arquivos (FIM), detecção de anomalias e detecção de vulnerabilidades para softwares instalados em hosts monitorados, cruzando o inventário de pacotes com bancos de dados de CVE (NVD, entre outros).
Neste exercício, o agente Wazuh foi executado em uma máquina Kali GNU/Linux 2025.4, com o manager, indexer e dashboard também rodando localmente. Antes de chegar à descoberta, o ambiente já possuía monitoramento ativo funcionando corretamente: sessões de login PAM, execuções de sudo, alterações em portas de escuta e eventos de anomalia do rootcheck, todos visíveis no módulo Threat Hunting.
O módulo Detecção de Vulnerabilidades do Wazuh reportou 1 vulnerabilidade de severidade Alta no agente Kali, associada ao pacote weasyprint.
WeasyPrint é uma biblioteca Python que converte HTML/CSS em documentos PDF, amplamente utilizada para gerar relatórios, faturas e documentos dinâmicos a partir de aplicações web.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Ncpe:2.3:a:kozea:weasyprint:*:*:*:*:*:*:*:*, até excluindo 68.0)Descrição: antes da versão 68.0, existe uma bypass de proteção SSRF no default_url_fetcher do WeasyPrint. A vulnerabilidade permite que um atacante acesse recursos de rede internos (como serviços localhost ou endpoints de metadados em nuvem) mesmo quando o desenvolvedor implementou um url_fetcher personalizado para bloquear tal acesso. Isso ocorre porque a biblioteca subjacente urllib segue automaticamente redirecionamentos HTTP sem revalidar o novo destino contra a política de segurança do desenvolvedor. A versão 68.0 contém um patch para o problema.
Referências:
Para confirmar o impacto real antes da correção, montei um cenário de exploração local contra a versão vulnerável instalada no sistema.
1. Clonei o repositório com o patch aplicado (branch main, que já inclui a correção da versão 68.0):
git clone https://github.com/Kozea/WeasyPrint.git
2. Revisei o código corrigido, especificamente em weasyprint/urls.py, onde residem a lógica do default_url_fetcher e o tratamento de redirecionamentos:
3. Construí um arquivo HTML malicioso que tenta exfiltrar um arquivo local do sistema através de um iframe, simulando o vetor SSRF / acesso não autorizado a recursos descrito no CVE (nota: os nomes de arquivos e conteúdos abaixo são mantidos exatamente como executados, correspondendo à saída do terminal nas capturas de tela):
cat << 'EOF' > ataque.html
<!DOCTYPE html>
<html>
<head>
<title>PoC SSRF - WeasyPrint</title>
</head>
<body>
<h1>Prueba de Exfiltración de Archivos Locales</h1>
<p>Si el parche no está aplicado, el contenido de abajo debería mostrar el archivo /etc/passwd:</p>
</body>
</html>
EOF
python3 -m weasyprint ataque.html resultado_vulnerable.pdf
xdg-open resultado_vulnerable.pdf
4. Resultado: ao abrir o PDF gerado, o iframe apontando para file:///etc/passwd aparece vazio, sem nenhum conteúdo do arquivo do sistema. Isso confirma que, na versão corrigida, a tentativa de acessar um recurso não autorizado é corretamente bloqueada.
git clone do repositório oficial (branch incluindo o commit do patch b6a14f0...).file:///etc/passwd via iframe.url_fetcher) antes de tentar reproduzi-lo.Prática realizada em ambiente pessoal e isolado (Kali Linux + Wazuh rodando localmente) para fins educacionais. Nenhum sistema de terceiros foi acessado.