
CVE-2022-0847을 사용하여 컨테이너 이스케이프 달성 CVE-2022-0847 (Dirty Pipe)을 이용한 컨테이너 이스케이프
CVE-2022-0847은 컨테이너 탈출을 달성하는 데 사용됩니다 (호스트의 읽기 전용 파일 덮어쓰기)
슬라이드 (중국어)는 여기에서 확인 가능
利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸(效果为覆写宿主机上任意只读文件)
中文汇报PPT在这里
커널이 CVE-2022-0847에 취약한 경우, 공격자는 읽기 전용 파일을 덮어쓸 수 있습니다 (비영구적! 자세한 내용은 https://dirtypipe.cm4all.com/ 참조). 그러나 컨테이너는 컨테이너 내부의 파일에만 접근할 수 있습니다. 다행히 CAP_DAC_READ_SEARCH가 주어지면 공격자는 호스트의 파일을 덮어쓸 수 있습니다!
https://dirtypipe.cm4all.com/ 에서 설명하듯이, 읽기 전용 파일을 덮어쓰려면 해당 파일을 파이프로 splice() 해야 합니다. splice()를 사용하려면 먼저 대상 파일을 O_RDONLY 플래그로 열어 파일 디스크립터를 얻어야 합니다.
이때 CAP_DAC_READ_SEARCH가 떠올랐습니다. Linux 매뉴얼에 따르면, CAP_DAC_READ_SEARCH가 주어지면 컨테이너 내부의 공격자는:
open_by_handle_at(2)를 호출할 수 있습니다.CAP_DAC_READ_SEARCH 능력을 통해 호스트 파일 시스템을 탐색하고 open_by_handle_at(2)를 사용하여 컨테이너에서 호스트의 모든 파일을 읽기 전용으로 열 수 있으며, 그 파일 디스크립터를 얻을 수 있습니다 (자세한 내용은 http://stealth.openwall.net/xSports/shocker.c 참조).
이제 호스트의 대상 파일에 대한 파일 디스크립터를 얻었으므로, splice()를 사용하여 대상 파일 내용을 파이프로 보낸 다음 덮어쓸 수 있습니다!
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
먼저, 호스트에서 root 사용자가 읽기 전용 파일 /home/vagrant/flag.txt를 만들고, 내용은 hello world입니다:

그런 다음, CAP_DAC_READ_SEARCH 능력을 가진 컨테이너를 시작하고, 먼저 호스트의 /home/vagrant/flag.txt를 덤프하면 hello world가 나옵니다:

그런 다음 오프셋 1부터 내용 abcdefghij로 대상 파일을 덮어씁니다:

대상 파일을 다시 덤프하면 이제 내용이 habcdefghij입니다! 컨테이너를 종료하고 호스트에서 /home/vagrant/flag.txt를 확인하면 내용이 habcdefghij입니다.

네, 컨테이너에서 호스트의 파일을 덮어썼습니다!