我想知道是否存在一种方法可以在Linux的沙箱下运行不受信任的C程序。是什么会阻止程序打开文件,网络连接,分叉,执行等?
这将是一个小程序,是一项家庭作业,它被上传到服务器并在其上执行了单元测试。因此该程序将是短暂的。
我已经使用Systrace交互地和以自动方式将不受信任的程序沙箱化。它具有一个ptrace()基于后端的后端,该后端允许在没有特殊特权的情况下在Linux系统上使用它,以及一个更快,更强大的后端,需要修补内核。
ptrace()
也可以使用chroot(1),在类似Unix的系统上创建沙箱,尽管这并不那么容易或安全。Linux容器和FreeBSD监狱是chroot的更好选择。Linux上的另一种选择是使用安全框架,例如SELinux或AppArmor,这是我对生产系统提出的建议。
chroot(1)
如果您告诉您您想做什么,我们将能够为您提供更多帮助。
编辑:
Systrace可以满足您的情况,但是我认为基于Linux安全模型(例如AppArmor或SELinux)的东西是更标准的,因此,根据您的分布情况,它是首选的替代方法。
编辑2:
虽然chroot(1)在大多数(所有?)类Unix系统上都可用,但是它有很多问题:
它可以被打破。如果要在系统上实际编译或运行不受信任的C程序,则特别容易受到此问题的影响。而且,如果您的学生像我的一样,那么有人会试图越狱。
您必须使用任务所需的所有内容创建一个完全独立的文件系统层次结构。您不必在chroot中具有编译器,但是应该包括运行已编译程序所需的任何内容。尽管有实用程序可以帮助解决此问题,但它仍然不是一件容易的事。
您必须维护chroot。由于它是独立的,因此chroot文件不会随您的发行版一起更新。您将不得不定期重新创建chroot,或在其中包含必要的更新工具,这实际上将要求它是成熟的Linux发行版。您还必须使系统和用户数据(密码,输入文件等)与主机系统保持同步。
chroot()仅保护文件系统。它不能防止恶意程序打开网络套接字,也不能阻止编写错误的程序占用所有可用资源。
chroot()
资源使用问题在所有替代方案中都很常见。文件系统配额将阻止程序填充磁盘。适当的ulimit(setrlimit()C语言)设置可以防止内存过度使用和任何fork炸弹,并阻止CPU的浪费。nice(1)可以降低这些程序的优先级,以便计算机可以毫无问题地用于被认为更重要的任何任务。
ulimit
setrlimit()
nice(1)