Gentoo在portage中有一个function ,可以防止和logging在构build和打包目录之外的写入。
Checkinstall能够监视写入,并在完成后打包所有生成的文件。
自动工具具有DESTDIR
macros,使您可以将大部分文件系统活动引导到其他位置。
chroot()
。 Debian处理这种问题的方式是不要以root身份运行安装代码。 软件包构建脚本以普通用户身份运行,安装脚本使用fakeroot运行 – 该LD_PRELOAD库重定向权限检查调用,使其看起来像安装程序实际上以root身份运行,因此生成的文件所有权和权限是正确的,如果从fakeroot环境中运行/usr/bin/install
,则环境内的其他stat
将显示正确的所有权),但实际上安装程序是以普通用户身份运行的。
在某些情况下(主要是为了开发),构建也使用例如pbuilder在chroots中完成 – 然而,这对二进制发行版来说可能更容易,因为每个使用pbuilder的构建都会重新安装超出基本系统的所有依赖关系,指定了依赖关系(这是使用chroot的主要原因;不是为了防止意外安装)
一种方法是虚拟化一个流程,就像wine
一样,重新解释文件路径。 虽然这实施起来相当繁重。
更优雅的方法是使用chroot()
系统调用,它将文件系统的子树设置为进程的根目录。 创建一个虚拟子树,包括/ bin,/ tmp,/ usr,/ etc,以便进程查看它们,用虚拟树调用chroot,然后执行目标可执行文件。 我不记得是否可以在树形参考文件中有符号链接,但我不这么认为。 但是,当然,所有需要的东西都可以复制到沙箱中,然后在完成时检查对原始文件的更改。
也许用普通的用户权限来获得沙盒的安全性? 所以运行show的过程有特定的目录访问权限。
chroot
将是一个选项,但我不知道如何跟踪这些尝试写在根外。
另一个想法是沿着拦截系统调用的路线。 我不太了解这个,但strace
是一个开始,尝试运行一个程序,并检查你是否看到你喜欢的东西。
编辑:
使用内核模块的一个选项? 因为你可以用你自己的方式替换写系统调用,所以你可以防止任何你需要的,并记录下来。
这听起来有点像你所描述的是容器 。 一旦建立了容器基础设施,创建容器便宜很多,而且相当安全。
有两种方法可以做到这一点。 一种是使用LD_PRELOAD
来挂钩导致系统调用的库调用,比如libc中的调用,然后调用dlsym
/ dlopen
。 这不会让你直接挂钩系统调用。
第二种允许挂接系统调用的方法是在ptrace
下运行你的可执行文件,它提供了在发生系统调用时停止和检查系统调用的选项。 这可以以编程方式设置为沙箱对文件系统的受限区域的调用等等。