
CVE-2022-0847 wird verwendet, um Container-Escape zu erreichen Verwendung von CVE-2022-0847 (Dirty Pipe) zur Container-Escape
CVE-2022-0847 wird verwendet, um einen Container-Escape zu erreichen (Überschreiben beliebiger schreibgeschützter Dateien auf dem Host)
Präsentationsfolien (auf Chinesisch) verfügbar hier
Verwendung von CVE-2022-0847 (Dirty Pipe) zur Container-Escape (Effekt: Überschreiben beliebiger schreibgeschützter Dateien auf dem Host)
Präsentationsfolien auf Chinesisch hier
Wenn der Kernel anfällig für CVE-2022-0847 ist, kann der Angreifer schreibgeschützte Dateien überschreiben (nicht persistent! Besuchen Sie https://dirtypipe.cm4all.com/ für weitere Details). Ein Container kann jedoch nur auf Dateien innerhalb des Containers zugreifen. Glücklicherweise kann der Angreifer mit CAP_DAC_READ_SEARCH nun Dateien auf dem Host überschreiben!
Wie https://dirtypipe.cm4all.com/ erklärt, sollten wir zum Überschreiben einer schreibgeschützten Datei splice() in die Pipe verwenden. Um splice() zu verwenden, müssen wir zunächst die Zieldatei mit dem Flag O_RDONLY öffnen, um einen Dateideskriptor zu erhalten.
Da kam mir CAP_DAC_READ_SEARCH in den Sinn. Laut Linux-Manual kann der Angreifer im Container mit CAP_DAC_READ_SEARCH:
Mit der Fähigkeit CAP_DAC_READ_SEARCH können wir das Host-Dateisystem durchsuchen und mit open_by_handle_at(2) beliebige Dateien auf dem Host nur lesend aus dem Container öffnen und so deren Dateideskriptor erhalten (Besuchen Sie http://stealth.openwall.net/xSports/shocker.c für weitere Details).
Nachdem wir nun den Dateideskriptor der Zieldatei auf dem Host haben, können wir natürlich splice() verwenden, um den Inhalt der Zieldatei an die Pipe zu senden und sie dann zu überschreiben!
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
Erstellen Sie zunächst eine schreibgeschützte Datei /home/vagrant/flag.txt als Root-Benutzer auf dem Host, deren Inhalt hello world ist:

Starten Sie dann einen Container mit der Fähigkeit CAP_DAC_READ_SEARCH. Versuchen Sie zuerst, /home/vagrant/flag.txt auf dem Host auszulesen – wir erhalten hello world:

Versuchen Sie dann, die Zieldatei ab Offset 1 mit dem Inhalt abcdefghij zu überschreiben:

Lesen Sie die Zieldatei erneut aus – jetzt ist der Inhalt habcdefghij! Beenden Sie den Container und überprüfen Sie /home/vagrant/flag.txt auf dem Host; sein Inhalt ist habcdefghij.

Ja, wir haben gerade eine Datei auf dem Host aus dem Container überschrieben!