【问题标题】:Preventing processes to execute certain system calls阻止进程执行某些系统调用
【发布时间】:2012-10-31 20:06:44
【问题描述】:

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

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

【问题讨论】:

标签: c linux security system-calls


【解决方案1】:

听起来SECCOMP_FILTER,添加到内核版本 3.5 中,就是您所追求的。 libseccomp library 为该功能提供了一个易于使用的 API。

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

【讨论】:

    【解决方案2】:

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

    • 最简单的方法是杀死孩子,即this exact code here
    • 其次,你可以让孩子失败,只要用PTRACE_SETREGS改变寄存器,把错误的值放进去,如果你愿意,你也可以改变系统调用的返回值(同样,用PTRACE_SETREGS) .
    • 终于可以跳过系统调用了。但为此,您应该知道系统调用调用后的地址,将指令寄存器指向那里并设置它(同样,使用PTRACE_SETREGS)。

    【讨论】:

    • 请注意,有一些 big caveats 使用 ptrace 进行沙盒。
    • you should know the address after the system call call, make the intruction register point there and set it,是的,因为系统调用需要由内核执行,所以它们会跳转到内核,因此您必须保存地址以便它们可以返回用户空间.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2014-07-15
    • 2011-06-09
    • 2017-10-03
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多