
CVE-2022-0847 usato per ottenere la fuga dal container — Utilizzo di CVE-2022-0847 (Dirty Pipe) per realizzare la fuga dal container
CVE-2022-0847 utilizzata per ottenere la container escape (sovrascrivere qualsiasi file in sola lettura sull'host)
Slide (in cinese) disponibili qui
Sfruttamento di CVE-2022-0847 (Dirty Pipe) per ottenere la container escape (effetto: sovrascrivere qualsiasi file in sola lettura sull'host)
PPT della presentazione in cinese qui
Se il kernel è vulnerabile a CVE-2022-0847, l'attaccante può sovrascrivere file in sola lettura (non in modo persistente! Visita https://dirtypipe.cm4all.com/ per maggiori dettagli). Tuttavia, il container può accedere solo ai file al suo interno. Fortunatamente, quando viene assegnata CAP_DAC_READ_SEARCH, l'attaccante può ora sovrascrivere file sull'host!
Come spiega https://dirtypipe.cm4all.com/, per sovrascrivere un file in sola lettura dobbiamo passarlo a una pipe con splice(). Per usare splice(), dobbiamo prima aprire il file target con il flag O_RDONLY per ottenere un file descriptor.
È lì che mi è venuto in mente CAP_DAC_READ_SEARCH. Secondo il manuale Linux, quando viene assegnata CAP_DAC_READ_SEARCH, l'attaccante all'interno del container può:
Con la capability CAP_DAC_READ_SEARCH, possiamo esplorare il filesystem dell'host e usare open_by_handle_at(2) per aprire in sola lettura qualsiasi file sull'host dal container, ottenendone il file descriptor (visita http://stealth.openwall.net/xSports/shocker.c per maggiori dettagli).
Ora che abbiamo il file descriptor del file target sull'host, possiamo ovviamente usare splice() per inviare il contenuto del file target alla pipe e poi sovrascriverlo!
cp /etc/password . # back up /etc/password
gcc dp.c -o dp
docker run --rm -it -v $(pwd):/exp --cap-add=CAP_DAC_READ_SEARCH ubuntu
/exp/dp /etc/passwd 1 ootz: # overwrite /etc/password on host from offset 1
/etc/dp /etc/passwd # dump /etc/passwd on host
Per prima cosa, crea un file in sola lettura /home/vagrant/flag.txt come utente root sull'host, il cui contenuto è hello world:

Poi, avvia un container con la capability CAP_DAC_READ_SEARCH, prova prima a dumpare /home/vagrant/flag.txt sull'host e otteniamo hello world:

quindi prova a sovrascrivere il file target dall'offset 1 con il contenuto abcdefghij:

dumpa di nuovo il file target: ora il contenuto è habcdefghij! Esci dal container e controlla /home/vagrant/flag.txt sull'host: il suo contenuto è habcdefghij.

Sì, abbiamo appena sovrascritto un file sull'host dal container!