在线判断的安全问题

时间:2011-03-16 16:02:39

标签: c++ c linux operating-system

我参与了在Linux机器(Ubuntu)上支持C / C ++(如SPOJ,UVA等)的在线编程判断。代码本身是用C ++编写的。我必须防止服务器恶意代码 我打算分2步实施安全措施 1.通过在具有受限环境的文件夹中对chroot系统调用执行代码进行监禁(沙箱)。我遇到了一个实用程序Jailkit,但我认为单独的系统调用就足以完成我的工作,因为我不必监禁用户,只监听执行代码。为了在文件夹中创建运行时环境,我复制了以下文件以及用于创建受限shell的文件(仅允许内置shell)

$ ldd ./a.out
linux-gate.so.1 => (0x00f4c000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x007a5000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00b80000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00e0c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00f7c000)

其中a.out是可执行的c ++文件。

遇到的问题:
i)我已经尝试过几个在监狱里运行良好的程序。但任何人都可以确认这些文件对于所有算法密集型代码都是足够的,即不需要明确处理任何系统调用 ii)如果任何人都可以通过将提供给jail文件夹的运行时库限制为fork(),socket()等而不是代码所期望的那样来建议限制某些系统调用的方法。 iii)为了便于了解,我还复制了ldd /usr/bin/gcc和/ usr / bin / gcc所显示的文件。但我无法在监狱中使用gcc而错误 bash-4.1# /usr/bin/gcc try.c gcc: error trying to exec 'cc1': execvp: No such file or directory
我该如何解决?

2.通过ptrace的帮助跟踪系统调用,如果它使用了一些可疑的系统调用,则杀死正在运行的代码。现在的问题是应该禁止哪些系统调用?我觉得限制 fork(),vfork()和execve()将会完成工作,因为每个程序都有一个时间限制(几乎不超过10秒)。之后它将自动被杀死,除了fork(),vfork()之外没有其他方法可以创建另一个进程。但是既然我的想法受到了我的想象力的束缚,那么如果有人有其他意见来弯曲这里的事情,那就太棒了。


所以基本上我担心i)和ii)指出“遇到的问题”,并且如果有人在第二点指出限制后可以想到一种破解的方式。

3 个答案:

答案 0 :(得分:4)

运行此类内容的最大安全风险是可以在端口25上建立传出网络连接。有人会发现您的服务,数千美元的垃圾邮件,并且您将被主机禁止。另外,你会让你的托管服务提供商/ isp上的其他人讨厌让你在每个过度热心的反垃圾邮件男爵数据库中将整个ip块列入黑名单。

幸运的是,iptables可以根据创建它们的进程的uid阻止本地发起的数据包。这可能是保护自己免受垃圾邮件发送者帮助的最不突兀的方式,但如果该框不需要进行合法的传出连接,您可能只使用限制性更强的防火墙。

另请注意,现在,传出的http和https连接对于垃圾邮件(留言板,受损的Twitter和FB帐户等)可能与smtp一样有用,所以你可能真的想要做一些更重的阻塞或只是完全阻止网络访问。

答案 1 :(得分:4)

您可能希望查看此项目:面向在线评判的沙箱库。 http://sourceforge.net/projects/libsandbox/

答案 2 :(得分:1)

为什么要在jail中调用编译器?它可以调用cc1之类的外部程序。只调用已检查的程序是可以的。您可以查看与您指定的用途相同的patch

计算密集型代码可以在程序检测到fork()并禁止它之前做很多事情,例如,创建一个fork炸弹。