在Linux的沙箱中运行不受信任的C程序,以防止其打开文件,派生等

如何解决在Linux的沙箱中运行不受信任的C程序,以防止其打开文件,派生等

我已经使用Systrace交互地和以自动方式将不受信任的程序沙箱化。它具有一个ptrace()基于后端的后端,该后端允许在没有特殊特权的情况下在Linux系统上使用它,以及一个更快,更强大的后端,需要修补内核。

也可以使用chroot(1),在类似Unix的系统上创建沙箱,尽管这并不那么容易或安全。Linux容器FreeBSD监狱是chroot的更好选择。Linux上的另一种选择是使用安全框架,例如SELinuxAppArmor,这是我对生产系统提出的建议。

如果您告诉您您想做什么,我们将能够为您提供更多帮助。

Systrace可以满足您的情况,但是我认为基于Linux安全模型(例如AppArmor或SELinux)的东西是更标准的,因此,根据您的分布情况,它是首选的替代方法。

虽然chroot(1)在大多数(所有?)类Unix系统上都可用,但是它有很多问题:

  • 它可以被打破。如果要在系统上实际编译或运行不受信任的C程序,则特别容易受到此问题的影响。而且,如果您的学生像我的一样,那么有人会试图越狱。

  • 您必须使用任务所需的所有内容创建一个完全独立的文件系统层次结构。您不必在chroot中具有编译器,但是应该包括运行已编译程序所需的任何内容。尽管有实用程序可以帮助解决此问题,但它仍然不是一件容易的事。

  • 您必须维护chroot。由于它是独立的,因此chroot文件不会随您的发行版一起更新。您将不得不定期重新创建chroot,或在其中包含必要的更新工具,这实际上将要求它是成熟的Linux发行版。您还必须使系统和用户数据(密码,输入文件等)与主机系统保持同步。

  • chroot()仅保护文件系统。它不能防止恶意程序打开网络套接字,也不能阻止编写错误的程序占用所有可用资源。

资源使用问题在所有替代方案中都很常见。文件系统配额将阻止程序填充磁盘。适当的ulimitsetrlimit()C语言)设置可以防止内存过度使用和任何fork炸弹,并阻止CPU的浪费。nice(1)可以降低这些程序的优先级,以便计算机可以毫无问题地用于被认为更重要的任何任务。

解决方法

我想知道是否存在一种方法可以在Linux的沙箱下运行不受信任的C程序。是什么会阻止程序打开文件,网络连接,分叉,执行等?

这将是一个小程序,是一项家庭作业,它被上传到服务器并在其上执行了单元测试。因此该程序将是短暂的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?