
Rilevatore runtime basato su eBPF per le vulnerabilità di fuga dai container in runc e Docker, che monitora le syscall e le chiamate al daemon Docker per rilevare lo sfruttamento di CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 e CVE-2024-23653 durante le build e il runtime.
Questo repository è ora archiviato.
Non verranno più apportati aggiornamenti al codice e potrebbe essere insicuro o addirittura non funzionante nel momento in cui leggerai questo avviso. Consideralo solo per scopi storici e trattalo con cautela.

In questo repository troverai un'implementazione di riferimento per un rilevamento runtime basato su eBPF per le vulnerabilità di runc e Docker CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 e CVE-2024-23653. Si aggancia alle syscall di Linux (ad es., chdir, mount) e alle invocazioni di funzioni del daemon Docker e le associa alle build Docker e ai processi dei container per identificare lo sfruttamento di queste vulnerabilità.
Per un approccio basato sull'analisi statica, consulta questo.
CVE-2024-21626 è una vulnerabilità nel runtime container runc che consente a un attaccante di evadere dall'isolamento del container e ottenere una RCE completa come root tramite un'immagine appositamente creata che sfrutta un problema nella gestione dell'istruzione WORKDIR. Poiché esiste una condizione di "race" tra il momento in cui alcuni descrittori di file verso l'host vengono aperti e chiusi, un attaccante può creare un Dockerfile con la seguente istruzione WORKDIR /proc/self/fd/[ID] (con ID che è un descrittore di file dipendente dal sistema) che punterà al file system della macchina host sottostante. Questo può essere sfruttato quando si esegue:
docker build - In 2 casi:
FROM che contiene un comando ONBUILD che attiva lo sfruttamento, ad es. ONBUILD WORKDIR /proc/self/fd/[ID]. L'istruzione ONBUILD inietta il comando non nell'immagine che lo contiene ma nell'immagine che la usa come immagine base. Ciò significa che se un'immagine base è compromessa o intenzionalmente dannosa, ad es. ospitata su Dockerhub o altri registry pubblici di container, lo sfruttamento è possibile anche se nulla cambia nell'immagine che il comando docker build effettivamente costruisce.docker runPertanto, questa vulnerabilità può mettere a rischio sia i sistemi di build che gli ambienti di produzione.
CVE-2024-23651 è una vulnerabilità in Docker in cui un comando RUN utilizza il flag --mount=cache. Esiste una vulnerabilità time-of-check/time-of-use (TOCTOU) tra il controllo che una directory source esista sull'host del daemon Docker e l'effettiva chiamata alla syscall mount. Un attaccante è in grado di creare un Dockerfile che posizionerebbe un symlink tra queste due chiamate per indurre un bind mount arbitrario che risulta in una RCE completa come root sull'host.
Questa vulnerabilità riguarda solo il comando docker build.
CVE-2024-23653 è una vulnerabilità in Docker che si verifica quando un generatore LLB Buildkit personalizzato viene utilizzato con la direttiva # syntax. Il generatore può utilizzare le chiamate GRPC Client.NewContainer e Container.Start per eseguire un nuovo container durante la build. L'argomento StartRequest.SecurityMode non viene verificato adeguatamente rispetto alle aspettative di privilegio del daemon docker o della chiamata docker build, il che consente al chiamante GRPC di creare un container privilegiato durante la build. Questo nuovo container privilegiato può quindi essere evaso per ottenere una RCE completa come root sull'host di build.
Questa vulnerabilità riguarda solo il comando docker build.
CVE-2024-23652 è una vulnerabilità di eliminazione arbitraria in Docker. Quando RUN --mount viene utilizzato in un Dockerfile, se la destinazione del mount non esiste verrà creata per quell'ambiente. Quando l'esecuzione termina, questa directory creata verrà ripulita. Se il comando in esecuzione modifica il percorso utilizzato per il mount in un collegamento simbolico, la procedura di pulizia attraverserà questo collegamento simbolico e potenzialmente ripulirà directory arbitrarie nel file system root dell'host.
Questa vulnerabilità riguarda solo il comando docker build.
Il rilevamento in fase di build si applica a tutte e 4 le vulnerabilità.
GOOS=linux GOARCH={{amd64/arm64}} go build.sudo (come richiesto da eBPF) nel tuo ambiente di build (ad es., sudo ebpf-detector &).Leaky vessels vulnerability detected stampato su STDOUT, insieme al rispettivo CVE, nome della vulnerabilità e ulteriori dati forensi.Il rilevamento runtime si applica solo alla vulnerabilità WORKDIR (CVE-2024-21626).
Dockerfile fornito e pubblicala su un registry di immagini.image nel file detector.yaml (contrassegnato con TODO).kubectl apply -f detector.yml.Leaky Vessels vulnerability detected stampato nei log dei pod del DaemonSet.I test unitari devono essere eseguiti con sudo, poiché si basano su eBPF: sudo go test ebpf-detector/....
WORKDIR (CVE-2024-21626) avviene durante l'inizializzazione del container, quindi non verrà rilevato sui container in esecuzione. Il rilevamento presuppone inoltre che il runtime container sia containerd.CVE-2024-23651) e Buildkit Build-time Container Teardown Arbitrary Delete (CVE-2024-23652) si basano sul timing e potrebbero avere falsi negativi a causa di condizioni di race.Per un elenco aggiornato di bug e problemi consulta i problemi del progetto.
I contributi sono benvenuti. Consulta CONTRIBUTING.md per i dettagli.
Leaky Vessels Dynamic Detector è sotto licenza Apache-2.0. Consulta LICENSE per maggiori informazioni.