poc-CVE-2024-23897
CVE-2024-23897: Beliebiger Dateizugriff in Jenkins führt zu RCE
🎯 Betroffene Produkte und Versionen
- Produkt: Jenkins (Continuous Integration/Continuous Delivery Server)
- Versionen: Jenkins 2.441 und früher, Jenkins LTS 2.426.2 und früher
- Behoben in: Jenkins 2.442, Jenkins LTS 2.426.3
📝 Beschreibung
CVE-2024-23897 ist eine kritische Sicherheitslücke in Jenkins, die es nicht authentifizierten Angreifern ermöglicht, beliebige Dateien auf dem Dateisystem des Jenkins-Controllers zu lesen. Die Sicherheitslücke besteht, weil Jenkins eine Funktion seines CLI-Befehlsinterpreters nicht deaktiviert, die ein '@'-Zeichen gefolgt von einem Dateipfad durch den Inhalt der Datei ersetzt.
Dieser Fehler kann in Kombination mit anderen Techniken zu Remote Code Execution (RCE) führen, was ihn besonders gefährlich für Organisationen macht, die Jenkins in ihren CI/CD-Pipelines einsetzen.
🔍 Details zur Sicherheitslücke
Grundursache
Die Sicherheitslücke geht auf die expandAtFiles()-Funktion in der Klasse org.kohsuke.args4j.CmdLineParser zurück. Wenn der Parser CLI-Argumente analysiert und auf ein '@'-Symbol gefolgt von einem Dateipfad trifft, liest und erweitert er den Inhalt dieser Datei.
Angriffsvektor
Angreifer können diese Sicherheitslücke über die Jenkins-CLI-Schnittstelle ohne Authentifizierung ausnutzen:
bash
java -jar jenkins-cli.jar -s http://target-jenkins-server:8080/ help @/etc/passwd
Technische Analyse
Einschränkungen beim Dateilesen
- Ohne Authentifizierung: Nur die ersten 3 Zeilen der Datei können gelesen werden (abhängig vom CLI-Befehl)
- Mit 'Overall/Read'-Berechtigung: Der vollständige Dateiinhalt kann gelesen werden
- Binärdateien: Können extrahiert werden, aber möglicherweise von Kodierungsproblemen betroffen (Windows-1252 unter Windows liefert bessere Ergebnisse als UTF-8 unter Linux)
Erweiterung der Angriffsfläche
- Anmeldeinformationen extrahieren:
- /var/jenkins_home/credentials.xml für verschlüsselte Anmeldeinformationen lesen
- /var/jenkins_home/secrets/master.key und hudson.util.Secret zur Entschlüsselung lesen
- Anmeldeinformationen mit der Jenkins-Script-Konsole entschlüsseln: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
- „Remember-me“-Cookies fälschen:
- Administrativen Zugriff durch Fälschen von Authentifizierungs-Cookies erlangen
- Beliebigen Code ausführen:
- RCE über Resource Root URL, XSS oder CSRF-Vektoren erreichen
💥 Auswirkungen
Sofortige Auswirkungen
- Vertraulichkeit: Vollständige Offenlegung aller Dateien auf dem Jenkins-Server (Quellcode, Anmeldeinformationen, SSH-Schlüssel, Token)
- Integrität: Angreifer können Builds, Pipelines und Konfigurationen ändern
- Verfügbarkeit: Potenzial für Denial-of-Service oder Ransomware-Einsatz
Ausnutzung in der realen Welt
- Hinzugefügt zum Katalog der von CISA bekannten ausgenutzten Sicherheitslücken (KEV)
- Von Ransomware-Banden (RansomEXX) genutzt, um Infrastrukturen zu kompromittieren
- Vom Bedrohungsakteur IntelBroker ausgenutzt, um GitHub-Repositories zu stehlen und IT-Dienstleister zu kompromittieren
🔧 Erkennung
Indikatoren für eine Kompromittierung
Erfolgreiche Ausnutzungsversuche können erkannt werden durch:
HTTP-Anfragemuster:
text
POST /cli?remoting=false HTTP/1.1
Content-type: application/octet-stream
[binary payload containing @/path/to/file]
Typische Payload-Beispiele:
- @/etc/passwd
- @/var/jenkins_home/secrets/initialAdminPassword
- @/etc/os-release
Splunk-Erkennungsabfrage
text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ Abschwächung
Offizieller Fix
Auf gepatchte Versionen aktualisieren:
- Jenkins ≥ 2.442
- Jenkins LTS ≥ 2.426.3
Vorübergehende Abschwächung
Wenn ein sofortiges Patchen nicht möglich ist:
- Jenkins-CLI-Zugriff deaktivieren
- Java-Systemeigenschaft setzen: hudson.cli.CLICommand.allowAtSyntax=false
- Netzwerkzugriff auf die Jenkins-Admin-Oberfläche einschränken
- WAF-Regeln implementieren, um Anfragen mit @/ Mustern zu blockieren
🔗 Referenzen
- NVD-Eintrag
- Jenkins-Sicherheitshinweis
- CISA-KEV-Katalog
- Splunk-Forschung
- Tenable CVE-Seite
📦 Erstellen und Ausführen
bash
Build the exploit
go build -o jenkins-cve-2024-23897 exploit.go
Run the exploit
./jenkins-cve-2024-23897 http://target-jenkins:8080 /etc/passwd
Run with Go directly
go run exploit.go http://target-jenkins:8080 /etc/passwd
🎯 Anwendungsbeispiele
bash
Read sensitive files
./jenkins-cve-2024-23897 http://jenkins.internal:8080 /etc/passwd
./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
Read Windows file (if Jenkins runs on Windows)
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ Funktionsweise
- Sitzungsinitialisierung: Erzeugt eine eindeutige 20-Byte-Sitzungs-ID
- Payload-Erstellung: Erstellt binären Payload mit help @/path/to/file-Struktur
- Upload-Phase: Sendet Payload an den Jenkins-CLI-Endpunkt
- Download-Phase: Ruft Dateiinhalt aus der Antwort ab
- Ausgabe: Zeigt den Dateiinhalt oder eine Fehlermeldung an
📊 Funktionen
- Reine Go-Implementierung – Keine externen Abhängigkeiten
- Plattformübergreifend – Funktioniert unter Windows, Linux, macOS
- Konfigurierbare Timeouts – Anpassbar für langsame Netzwerke
- Saubere Fehlerbehandlung – Detaillierte Fehlermeldungen
- Binärdatei-sicher – Verarbeitet sowohl Text- als auch Binärdateien
⚠️ Wichtige Hinweise
- Nur zu Bildungszwecken – Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie eine Testberechtigung haben
- Nicht authentifizierte Lesevorgänge – Ohne Authentifizierung sind nur die ersten ~3 Zeilen lesbar
- Binärdateien – Können von Kodierungsproblemen betroffen sein (für eine bessere Binärextraktion Windows-Ziel verwenden)