
CVE-2022-0847 (Dirty Pipe) utilisé pour réaliser l'évasion de conteneur
CVE-2022-0847 utilisé pour réaliser une évasion de conteneur (écraser tous les fichiers en lecture seule sur l'hôte)
Diapositives (en chinois) disponibles ici
利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸(效果为覆写宿主机上任意只读文件)
中文汇报PPT在这里
Si le noyau est vulnérable à CVE-2022-0847, l'attaquant peut écraser des fichiers en lecture seule (Non persistant ! Visitez https://dirtypipe.cm4all.com/ pour plus de détails). Cependant, un conteneur ne peut accéder qu'aux fichiers à l'intérieur du conteneur. Heureusement, lorsqu'il dispose de CAP_DAC_READ_SEARCH, l'attaquant peut désormais écraser des fichiers sur l'hôte !
Comme l'explique https://dirtypipe.cm4all.com/, pour écraser un fichier en lecture seule, nous devons utiliser splice() sur le tube. Pour utiliser splice(), nous devons d'abord ouvrir le fichier cible avec l'indicateur O_RDONLY pour obtenir un descripteur de fichier.
C'est là que CAP_DAC_READ_SEARCH m'est venu à l'esprit. Selon le manuel Linux, lorsque CAP_DAC_READ_SEARCH est accordé, l'attaquant à l'intérieur du conteneur peut :
Avec la capacité CAP_DAC_READ_SEARCH, nous pouvons parcourir le système de fichiers de l'hôte et utiliser open_by_handle_at(2) pour ouvrir en lecture seule n'importe quel fichier sur l'hôte depuis le conteneur, en obtenant son descripteur de fichier (Visitez http://stealth.openwall.net/xSports/shocker.c pour plus de détails).
Maintenant que nous avons le descripteur de fichier du fichier cible sur l'hôte, nous pouvons bien sûr utiliser splice() pour envoyer le contenu du fichier cible dans le tube, puis l'écraser !
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
Tout d'abord, créez un fichier en lecture seule /home/vagrant/flag.txt par l'utilisateur root sur l'hôte, dont le contenu est hello world :

Ensuite, démarrez un conteneur avec la capacité CAP_DAC_READ_SEARCH, essayez d'abord de vider /home/vagrant/flag.txt sur l'hôte, nous obtenons hello world :

puis essayez d'écraser le fichier cible à partir du décalage 1 avec le contenu abcdefghij :

vide à nouveau le fichier cible, maintenant le contenu est habcdefghij ! Quittez le conteneur et vérifiez /home/vagrant/flag.txt sur l'hôte, son contenu est habcdefghij.

Oui, nous venons d'écraser un fichier sur l'hôte depuis le conteneur !