
Estudio de caso práctico de gestión de vulnerabilidades: cómo Wazuh señaló un SSRF real (CVE-2025-68616) en WeasyPrint, y cómo lo reproduje y parcheé.
Durante un ejercicio de práctica personal con Wazuh (SIEM/XDR de código abierto) en una máquina Kali Linux, el módulo Vulnerability Detection identificó una vulnerabilidad de severidad Alta (CVSS 7.5) en el paquete WeasyPrint: una omisión de la protección SSRF (CVE-2025-68616). Investigué el hallazgo, reproduje el problema con una prueba de concepto local, apliqué la versión parcheada del proyecto y verifiqué que la explotación ya no funciona. Este repositorio documenta el proceso completo: detección, análisis, PoC y remediación.
Wazuh es una plataforma de seguridad de código abierto (SIEM + XDR) que combina, entre otras cosas, la recopilación de registros, el monitoreo de integridad de archivos (FIM), la detección de anomalías y la detección de vulnerabilidades para el software instalado en los hosts monitoreados, cruzando el inventario de paquetes con bases de datos de CVE (NVD, entre otras).
En este ejercicio, el agente de Wazuh se ejecutó en una máquina Kali GNU/Linux 2025.4, con el manager, el indexer y el dashboard también ejecutándose localmente. Antes de llegar al hallazgo, el entorno ya contaba con monitoreo activo funcionando correctamente: sesiones de inicio de sesión PAM, ejecuciones de sudo, cambios en puertos en escucha y eventos de anomalías de rootcheck, todo visible en el módulo Threat Hunting.
El módulo Vulnerability Detection de Wazuh reportó 1 vulnerabilidad de severidad Alta en el agente Kali, asociada con el paquete weasyprint.
WeasyPrint es una biblioteca de Python que convierte HTML/CSS en documentos PDF, ampliamente utilizada para generar informes, facturas y documentos dinámicos desde aplicaciones 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:*:*:*:*:*:*:*:*, hasta excluir la 68.0)Descripción: antes de la versión 68.0, existe una omisión de la protección SSRF en el default_url_fetcher de WeasyPrint. La vulnerabilidad permite a un atacante acceder a recursos de red internos (como servicios de localhost o puntos finales de metadatos de la nube) incluso cuando el desarrollador implementó un url_fetcher personalizado para bloquear dicho acceso. Esto ocurre porque la biblioteca subyacente urllib sigue automáticamente las redirecciones HTTP sin volver a validar el nuevo destino contra la política de seguridad del desarrollador. La versión 68.0 contiene un parche para el problema.
Referencias:
Para confirmar el impacto real antes de parchear, preparé un escenario de explotación local contra la versión vulnerable instalada en el sistema.
1. Cloné el repositorio con el parche aplicado (rama principal, que ya incluye la corrección de la versión 68.0):
git clone https://github.com/Kozea/WeasyPrint.git
2. Revisé el código corregido, específicamente weasyprint/urls.py, donde se encuentran la lógica de default_url_fetcher y el manejo de redirecciones:
3. Creé un archivo HTML malicioso que intenta exfiltrar un archivo local del sistema mediante un iframe, simulando el vector SSRF / acceso no autorizado a recursos descrito en la CVE (nota: los nombres de archivo y los contenidos de archivo a continuación se mantienen exactamente como se ejecutaron, coincidiendo con la salida del terminal en las capturas de pantalla):
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: al abrir el PDF generado, el iframe que apunta a file:///etc/passwd aparece vacío, sin contenido del archivo del sistema. Esto confirma que, en la versión parcheada, el intento de acceder a un recurso no autorizado se bloquea correctamente.
git clone del repositorio oficial (rama que incluye el commit del parche b6a14f0...).file:///etc/passwd a través del iframe.url_fetcher) antes de intentar reproducirlo.Práctica realizada en un entorno personal y aislado (Kali Linux + Wazuh ejecutándose localmente) con fines educativos. No se accedió a sistemas de terceros.