使用gcc/g ++时抑制系统调用

问题描述:

我在我的大学局域网中有一个门户,人们可以上传代码到C/C++的编程难题。我想使门户安全,以便人们不能通过他们提交的代码进行系统调用。可能有几种解决方法,但我想知道我是否可以简单地通过设置一些聪明的gcc标志来完成。默认情况下libc似乎包含<unistd.h>,这似乎是声明系统调用的基本文件。有没有一种方法可以告诉gcc/g ++在编译时忽略这个文件,以便在unistd.h中声明的函数都不能被访问?使用gcc/g ++时抑制系统调用

+2

如何使用像http://www.citi.umich.edu/u/provos/systrace/? – GWW 2011-03-03 21:00:38

+0

我现在正在做的事情就像systrace - 只是想知道是否更容易绕过那些明显区别于常规库代码的东西(至少在人类的描述中)。 – kyun 2011-03-03 21:17:26

为什么chroot("/var/jail/empty"); setuid(65534);不够好(假设65534有明显的限制)?

+0

这就像创建/模拟不同的用户来运行上传的代码一样吗?我见过其他人使用这种方法 - 总是想知道如何。 – kyun 2011-03-03 21:19:12

+1

它与-static链接的想法,写入二进制到*,并运行它。*里没有别的东西,所以他们根本无法做任何事情。 – Joshua 2011-03-03 23:11:47

+0

啊!这是一个很好的黑客!它就像你自己的小沙箱!我认为这比按原样压制系统调用要简单得多。现在,我已经从沙箱理念转变为沙箱实施。谢谢! – kyun 2011-03-03 23:27:54

-D可以覆盖单个函数名称。例如:

gcc file.c -Dchown -Dchdir 

或者你可以设置包括守卫自己:

gcc file.c -D_UNISTD_H 

但他们的影响可以很容易地#undef S按智能汇交:)

+0

我明白你的意思 - 我认为马修斯拉特里指出,要走的路是拥有某种沙箱环境 – kyun 2011-03-03 21:21:36

限制访问头收归文件不会阻止你访问libc函数:如果你链接到libc,它们仍然可用 - 你只是不会有原型(和宏)的手;但你可以自己复制它们。

而不是链接到libc也不会帮助:系统调用可以直接通过内联汇编程序(甚至涉及跳入数据的技巧)。

我不认为这是一个很好的方法。在完全自包含的虚拟沙箱中运行上传的代码(可能通过QEMU或类似的东西)可能是更好的方式。

+0

这是真的 - 没有想到这一点。我猜沙盒会成为一种方式,对于这样一个简单的(通常是非恶意的)环境来说似乎有很多开销 – kyun 2011-03-03 21:20:45