我想知道是否有办法在Linux中的沙箱下运行不受信任的C程序.阻止程序打开文件、网络连接或Forking 、执行等的东西?

这将是一个小程序,一个家庭作业(job),上传到服务器上,并在其上执行单元测试.因此,该计划将是短暂的.

推荐答案

我使用了Systrace个沙箱,以交互方式和自动方式对不受信任的程序进行沙箱处理.它有一个基于ptrace()的后端,允许在Linux系统上使用它而无需特殊权限,还有一个更快、更强大的后端,需要修补内核.

也可以使用chroot(1)在类Unix系统上创建沙箱,尽管这并不容易或安全.Linux ContainersFreeBSD jails是chroot的更好 Select .Linux上的另一个替代方案是使用SELinuxAppArmor这样的安全框架,这就是我建议用于生产系统的安全框架.

如果你告诉我们你到底想做什么,我们将能够为你提供更多帮助.

EDIT:

Systrace适用于您的情况,但我认为基于Linux Security Model的东西,比如AppArmor或SELinux,是一种更标准、更受欢迎的替代品,具体取决于您的发行版.

EDIT 2:

chroot(1)在大多数(所有?)上都可用类似于Unix的系统,它有很多问题:

  • 它可以被打破.如果你打算在你的系统上编译或运行不可信的C程序,你尤其容易受到这个问题的影响.如果你的学生和我的一样,就会有人试图越狱.

  • 您必须创建一个完整的独立文件系统层次 struct ,包含任务所需的所有内容.您不必在chroot中有编译器,但应该包括运行编译程序所需的任何内容.虽然有一些实用程序可以帮助实现这一点,但它仍然不是微不足道的.

  • 你必须维护chroot.因为它是独立的,所以chroot文件不会随发行版一起更新.您必须定期重新创建chroot,或者在其中包含必要的更新工具,这基本上要求它是一个完整的Linux发行版.您还必须保持系统和用户数据(密码、输入文件e.t.c.)与主机系统同步.

  • chroot()只保护文件系统.它不能防止恶意程序打开网络套接字,或防止编写糟糕的程序占用所有可用资源.

资源使用问题在所有备选方案中都很常见.Filesystem quotas将阻止程序填充磁盘.正确的ulimit(C中的setrlimit())设置可以防止内存过度使用和任何Forking 炸弹,以及停止CPU占用.nice(1)可以降低这些程序的优先级,这样计算机就可以毫无问题地用于任何被认为更重要的任务.

Linux相关问答推荐

Bash脚本用于在远程工作后关闭用户会话

如何在带模式的文件频繁更改的管道中使用grep-f带模式的文件?

Ansible-删除两个注释之间的代码块(包括注释本身)

如何在Linux下使用正则表达式更改文件名

如何使用 gdb 调试堆栈分段错误?

c++进程状态中的+是什么意思

sed 根据文件中的条件进行多次替换

如何让 Flutter 用鼠标拖动而不是滚轮滚动? (Linux)

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

使用 bash 在包含模式的 java 文件中查找行,然后替换该行的另一部分

使用 AWS cli 从 AWS 机密管理器解析机密

需要解释 Linux bash 内置 exec 命令行为

如何构建在 Android 上运行的本机(命令行)可执行文件?

如何在 Linux/Unix 上递归复制以abc开头的目录?

KDE 桌面效果中的 OpenGL 和 XRender 有什么区别?

Linux命令删除.git文件夹以外的所有文件?

与交换空间相关的链接器性能?

如何 grep 精确的文字字符串(无正则表达式)

try 使用 sudo 将文件附加到根拥有的文件时权限被拒绝

使用 Bash 脚本查找文件中字符串的行号