我正在创建一个 API,它接受任何命令(在 bash 中)并在根目录下执行它。我想确保此命令是 RO 并且不会写入任何内容。有什么想法可以解决此问题吗?也许可以使用计时器等暂时禁用它?
答案1
我认为这是不可能的。例如,您可以确保写入stdout
或 的任何内容都会重定向到。但是,如果实用程序想要写入文件,您无法阻止甚至不知道这一点。stderr
/dev/null
标准安全做法是永远不要以 root 权限运行不受信任的程序。
答案2
我认为,一般情况下,没有任何方法可以确保随机程序不会在任何地方写入任何内容。你正在研究类似于解决停机问题,但有一个变化(stdout 和 stderr 也作为文件句柄公开)。
但是,您可以创建一个小型库,覆盖相关的几个标准库调用,例如 creat(2)、open(2)、write(2 和其他一些调用,以便不将任何内容保留在磁盘上。这可能类似于libfaketime,并且应该合理可行。它可以通过动态加载器的 LD_PRELOAD 库预加载机制移植到任何应用程序。
然而,这几乎肯定不是一个完整的解决方案。尤其如果以 root 身份运行的进程知道需要这样做并且想要作恶,那么它可以很容易地覆盖其中任何一个。首先,它依赖于任何此类调用都通过通用接口(如 C 库),而这并不能保证;进程可以同样轻松地将 C 库代码直接复制到自己的代码中。它可以直接调用内核的系统调用接口。C 库并不是什么神奇的东西;它和其他库一样都是用户空间代码。二进制文件可以静态链接,在这种情况下根本不会调用动态加载器。可能可以绕过这些限制并阻止写入,但是……
当进程期望写入的文件保存所写入的数据时,使 write(2) 和相关操作为无操作也很可能在另一端造成破坏。
如果它实际上没有写入任何内容,而只是读取几个安全关键配置文件(/etc/crypttab、/etc/shadow、/etc/bind/rndc.key......您明白了)并将该数据传递到其他地方;也许通过网络,或者将其转储以便通过旁道攻击进行访问,会怎么样?
我会更进一步比萨万托。标准的安全做法应该是不运行不受信任的软件,就这样。而你明确地不应以 root 身份运行不受信任的软件。对于以 root 身份运行的任何软件,你可以设置一些障碍,但你不能保证它不会做任何它想做的事。SELinux可以提供帮助,并且在正确使用时可能会有很长的路要走,但是配置起来很麻烦,并且可能会导致任何违反策略的行为导致相关调用因错误情况而失败,甚至可能导致硬进程中止,所以它根本不会很优雅。
我能想到的最接近你想要做的事情,在一般情况下是可行的,将成为一台独立的虚拟机,具有回滚对磁盘所做修改的功能(通常称为快照回滚功能)。然而,这远非无缝,而且会带来很大的开销,因为您实际上运行的是第二个操作系统实例,这意味着一切。
答案3
这不是一个直接的答案,但我会寻找沙箱或者虚拟机。