我的大学局域网中有一个门户网站,人们可以将代码上传到C / C ++编程难题中。我想使门户网站安全,以便人们无法通过提交的代码进行系统调用。可能有几种解决方法,但我想知道我是否可以通过设置一些聪明的gcc标志来做到这一点。默认情况下,libc似乎包含<unistd.h>
,它似乎是声明系统调用的基本文件。有没有办法告诉gcc / g ++在编译时'忽略'这个文件,这样unistd.h中声明的所有函数都不能被访问?
答案 0 :(得分:3)
限制对标题文件的访问不会阻止您访问libc
函数:如果您链接到libc
,它们仍然可用 - 您只是没有原型(和宏)交出但你可以自己复制它们。
并且不与libc
链接也无济于事:系统调用可以通过内联汇编程序直接进行(甚至是涉及跳转到数据的技巧)。
我认为这不是一般的好方法。在完全独立的虚拟沙箱中运行上传的代码(通过QEMU或类似的东西)可能是更好的方法。
答案 1 :(得分:3)
chroot("/var/jail/empty"); setuid(65534);
不够好的一些特殊原因(假设65534有明显的限制)?
答案 2 :(得分:2)
-D
可以覆盖单个函数名称。例如:
gcc file.c -Dchown -Dchdir
或者你可以自己设置包含守卫:
gcc file.c -D_UNISTD_H
然而,智能提交者可以使用#undef
轻松恢复其效果:)