ACM ICPC在线评判如何防止恶意攻击?

时间:2009-06-18 18:49:54

标签: security

我花了几个多小时在ACM ICPC's problem set archive上羞辱自己,我想知道在线评委如何能够编译和运行来自任何用户的源代码,并防止对他们的系统进行恶意攻击。

编译后的二进制文件是否从某种有限的沙箱运行?如何建立这种沙箱?你会用什么操作系统?您将如何启动用户的已编译可执行文件?

4 个答案:

答案 0 :(得分:7)

您可以在Linux chroot jail中运行它,或者将它链接到不实现任何文件I / O的libc。

答案 1 :(得分:6)

程序在一个有限运行时间的chrooted监狱中运行。判断计算机分布在多个服务器上,以帮助防止单点故障或DOS攻击。

我是区域竞赛管理员。

答案 2 :(得分:4)

形成沙箱的简单方法(假设Linux作为服务器操作系统,这是ACM常见的)使用(古老)chroot或一些内核补丁。现在内核中有一些更先进的沙盒技术,例如:

  • seccomp - Linux 2.6.12+ - 进程可以使用特殊的prset调用来询问操作系统,以限制进程功能:退出,读取和写入已打开的文件。操作系统将拒绝进行任何其他系统调用,有效地将程序与外部世界隔离开来。并且无法重置这些功能。 (这个解决方案可能会破坏一些渐进式语言,如python,perl,ruby等,它们希望在运行时加载一些插件。)

  • 名称空间隔离 - cgroups。 chroot是一个只改变(隔离)文件系统名称空间的程序,还有其他名称空间,例如网络或过程。使用cgroups,我们可以仅使用chroot来限制更多。

为在线评委撰写的一些内核补丁,例如: * ejudge.ru的补丁为2.6.38.8,3.4.15,3.7.5;以及Windows的一些解决方案。 (该网站用俄语。)我认为,这个系统可能会在俄罗斯的一些比赛中使用,不确定1/4 ACM ICPC。

一些判断系统使用ptrace()系统调用 - 换句话说,它们就像测试程序的调试器一样,并且判断可以控制所有系统调用,并且可以在不将其传递到内核的情况下取消任何系统调用。

还有开源判断系统,例如https://openjudge.net/(libsandbox)

答案 3 :(得分:0)

我认为他们没有运行任何代码。有时会出现此错误“受限功能”,例如当您尝试读取或写入文件“ofstream”& c ++中的“ifstream”