如何禁止系统调用,GNU / Linux

我目前正在研究类ACM公共编程比赛系统的后端。 在这样的系统中,任何用户都可以提交一个代码源,这个代码源将被自动编译和运行(也就是说,不进行人眼预先调整),以解决一些计算问题。

后端是一个GNU / Linux专用机器,为每个参赛者创build一个用户,所有这些用户都是用户组的一部分。 由任何特定用户发送的信息源将被存储在用户的主目录中,然后被编译和执行以针对各种testing用例进行validation。

我想要的是禁止使用Linux系统调用来源。 这是因为问题需要独立于平台的解决scheme,而对不安全的源进行系统调用则是潜在的安全漏洞。 这样的来源可能会成功地放置在FS中,甚至编译,但从来没有运行。 我还希望在发送包含系统调用的源文件时收到通知。

到目前为止,我看到以下可能放置这样的检查器的地方:

  • 前端/预编译分析 – 源已在系统中检查,但尚未编译。 系统调用名称的简单文本检查器。 独立于平台,独立于编译器,依赖于语言的解决scheme。
  • 编译器补丁 – 遇到系统调用时,会崩溃GCC(或者包含在工具链中的任何其他编译器)。 依赖于平台的,依赖于编译器的,与语言无关的解决scheme(如果我们将检查器“足够的”)。 兼容性也可能会丢失。 其实我最不喜欢这个select。
  • 运行时检查器 – 无论何时从进程调用系统调用,终止此进程并报告。 这个解决scheme是独立于编译器和语言的,但依赖于平台 – 我可以这么做,因为我将在类似的平台上以短期和中期部署后端。

所以问题是:GNU / Linux为pipe理员提供了一个禁止用户组,用户或特定进程的系统调用的机会吗? 这可能是一个安全策略或一个轻量级的GNU工具。

我试图Google,但Google今天不喜欢我。

Solutions Collecting From Web of "如何禁止系统调用,GNU / Linux"

模式1 seccomp允许一个进程将自己限制在四个系统调用: readwritesigreturnsigreturn 。 这可以用来严格的沙箱代码, seccomp-nurse 。

模式2 seccomp (在编写的时候,在Ubuntu 12.04中发现或修补你自己的内核)为​​过滤系统调用提供了更多的灵活性。 例如,您可以先设置过滤器,然后exec测试中的程序。 可以使用合适的chrootunshare来避免重复其他“有趣”的事情。

我认为你需要更好地定义系统调用。 我的意思是,

 cat <<EOF > hello.c #include <stdio.h> int main(int argc,char** argv) { fprintf(stdout,"Hello world!\n"); return 0; } EOF gcc hello.c strace -q ./a.out 

表明,即使是一个显而易见的小程序也会造成27个系统调用。 你(我想)要允许调用“标准C库”,但是这些将依次进行系统调用。 我想我想说的是,运行时检查比你想象的更不可行(无论使用strace还是类似的)。