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

pet*_*ohn 9 c linux security system-calls

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

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

caf*_*caf 7

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

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


小智 5

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

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

  • 请注意,有一些[重要提示](http://stackoverflow.com/a/4421762/134633)使用ptrace进行沙盒处理. (2认同)