3

我希望能够生成一个只能访问 stdin、stdout 和 stderr 的 linux 进程(不多也不少)。我可以在流程级别本身执行此操作吗?我还含蓄地声明(矛盾修饰法)我不希望生成的进程能够更改流的另一端指向的“事物”。

比喻:

  • 该进程有一个来自某个地方的输入管道,它无法更改管道的起始位置,因此它无法控制输入的来源。
  • 该进程具有输出和错误管道,它无法更改输出管道的另一端指向的位置,因此它无法控制输出的位置。
  • 它无法创建任何新管道。

我目前也在看 SElinux。这是否允许我创建一个只能访问这三个流的进程?谢谢你。

4

4 回答 4

2

这听起来很像这篇 LWN 文章中描述的内容,它基本上阻止了除读取、写入和退出之外的所有系统调用。

于 2008-10-09T10:08:36.847 回答
2

正如另一个答案中所述,SELinux 确实具有有助于锁定任何进程的各种权限。

内核管理对某些对象的访问(具有相关的权限集),例如文件是对象,目录是对象,unix 数据报套接字是对象等等。

可能最简单的事情就是写一个小策略。幸运的是 SELinux 默认是拒绝的,所以运行你的程序并查看 SELinux 拒绝的日志,只允许你的程序做你想做的事。换句话说,您将避免添加涉及对象类的权限,例如 msg(systemV 消息队列中的消息)、msgq(SystemV 消息队列本身)、sem(信号量)、shm(共享内存)以及可能的其他权限,具体取决于它的功能。

我建议您第一次这样做时启用 SELinux,但要允许(请参阅 setenforce 0)

我还建议使用工具来帮助您建立一些策略,编写基本原始的 M4 可能有点难以承受

于 2009-06-20T00:16:49.387 回答
1

如果你是 root,你可以 chroot 到一个目录,删除权限,这样你就不再有文件系统写访问权限,然后 exec。这将阻止程序创建新文件。但是没有办法阻止程序创建管道和套接字(好吧,SELinux 可能没有套接字),也没有办法阻止程序重新排列和关闭其文件描述符。

好吧,我想您可以ptrace用来捕获所有系统调用,并且只允许您批准的系统调用,所以当我说“没有办法”时,我的意思是“没有简单的方法”。这会产生显着的开销,但如果你足够小心,你可以确保它的安全。如果您决定走这条路,那么 UMviewstraceUMview项目可能是很好的起点。

于 2008-10-09T01:11:52.017 回答
1

SELinux 可以胜任;您可以为某些程序分配使用某些系统调用的权限。通过拒绝对 open、pipe 和其他人的访问,您应该能够完全按照您的描述进行操作。

第二种可能的方法是使用 LD_PRELOAD 功能,并提供您自己的 open、pipe 等。职能。这不是 100% 安全的,因为程序仍然可以更直接地访问系统调用(假设这是一个潜在的敌对程序)

于 2008-10-09T05:14:41.310 回答