防止进程执行某些系统调用

我正在写一个产生subprocess的程序。 出于安全原因,我想限制这些进程可以做什么。 我知道程序之外的安全措施,比如chrootulimit ,但是我想做更多的事情。 我想限制subprocess完成的系统调用(例如阻止调用open()fork()等)。 有没有办法做到这一点? 最好是阻塞的系统调用应该返回一个错误,但如果这是不可能的,那么杀死进程也是好的。

我想这可以做ptrce ptrace()但从手册页,我真的不明白如何使用它的目的。

如果你想这样做,你有一些选择(有些是非常简单的)。 首先,我建议你按照这里解释的教程。 有了它,你可以学习如何知道系统调用被调用,以及基本的ptrace知识(不用担心,这是一个非常简短的教程)。 我知道的选项有以下几种:

  • 最简单的就是杀死孩子, 这里就是这个确切的代码 。
  • 其次,你可以让孩子失败,只需通过PTRACE_SETREGS改变寄存器,在其中输入错误的值,如果你愿意(也可以使用PTRACE_SETREGS ),你也可以改变系统调用的返回值。
  • 最后你可以跳过系统调用。 但是为此,您应该知道系统调用调用后的地址,并将该指令寄存器指向那里,并将其设置为(再次使用PTRACE_SETREGS )。

这听起来像SECCOMP_FILTER ,在内核版本3.5中添加,是你所追求的。 libseccomp库为此功能提供了一个易于使用的API。

顺便说一句, chroot()setrlimit()都是可以在程序中调用的系统调用 – 除了seccomp过滤之外,您可能还想使用其中的一个或两个。