我目前在 14.04 机器上使用一个沙盒软件,将 Linux 二进制文件彼此隔离(使用一种不同于 AppArmor 的特殊类型的命名空间隔离)
目前调用沙箱的方式如下:
/usr/local/bin/sandbox /path/to/binary --optional-arguments
我的问题是,我想调用某些任意二进制文件并让它们在沙箱中执行没有必须将该/usr/local/bin/sandbox
部分添加到我的 shell 命令的前面。例如:
/usr/local/bin/sandbox /path/to/binary --optional-arguments --> *new process*
变成:
/path/to/binary --optional-arguments --> *binfmt-misc* --> *new process*
我认为我可以通过 binfmt-misc 轻松完成此操作,但在阅读文档后,它似乎仅支持通过文件本身的魔法位或文件扩展名来请求解释器。由于在这种特定情况下无法执行任何这些操作,因此我在 binfmt-misc 中寻找一个选项,该选项可以允许我为某些二进制文件指定扩展属性,我希望这些二进制文件在沙箱中启动,然后 binfmt-misc 可以读取并使用这些属性来确定这些二进制文件必须由/usr/local/bin/sandbox
“解释器”运行。但是,我还没有在其中找到允许我这样做的功能。
有没有什么方法可以让我自动使用沙箱启动为与我的计算机相同架构编译的任意没有扩展的 ELF 二进制文件?
答案1
我不知道如何通过 binfmt-misc 和 xattrs 来实现这一点,但我建议采用另一种方法。我还没有尝试过,但我不明白为什么它不起作用。
这个想法是使用联合山通过调用沙箱的包装器脚本来隐藏真实二进制文件。我们需要一个联合挂载,其中上层目录主要是读取,写入非影子文件则转到下层目录,但并非所有联合挂载系统都支持此功能。特别是这排除了现在内置于 Linux 内核的 OverlayFS。
编写通用包装脚本:
#!/bin/sh
exec /usr/local/bin/sandbox "${0#/sandboxed}" "$@"
创建一个目录/sandbox
并创建一个映射根文件系统的联合挂载。我将使用奥夫斯(Ubuntu:aufs-tools
),不幸的是,它最近已被废弃;也许有更好的选择。
mount -t aufs -o br:/,br:/sandbox aufs-sandbox /
对于您想要沙盒化的每个可执行文件,链接到包装器脚本(在下/sandbox/path/to/foo
创建必要的目录之后)。/path/to
/sandbox