
Praxisnahe Fallstudie zum Schwachstellenmanagement: Wie Wazuh eine echte SSRF (CVE-2025-68616) in WeasyPrint erkannte und wie ich sie reproduzierte und behob.
Während einer persönlichen Übung mit Wazuh (Open-Source-SIEM/XDR) auf einer Kali-Linux-Maschine identifizierte das Modul Vulnerability Detection eine Schwachstelle mit dem Schweregrad Hoch (CVSS 7.5) im Paket WeasyPrint: eine Umgehung des SSRF-Schutzes (CVE-2025-68616). Ich untersuchte den Befund, reproduzierte das Problem mit einem lokalen Proof of Concept, wendete die gepatchte Version des Projekts an und verifizierte, dass die Ausnutzung nicht mehr funktioniert. Dieses Repository dokumentiert den gesamten Prozess: Erkennung, Analyse, PoC und Behebung.
Wazuh ist eine Open-Source-Sicherheitsplattform (SIEM + XDR), die unter anderem Protokollsammmlung, Dateiintegritätsüberwachung (FIM), Anomalieerkennung und Schwachstellenerkennung für auf überwachten Hosts installierte Software kombiniert und dabei den Paketbestand mit CVE-Datenbanken (unter anderem NVD) abgleicht.
In dieser Übung lief der Wazuh-Agent auf einer Maschine mit Kali GNU/Linux 2025.4, wobei Manager, Indexer und Dashboard ebenfalls lokal liefen. Bevor der Befund auftrat, funktionierte das aktive Monitoring in der Umgebung bereits korrekt: PAM-Anmeldesitzungen, sudo-Ausführungen, Änderungen an lauschenden Ports und rootcheck-Anomalieereignisse, alle im Modul sichtbar.
Das Modul Vulnerability Detection in Wazuh meldete 1 Schwachstelle mit dem Schweregrad Hoch auf dem Agenten Kali, die mit dem Paket weasyprint verbunden ist.
WeasyPrint ist eine Python-Bibliothek, die HTML/CSS in PDF-Dokumente umwandelt und häufig zur Erzeugung von Berichten, Rechnungen und dynamischen Dokumenten aus Webanwendungen verwendet wird.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Ncpe:2.3:a:kozea:weasyprint:*:*:*:*:*:*:*:*, bis ausschließlich 68.0)Beschreibung: Vor Version 68.0 existiert in WeasyPrints default_url_fetcher eine Umgehung des SSRF-Schutzes. Die Schwachstelle erlaubt es einem Angreifer, auf interne Netzwerkressourcen (wie localhost-Dienste oder Cloud-Metadaten-Endpunkte) zuzugreifen, selbst wenn der Entwickler einen benutzerdefinierten url_fetcher implementiert hat, um solche Zugriffe zu blockieren. Dies geschieht, weil die zugrunde liegende Bibliothek urllib HTTP-Weiterleitungen automatisch verfolgt, ohne das neue Ziel erneut gegen die Sicherheitsrichtlinie des Entwicklers zu prüfen. Version 68.0 enthält einen Patch für dieses Problem.
Referenzen:
Um die reale Auswirkung vor dem Patchen zu bestätigen, richtete ich ein lokales Ausnutzungsszenario gegen die auf dem System installierte verwundbare Version ein.
1. Das Repository mit angewendetem Patch geklont (Hauptzweig, der bereits den Fix aus Version 68.0 enthält):
git clone https://github.com/Kozea/WeasyPrint.git
2. Den gepatchten Code überprüft, insbesondere weasyprint/urls.py, wo sich die default_url_fetcher-Logik und die Behandlung von Weiterleitungen befinden:
3. Eine schädliche HTML-Datei erstellt, die versucht, eine lokale Systemdatei über ein iframe zu exfiltrieren und damit den in der CVE beschriebenen SSRF-/Vektor des unbefugten Ressourcenzugriffs zu simulieren (Hinweis: Dateinamen und Dateiinhalte unten sind genau so ausgeführt, wie sie im Terminal in den Screenshots erscheinen):
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. Ergebnis: Beim Öffnen des erzeugten PDFs erscheint das iframe, das auf file:///etc/passwd zeigt, leer, ohne Inhalt aus der Systemdatei. Dies bestätigt, dass in der gepatchten Version der Versuch, auf eine unbefugte Ressource zuzugreifen, korrekt blockiert wird.
git clone des offiziellen Repositorys bezogen (Zweig, der den Patch-Commit b6a14f0... enthält).file:///etc/passwd über das iframe nicht mehr erlaubt.url_fetcher-Umgehung) zu verstehen, bevor der Versuch unternommen wurde, ihn zu reproduzieren.Die Übung wurde in einer persönlichen, isolierten Umgebung (Kali Linux + Wazuh, lokal ausgeführt) zu Bildungszwecken durchgeführt. Es wurde auf keine Drittsysteme zugegriffen.