首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何禁止系统调用,GNU/Linux

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

Stack Overflow用户
提问于 2012-04-03 21:32:27
回答 2查看 2.5K关注 0票数 7

我目前正在开发类似ACM的公共编程竞赛系统的后端。在这样的系统中,任何用户都可以提交一个代码源代码,该源代码将被自动编译和运行(这意味着不执行人眼预调节),试图解决一些计算问题。

后端是一台GNU/Linux专用机器,将为每个参赛者创建一个用户,所有这些用户都是用户组的一部分。任何特定用户发送的源将存储在用户的主目录中,然后编译并执行,以便根据各种测试用例进行验证。

我想要的是禁止对源代码使用Linux系统调用。这是因为问题需要独立于平台的解决方案,而启用系统调用不安全源则是潜在的安全漏洞。这些源可以成功地放置在FS中,甚至是编译好的,但永远不会运行。每当发送包含系统调用的源时,我也希望得到通知。

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

  • 前端/预编译分析源代码已在系统中签入,但尚未编译.系统调用名称的简单文本检查器。平台依赖,编译器独立,语言依赖的解决方案。
  • 每当遇到系统调用时,编译器补丁-崩溃GCC (或包括在工具链中的任何其他编译器)。平台依赖,编译器依赖,语言无关的解决方案(如果我们放置检查器“足够远”)。兼容性也可能会丧失。事实上,我最不喜欢这种选择。
  • 运行时检查器-每当从进程调用系统调用时,终止该进程并报告.这个解决方案是独立于编译器和语言的,但是取决于平台--我同意这一点,因为我将在类似的平台上短期和中期地部署后端。

因此,问题是: GNU/Linux是否为管理员提供了一个机会,禁止对用户组、用户或特定进程使用系统调用?它可能是安全策略,也可能是轻量级的GNU实用程序。

我试图谷歌,但谷歌不喜欢我今天。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 21:57:23

模式1 seccomp允许进程将自身限制为四个系统:read、write、sigreturn和_exit。这可以用于严格的沙箱代码,正如科科护士所做的。

seccomp (在编写本文时,可以在Ubuntu 12.04中找到或修补您自己的内核)在过滤系统时提供了更多的灵活性。例如,您可以首先设置过滤器,然后再对被测试的程序进行exec。适当地使用chroot或unshare可以防止它重新使用其他“有趣”的东西。

票数 9
EN

Stack Overflow用户

发布于 2012-04-03 21:53:16

我认为你需要更好地定义系统呼叫。我是说,

代码语言:javascript
复制
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或类似的)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10001727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档