如何正确挂载 /proc、/run 以防止 chroot 能够查看或杀死属于主机的进程

如何正确挂载 /proc、/run 以防止 chroot 能够查看或杀死属于主机的进程

我在脚本中使用循环来处理特殊文件系统,mount --bind例如/dev,,,,(以及可选的)这样的方式:/dev/pts/proc/run/sys/sys/firmware/efi/efivars

for specialFS in dev dev/pts proc run sys
do
    test -d $destinationRootDir/$specialFS/ || sudo mkdir $destinationRootDir/$specialFS/
    sudo mount -v --bind /$specialFS $destinationRootDir/$specialFS
done
[ -d /sys/firmware/efi ] && sudo mkdir -p $destinationRootDir/sys/firmware/efi/efivars && sudo mount -v --bind /sys/firmware/efi/efivars $destinationRootDir/sys/firmware/efi/efivars

然后我进入 chroot:

sudo chroot $destinationRootDir

mount -a
update-grub
[ -d /sys/firmware/efi ] && grub-install --efi-directory=$(mount | awk '/\/efi /{print$3}') || grub-install $destinationDisk
umount -a
umount /usr && exit

问题是/usr无法卸载,因为 chroot 环境认为/usr它正在被我在主机上运行的进程使用。

所以我想我不应该使用mount --bindfor/proc和/或 for /run

我怎样才能正确安装这两个,以便我的 chroot 环境在进程级别上被隔离?

答案1

chroot 并非设计为安全边界,因此如果你不信任 jail 内的代码,则不应使用它。检查https://access.redhat.com/blogs/766093/posts/1975883 此外,如果您暴露 dev/pts,您的命令很有可能通过伪终端在监狱外启动。如果没有确切的命令和该命令的父 pid,很难猜测。

相关内容