使用gcc/g ++时抑制系统调用
我在我的大学局域网中有一个门户,人们可以上传代码到C/C++的编程难题。我想使门户安全,以便人们不能通过他们提交的代码进行系统调用。可能有几种解决方法,但我想知道我是否可以简单地通过设置一些聪明的gcc标志来完成。默认情况下libc似乎包含<unistd.h>
,这似乎是声明系统调用的基本文件。有没有一种方法可以告诉gcc/g ++在编译时忽略这个文件,以便在unistd.h中声明的函数都不能被访问?使用gcc/g ++时抑制系统调用
为什么chroot("/var/jail/empty"); setuid(65534);
不够好(假设65534有明显的限制)?
-D
可以覆盖单个函数名称。例如:
gcc file.c -Dchown -Dchdir
或者你可以设置包括守卫自己:
gcc file.c -D_UNISTD_H
但他们的影响可以很容易地#undef
S按智能汇交:)
我明白你的意思 - 我认为马修斯拉特里指出,要走的路是拥有某种沙箱环境 – kyun 2011-03-03 21:21:36
限制访问头收归文件不会阻止你访问libc
函数:如果你链接到libc
,它们仍然可用 - 你只是不会有原型(和宏)的手;但你可以自己复制它们。
而不是链接到libc
也不会帮助:系统调用可以直接通过内联汇编程序(甚至涉及跳入数据的技巧)。
我不认为这是一个很好的方法。在完全自包含的虚拟沙箱中运行上传的代码(可能通过QEMU或类似的东西)可能是更好的方式。
这是真的 - 没有想到这一点。我猜沙盒会成为一种方式,对于这样一个简单的(通常是非恶意的)环境来说似乎有很多开销 – kyun 2011-03-03 21:20:45
如何使用像http://www.citi.umich.edu/u/provos/systrace/? – GWW 2011-03-03 21:00:38
我现在正在做的事情就像systrace - 只是想知道是否更容易绕过那些明显区别于常规库代码的东西(至少在人类的描述中)。 – kyun 2011-03-03 21:17:26