
CVE-2024-23897: Lettura arbitraria di file di Jenkins che porta a RCE
CVE-2024-23897: lettura arbitraria di file in Jenkins che porta a RCE 🎯 Prodotti e versioni interessati
Prodotto: Jenkins (server di Continuous Integration/Continuous Delivery)
Versioni: Jenkins 2.441 e precedenti, Jenkins LTS 2.426.2 e precedenti
Corretto in: Jenkins 2.442, Jenkins LTS 2.426.3
📝 Descrizione
CVE-2024-23897 è una vulnerabilità critica in Jenkins che consente ad attaccanti non autenticati di leggere file arbitrari sul filesystem del controller Jenkins. La vulnerabilità esiste perché Jenkins non disabilita una funzionalità del suo parser dei comandi CLI che sostituisce un carattere '@' seguito da un percorso di file con il contenuto del file stesso.
Questa falla può portare all'esecuzione remota di codice (RCE) se combinata con altre tecniche, rendendola particolarmente pericolosa per le organizzazioni che utilizzano Jenkins nelle loro pipeline CI/CD. 🔍 Dettagli della vulnerabilità Causa principale
La vulnerabilità deriva dalla funzione expandAtFiles() nella classe org.kohsuke.args4j.CmdLineParser. Durante l'analisi degli argomenti CLI, se il parser incontra un simbolo '@' seguito da un percorso di file, legge ed espande il contenuto di quel file. Vettore di attacco
Gli attaccanti possono sfruttare questa vulnerabilità tramite l'interfaccia CLI di Jenkins senza autenticazione: bash
java -jar jenkins-cli.jar -s http://target-jenkins-server:8080/ help @/etc/passwd
Analisi tecnica Limitazioni della lettura file
Senza autenticazione: possono essere lette solo le prime 3 righe del file (a seconda del comando CLI)
Con il permesso 'Overall/Read': può essere letto l'intero contenuto del file
File binari: possono essere estratti ma potrebbero essere influenzati da problemi di codifica (Windows-1252 su Windows produce risultati migliori rispetto a UTF-8 su Linux)
Espansione della superficie di attacco
Una volta ottenuta la lettura dei file, gli attaccanti possono passare ad attacchi più gravi:
Estrarre credenziali:
Leggere /var/jenkins_home/credentials.xml per credenziali criptate
Leggere /var/jenkins_home/secrets/master.key e hudson.util.Secret per la decrittazione
Decrittare le credenziali usando la console script di Jenkins: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
Forgiare cookie "Remember-me":
Ottenere accesso amministrativo forgiando cookie di autenticazione
Eseguire codice arbitrario:
Ottenere RCE tramite vettori Resource Root URL, XSS o CSRF
💥 Impatto Impatto immediato
Riservatezza: divulgazione completa di tutti i file sul server Jenkins (codice sorgente, credenziali, chiavi SSH, token)
Integrità: gli attaccanti possono modificare build, pipeline e configurazioni
Disponibilità: potenziale denial of service o distribuzione di ransomware
Sfruttamento nel mondo reale
Questa vulnerabilità è stata attivamente sfruttata in ambienti reali:
Aggiunta al catalogo CISA Known Exploited Vulnerabilities (KEV)
Utilizzata da gang di ransomware (RansomEXX) per compromettere infrastrutture
Sfruttata dall'attore malintenzionato IntelBroker per rubare repository GitHub e compromettere fornitori di servizi IT
🔧 Rilevamento Indicatori di compromissione
I tentativi di sfruttamento riusciti possono essere rilevati tramite:
Pattern di richieste HTTP: text
POST /cli?remoting=false HTTP/1.1 Content-type: application/octet-stream [binary payload containing @/path/to/file]
Esempi tipici di payload:
@/etc/passwd
@/var/jenkins_home/secrets/initialAdminPassword
@/etc/os-release
Query di rilevamento Splunk text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ Mitigazione Fix ufficiale
Aggiornare alle versioni corrette:
Jenkins ≥ 2.442
Jenkins LTS ≥ 2.426.3
Mitigazione temporanea
Se non è possibile applicare subito la patch:
Disabilitare l'accesso CLI di Jenkins
Impostare la proprietà di sistema Java: hudson.cli.CLICommand.allowAtSyntax=false
Limitare l'accesso di rete all'interfaccia di amministrazione di Jenkins
Implementare regole WAF per bloccare le richieste contenenti pattern @/
🔗 Riferimenti
Voce NVD
Jenkins Security Advisory
Catalogo CISA KEV
Ricerca Splunk
Pagina CVE di Tenable
📦 Compilazione ed esecuzione
bash
go build -o jenkins-cve-2024-23897 exploit.go
./jenkins-cve-2024-23897 http://target-jenkins:8080 /etc/passwd
go run exploit.go http://target-jenkins:8080 /etc/passwd
🎯 Esempi di utilizzo bash
./jenkins-cve-2024-23897 http://jenkins.internal:8080 /etc/passwd ./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ Come funziona
Inizializzazione della sessione: genera un ID di sessione univoco di 20 byte
Costruzione del payload: crea un payload binario con la struttura help @/path/to/file
Fase di upload: invia il payload all'endpoint CLI di Jenkins
Fase di download: recupera il contenuto del file dalla risposta
Output: mostra il contenuto del file o il messaggio di errore
📊 Caratteristiche
Implementazione in Go puro - Nessuna dipendenza esterna
Multipiattaforma - Funziona su Windows, Linux, macOS
Timeout configurabili - Regolabili per reti lente
Gestione degli errori pulita - Messaggi di errore dettagliati
Binary-safe - Gestisce sia file di testo che binari
⚠️ Note importanti
Solo a scopo educativo - Utilizzare esclusivamente su sistemi di tua proprietà o per cui hai il permesso di test
Letture non autenticate - Senza autenticazione, sono leggibili solo le prime ~3 righe
File binari - Potrebbero essere influenzati da problemi di codifica (usa un target Windows per una migliore estrazione dei binari)