禁止除 FIFO 之外的进程进行文件 IO

禁止除 FIFO 之外的进程进行文件 IO

如何启动一个无法完成的进程任何文件 IO(打开/关闭文件、创建/删除文件、读取/写入文件等),除了读取和写入预先创建的 FIFO 之外?

chroot不会工作,因为进程可以打破它,但搞乱/修改内核等等是可以的)

顺便说一句:我无法修改正在运行的程序

答案1

如果

  1. 可以修改程序以在任何不受信任的代码之前进行您选择的系统调用(这可以通过LD_预加载), 和
  2. exit()除了、和 之外sigreturn(),程序不需要执行任何系统调用read()write()

那么你可以使用安全计算(维基百科文章)。为了允许更多的系统调用,有 seccomp-bpf,它使用伯克利数据包过滤器确定允许哪些系统调用。这libseccomp库简化了 seccomp-bpf 因此(例如)如果您想允许系统close()调用:

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);

或者对于类似的东西chroot,但无法打破,你可以尝试Linux容器,开放VZ或者Linux虚拟服务器

答案2

最好的办法是以非特权用户身份运行该问题。向 FIFO 授予正确的权限。

也就是说,非特权用户将有权访问任何其他非特权用户将拥有的所有文件。

要执行更多操作,您必须认真修改文件系统上的内容。但:

chmod o-rwx / -R

肯定会锁定事情。但其他用户也将无法阅读任何内容。

我想问自己的更重要的问题是“为什么我需要这个限制?”也许有更好的方法来实现你的目标?

答案3

如果操作正确,即在自己的用户 ID 下运行进程(即在 chroot 之外不得有任何进程以同一用户身份运行),则进程无法脱离 chroot。

将进程 Chroot 到该进程无法写入且仅包含 FIFO 的目录。您需要将可执行文件及其所需的库和数据文件放入该 chroot 中,或者以 root 身份启动进程,然后 chroot,然后更改用户 ID。

如果你不能涉及root,你可以使用名称空间,但是您需要一个最新的内核(≥3.8)。首先创建一个用户命名空间,然后在其中 chroot 并更改为命名空间内的用户 ID,且没有所需的权限。

或者,这可以通过安全框架(如 SELinux 或 AppArmor)来完成(与 root 合作):禁用除 、 、 和 之外的所有与文件系统相关的系统调用,openread限制writeclose包含lseekFIFOopen的目录。请务必ptrace也禁用。

相关内容