如何在不影响文件系统的情况下运行bash脚本?

我正在尝试为Linux系统(ubuntu)创建一些软沙箱。 我的主要目标是找出我选择的bash脚本执行的文件,而不是让它运行它们。 我还想阻止对系统的更改,因此运行脚本会认为他有能力写入文件但实际上并没有。 我不想在低权限下运行bash脚本,因为如果它尝试更改某些内容,它将无法运行。 请不要建议通过虚拟机器运行它,这对我来说太慢了。

我想到的唯一事情是挂钩任何写系统调用,所以当它尝试写入文件时,系统将返回SUCCESS但什么都不做。 还挂钩任何执行系统调用以捕获脚本执行的所有程序,并防止执行其他文件,同时将成功返回到脚本。 但我必须弄清楚如何做到这一点。

有任何想法吗? 提前致谢。

尝试使用带有chroot的叠加层 。 首先,确定你想要chroot到的路径,并确保它存在,并且类似于你将覆盖的路径/ (这是修改将去的地方):

 mkdir -p /chroot mkdir -p /tmp/tmproot 

我在/tmp/选择了一个目录,因为它是我系统上的tmpfs (可能是不可取的,但对我来说还可以),所以没有任何更改应该到达磁盘。 您可以使用squashfs并将其挂载到某个地方,并将其用作叠加层,但我认为这是一个只读的问题。

现在:

 $ mount -t overlayfs -o lowerdir=/,upperdir=/tmp/tmproot overlayfs /chroot/ $ chroot /chroot/ /bin/bash -l root:/$ touch test root:/$ ls ... sys test tmp ... root:/$ logout $ ls / ... sys tmp ... $ ls /tmp/tmproot/ root test 

如果使upperdir独立于物理磁盘(可能使用tmpfs ),则应保护lowerdir

请注意创建root文件夹 – 这是我的.bash_history 。 副本是由原始.bash_history制作的,然后附加到。

这是不可能的结果:脚本的行为可能取决于它之前写入文件的信息。 如果你实际上不允许它写入文件(但让脚本认为它确实写入了文件),那么你可能会以一种“真实”运行它不会发生的方式影响脚本的行为。 。

例如:

 #!/bin/bash write_bit_to_file () { # write a random bit to a file echo $((RANDOM % 2)) >> file.txt } get_bit_from_file () { # read the random bit from the file tail -1 file.txt } # MAIN SCRIPT ############# # ... do some stuff, save some info for later ... write_bit_to_file # ... do more stuff, retrieve info from file ... if (( $(get_bit_from_file) )); then # access foo.txt and do something echo "I'm going to access foo.txt" else # access bar.txt and do something echo "I'm going to access bar.txt" fi 

这显然是一个非常人为的脚本,但我希望你明白这一点:如果脚本实际上没有写入file.txt ,但认为它确实存在,那么你将得到一个错误(例如,如果file.txt不存在)或意外行为(例如,如果file.txt确实存在,但包含除预期之外的其他信息,因为write_bit_to_file实际上没有写入文件)。 但是,如果您将脚本运行为real,它将按预期运行(例如,随机访问foo.txtbar.txt )。

可能的做法是编写一个执行脚本的监视器,观察它写入的文件,在发生这些文件之前备份这些文件,并在脚本结束时将这些文件恢复到其原始状态。 但那会非常讨厌;)

编辑:在这个答案中 ,muru提出了一种非常好的方法来实现类似于此监视器的东西,甚至更好,因为它永远不会影响您的实际根文件系统并保留脚本完成的文件修改以便以后重用。 这是要走的路! 🙂