如何启动一个无法完成的进程任何文件 IO(打开/关闭文件、创建/删除文件、读取/写入文件等),除了读取和写入预先创建的 FIFO 之外?
(chroot
不会工作,因为进程可以打破它,但搞乱/修改内核等等是可以的)
顺便说一句:我无法修改正在运行的程序
答案1
如果
- 可以修改程序以在任何不受信任的代码之前进行您选择的系统调用(这可以通过LD_预加载), 和
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 合作):禁用除 、 、 和 之外的所有与文件系统相关的系统调用,open
并read
限制write
为close
包含lseek
FIFOopen
的目录。请务必ptrace
也禁用。