在线判断的安全问题

Ter*_*nal 11 c c++ linux operating-system

我参与了在Linux机器(Ubuntu)上支持C/C++(如SPOJ,UVA等)的在线编程判断.代码本身是用C++编写的.我必须防止服务器恶意代码.
我打算分两步实现安全性.
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)指出"遇到的问题",并且如果有人能够想到在限制指向第二点之后的黑客入侵方式.

R..*_*R.. 4

运行此类程序的最大安全风险是可能在端口 25 上建立传出网络连接。有人会找到您的服务,发送数千美元的垃圾邮件,然后您将被主机禁止。另外,您会让您的托管提供商/ISP 上的其他人讨厌您,因为您将整个 IP 块列入了每个过分热心的反垃圾邮件大亨的数据库中的黑名单。

幸运的是,iptables可以根据创建本地数据包的进程的 uid 来阻止这些数据包。这可能是保护自己免遭垃圾邮件发送者帮助的最不显眼的方法,但如果盒子不需要建立合法的传出连接,您可能只使用限制性更强的防火墙。

另请注意,如今,传出的 http 和 https 连接对于垃圾邮件发送(留言板、受损的 Twitter 和 FB 帐户等)可能与 smtp 一样有用,因此您可能确实想要进行一些更严格的阻止或只是阻止网络访问完全。