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