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

时间:2012-11-12 11:40:15

标签: c linux security system-calls

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

我想它可以完成wuth ptrace()但是从手册页我真的不明白如何将它用于此目的。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

如果你想以ptrace方式进行,你有一些选择(有些选项非常简单)。首先,我建议您按照教程explained here进行操作。有了它,您可以学习如何知道正在调用的系统调用,以及基本的ptrace知识(不用担心,这是一个非常简短的教程)。您知道的选项如下:

  • 最简单的就是杀死孩子,即this exact code here
  • 其次你可以让孩子失败,只需用PTRACE_SETREGS更改寄存器,在其中加入错误的值,你也可以根据需要更改系统调用的返回值(再次使用{{ 1}})。
  • 最后你可以跳过系统调用。但是为此你应该在系统调用之后知道地址,在那里设置指令寄存器并设置它(再次使用PTRACE_SETREGS)。