防止进程执行特定系统调用

12
我正在编写一个生成子进程的程序。出于安全原因,我想限制这些进程的活动范围。我知道一些可以在程序外部实现的安全措施,比如chroot或者ulimit,但我还想做得更好。我想限制子进程所能调用的系统调用(例如阻止对open()fork()等函数的调用)。有什么方法可以实现吗?最好是被阻止的系统调用返回一个错误信息,但如果不可能的话,终止进程也是可以接受的。
我猜这可以用ptrace()来实现,但从手册页上我并不真正理解如何将其用于此目的。

3
您可能需要使用SELinux(安全增强型Linux),它具有可编程API。我不是100%确定,但这应该是正确的。 - Šimon Tóth
5
prctl(PR_SET_SECCOMP, ...) 可能是你需要的。这是最接近“禁止系统调用”的方法。 - Damon
1
prctl(PR_SET_SECCOMP, ...) 的问题在于它也会阻止 exec() 调用,因此对我来说是无法使用的。 - petersohn
2个回答

8
看起来你需要的是内核版本3.5中添加的SECCOMP_FILTERlibseccomp提供了易于使用的API以实现此功能。
顺便提一下,chroot()setrlimit()都是可以在程序中调用的系统调用 - 除了seccomp过滤外,你可能还想使用其中一个或两个。

5
如果您想使用“ptrace”方法,有一些选项(其中一些非常简单)。首先,我建议您按照这里的教程学习如何知道哪些系统调用被调用,以及基本的“ptrace”知识(不用担心,这是一个非常简短的教程)。您可以选择以下选项(据我所知):
  • 最简单的方法是杀死子进程,即这段代码
  • 其次,您可以通过使用“PTRACE_SETREGS”更改寄存器中的值并将错误值放入其中来使子进程失败,如果需要,还可以更改系统调用的返回值(同样是使用“PTRACE_SETREGS”)。
  • 最后,您可以跳过系统调用。但是,为此,您应该知道系统调用调用后的地址,将指令寄存器指向那里并设置它(同样是使用“PTRACE_SETREGS”)。

2
请注意,使用ptrace进行沙盒化存在一些重大警告 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接