我在大学局域网上有一个门户网站,人们可以在其中上传C/C++编程谜题的代码。我希望使门户网站更加安全,防止人们通过所提交的代码进行系统调用。可能会有几种解决方法,但我想知道是否可以通过设置一些聪明的gcc标志来简单地完成这个任务。libc默认包含,这似乎是声明系统调用的基本文件。是否有一种方法可以告诉gcc/g++在编译时“忽略”这个文件,以便无法访问unistd.h中声明的任何函数?
限制访问头文件并不能阻止您访问libc
函数:如果链接了libc
,它们仍然可用 - 只是您没有原型(和宏)可以使用;但您可以自己复制它们。
而不链接libc
也无济于事:系统调用可以直接通过内联汇编(甚至涉及跳转到数据的技巧)进行。
总体而言,我认为这不是一个好方法。在完全独立的虚拟沙盒中运行上传的代码(例如通过QEMU或类似工具)可能是更好的选择。
为什么chroot("/var/jail/empty"); setuid(65534);
不够好(假设65534有合理的限制)?
是否有特殊原因呢?
-D
可以覆盖单个函数名称。例如:
gcc file.c -Dchown -Dchdir
或者您可以自己设置包含保护:
gcc file.c -D_UNISTD_H
#undef
轻松地撤消它们的影响。