我花了几个小时在ACM ICPC's problem set archive上谦卑自己,我想知道在线法官如何能够编译和运行任何用户的源代码,并防止对他们系统的恶意攻击。
编译后的二进制文件是从某种有限的沙箱中运行的吗?如何建立这种沙箱呢?您会使用什么操作系统?如何启动用户编译后的可执行文件?
发布于 2009-06-18 20:20:04
您可以在Linux chroot监狱中运行它,或者将它链接到一个没有实现任何文件I/O的libc上。
发布于 2010-07-14 23:07:09
这些程序在chrooted监狱中运行,运行时间有限。判断计算机分布在多个服务器上,以帮助防止单点故障或DOS攻击。
我是一个区域竞赛管理员。
发布于 2013-05-26 20:43:56
形成沙箱(假设Linux作为服务器操作系统,这在ACM中很常见)的简单方法是使用(古老的) chroot或一些内核补丁。现在内核中有一些更高级的沙箱技术,例如:
prset调用,将进程能力限制为:退出,读写已经打开的文件。OS将拒绝执行任何其他系统调用,从而有效地将程序与外部世界隔离。而且没有办法将这些功能重新设置回来。(此解决方案可能会破坏一些渐进式语言,如python、perl、ruby等,它们希望在运行time.)一些内核补丁,为在线评委编写的,例如* ejudge.ru有2.6.38.8,3.4.15,3.7.5的补丁;也有一些针对Windows的解决方案。(该网站使用俄语。)我想,这个系统可能会在俄罗斯的一些比赛中使用,对1/4的ACM ICPC不太确定。
一些判断系统使用ptrace()系统调用-换句话说,它们就像被测程序的调试器,判断系统可以控制所有的系统调用,并且可以取消任何系统调用,而不需要将其传递到内核。
还有一些开源的裁判系统,比如https://openjudge.net/ (libsandbox)
https://stackoverflow.com/questions/1014505
复制相似问题