我花了几个多小时在ACM ICPC的问题集存档上羞辱自己,我想知道在线评判如何能够编译和运行任何用户的源代码并防止对他们的系统进行恶意攻击.
编译的二进制文件是从某种有限的沙箱运行的吗?如何建立这种沙箱?你会用什么操作系统?您将如何启动用户的已编译可执行文件?
您可以在Linux chroot jail中运行它,或者将它链接到不实现任何文件I/O的libc.
形成沙箱的简单方法(假设 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)
| 归档时间: |
|
| 查看次数: |
1496 次 |
| 最近记录: |