
Caso di studio pratico di gestione delle vulnerabilità: come Wazuh ha segnalato una vera SSRF (CVE-2025-68616) in WeasyPrint e come l'ho riprodotta e corretta.
Durante un esercizio personale di pratica con Wazuh (SIEM/XDR open source) su una macchina Kali Linux, il modulo Vulnerability Detection ha identificato una vulnerabilità di gravità High (CVSS 7.5) nel pacchetto WeasyPrint: un bypass della protezione SSRF (CVE-2025-68616). Ho analizzato il riscontro, riprodotto il problema con una proof of concept locale, applicato la versione patchata del progetto e verificato che lo sfruttamento non funziona più. Questo repository documenta l'intero processo: rilevazione, analisi, PoC e remediation.
Wazuh è una piattaforma di sicurezza open source (SIEM + XDR) che combina, tra le altre cose, raccolta dei log, monitoraggio dell'integrità dei file (FIM), rilevamento di anomalie e vulnerability detection per il software installato sugli host monitorati, incrociando l'inventario dei pacchetti con i database CVE (NVD, tra gli altri).
In questo esercizio, l'agente Wazuh era in esecuzione su una macchina Kali GNU/Linux 2025.4, con manager, indexer e dashboard anch'essi in esecuzione localmente. Prima di arrivare al riscontro, l'ambiente disponeva già di un monitoraggio attivo funzionante correttamente: sessioni di login PAM, esecuzioni di sudo, modifiche alle porte in ascolto ed eventi anomali di rootcheck, tutti visibili nel modulo Threat Hunting.
Il modulo Vulnerability Detection di Wazuh ha segnalato 1 vulnerabilità di gravità High sull'agente Kali, associata al pacchetto weasyprint.
WeasyPrint è una libreria Python che converte HTML/CSS in documenti PDF, ampiamente utilizzata per generare report, fatture e documenti dinamici da applicazioni 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:*:*:*:*:*:*:*:*, fino alla 68.0 esclusa)Descrizione: prima della versione 68.0, esiste un bypass della protezione SSRF in default_url_fetcher di WeasyPrint. La vulnerabilità consente a un attaccante di accedere a risorse di rete interne (come servizi su localhost o endpoint di metadata cloud) anche quando lo sviluppatore ha implementato un url_fetcher personalizzato per bloccare tale accesso. Ciò accade perché la libreria sottostante urllib segue automaticamente i redirect HTTP senza rivalidare la nuova destinazione rispetto alla policy di sicurezza dello sviluppatore. La versione 68.0 contiene una patch per il problema.
Riferimenti:
Per confermare l'impatto reale prima della patch, ho impostato uno scenario di sfruttamento locale contro la versione vulnerabile installata sul sistema.
1. Clonato il repository con la patch applicata (branch main, che include già la correzione dalla versione 68.0):
git clone https://github.com/Kozea/WeasyPrint.git
2. Esaminato il codice corretto, in particolare weasyprint/urls.py, dove risiedono la logica di default_url_fetcher e la gestione dei redirect:
3. Creato un file HTML dannoso che tenta di esfiltrare un file locale di sistema tramite un iframe, simulando il vettore SSRF / accesso non autorizzato alle risorse descritto nella CVE (nota: i nomi dei file e i contenuti dei file qui sotto sono mantenuti esattamente come eseguiti, in corrispondenza dell'output del terminale negli screenshot):
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. Risultato: all'apertura del PDF generato, l'iframe che punta a file:///etc/passwd appare vuoto, senza alcun contenuto del file di sistema. Ciò conferma che, sulla versione patchata, il tentativo di accedere a una risorsa non autorizzata viene correttamente bloccato.
git clone del repository ufficiale (branch includente il commit di patch b6a14f0...).file:///etc/passwd via iframe.url_fetcher) prima di tentarne la riproduzione.Esercizio condotto in un ambiente personale e isolato (Kali Linux + Wazuh in esecuzione locale) a scopo didattico. Non è stato effettuato alcun accesso a sistemi di terze parti.