CVE-2025-9074 (PoC educativo · codice di prova di concetto)
Questo repository contiene un PoC educativo che dimostra il rischio di sfruttare l'API remota non autenticata di Docker Engine per creare un contenitore privilegiato in grado di leggere e scrivere sul filesystem host. Il file eseguibile è poc.go.
Importante: utilizzare questo PoC solo per scopi educativi e difensivi. È vietato eseguirlo in ambienti di terze parti o su sistemi non autorizzati.
Valutazione del rischio
- Valutazione complessiva: Critico
- Punteggio base CVSS v3.1 stimato: 9.8 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
- Motivazione:
- Raggiungibile su TCP/2375 senza autenticazione → PR:N, UI:N, AV:N
- Contenitore privilegiato + bind mount host modifica lo scope e impatta severamente riservatezza/integrità/disponibilità → S:C, C/I/A:H
- La procedura d'attacco richiede poche richieste HTTP all'API di Docker Engine → AC:L
- Impatto:
- Intero sistema operativo host, altri contenitori, risorse sulla stessa rete (incluso furto di credenziali e movimento laterale)
- Privilegi richiesti:
- Nessuna autenticazione (PR:N). Non sono necessari privilegi di amministratore
Contesto
- Docker Engine fornisce un'API remota che può essere manipolata tramite endpoint come
/version, /info, /containers/create.
- Se il contenitore è raggiungibile dall'esterno, è possibile creare contenitori, concedere privilegi e montare directory host con bind mount senza autenticazione.
- Negli ambienti Windows + Docker Desktop, esistono percorsi di mount come
/run/desktop/mnt/host/<drive> e /host_mnt/<drive> che consentono l'accesso ai drive host Windows. Questo PoC sfrutta tali percorsi per visualizzare l'impatto creando file sull'host.
Riepilogo del funzionamento
poc.go esegue le seguenti operazioni:
- Chiama l'API di Docker Engine su
http://192.168.65.7:2375 e verifica la connettività (endpoint /version)
- Controlla l'elenco delle immagini disponibili (
/images/json) e, se vuoto, tenta di scaricare alpine:latest
- Crea un contenitore privilegiato e monta i drive host (es. C:, N:) su
/host_root con bind mount
- Dall'interno del contenitore, scrive un file di verifica (es.
cve_2025_9074_poc.txt) direttamente sotto /host_root per visualizzare l'impatto
- Dopo l'esecuzione, elimina il contenitore
Rischi (potenziali abusi)
- Lettura/scrittura del filesystem host (nei limiti dei permessi di esecuzione di Docker Engine)
- Furto di informazioni sensibili (password, chiavi SSH, ecc.)
- Manomissione di file di configurazione di sistema
- Installazione di malware e persistenza
- Movimento laterale verso altri contenitori/reti
- Elevazione dei privilegi
Requisiti
- Go 1.20+ circa (funziona con
go run)
- Docker Desktop/Engine in esecuzione (con vulnerabilità)
- Eseguire questo codice all'interno di un contenitore Docker in esecuzione su Docker Desktop/Engine (vulnerabile)
- L'API di Docker Engine deve rispondere su
http://192.168.65.7:2375 (valore predefinito del PoC)
Utilizzo
-
Clonare il repository
git clone <this-repo>
cd cve-2025-9074
-
Eseguire il PoC
-
Esempio di output
- Visualizzazione della corretta connettività a
/version
- Rilevamento di un'immagine esistente o download di
alpine:latest
- Creazione del contenitore privilegiato, risultato della creazione del file sull'host
- Visualizzazione di estratti delle informazioni di sistema basate su
/info
-
Esempio di comando curl per dimostrazione (verrà stampato sullo schermo)
- Esempio JSON per
/containers/create, esempio di avvio di /containers/{id}/start
Personalizzazione della configurazione
- È possibile modificare l'array di percorsi candidati in
attemptHostWrite (/run/desktop/mnt/host/<drive>, /host_mnt/<drive>, C:/, ecc.) in base all'ambiente.
- Immagine utilizzata
- Priorità a immagini esistenti. In caso contrario, download automatico di
alpine:latest.
Note sull'ambiente di test
- Include esempi di percorsi di mount pensati per il comportamento su Windows + Docker Desktop.
- Su macOS, i percorsi host sono diversi, quindi è necessario modificarli di conseguenza.
- A seconda della versione e della configurazione di Docker Desktop, il PoC potrebbe non funzionare (= sicuro).
Disclaimer
- Questo repository è inteso esclusivamente per scopi di ricerca e didattici. Non promuove attività di attacco, intrusione o danneggiamento.
- L'autore non si assume alcuna responsabilità per eventuali danni derivanti dall'uso di questo PoC.
- Non eseguire al di fuori di un ambiente isolato di cui si ha la legittima autorità di amministrazione.
Licenza