当前位置: 首页 > 面试题库 >

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

微生烨然
2023-03-14
问题内容

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

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


问题答案:

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

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

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

编辑:

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

编辑2:

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我想创建一个Web应用程序,该应用程序将允许用户上传一些C代码,并查看其执行结果(该代码将在服务器上编译)。用户不受信任,这显然会带来巨大的安全隐患。 因此,我需要为应用创建某种沙箱。在最基本的级别上,我想将对文件系统的访问限制在某些指定的目录中。我无法直接使用chroot jails,因为Web应用程序未以特权用户身份运行。我想设置监狱的suid可执行文件是一个选择。 上载的程序会很

  • 我一直遇到一个问题,当我点击按钮,应该重定向到贝宝,它打开我的文档。它以前是运行的,但当我把代码转移到另一台电脑上时,错误发生了。救命啊! 我真的不明白有什么问题

  • [注意:这与如何从Java程序启动完全独立的进程有关?但不同] 我希望能够从一个“管理器”Java进程中派生出外部进程(shell脚本),当JVM被杀死时,该进程应该继续运行——但当我杀死父Java程序时,子Java程序似乎也被杀死(注意,如果JVM自然退出,行为会有所不同)。我拥有的最简单的测试程序是: 和外部脚本: 作为 java-带有依赖项的类路径jar。罐子温度。执行官。快跑快跑。嘘 如果

  • 问题内容: 防止Linux程序/守护程序在给定时间多次执行的最佳方法是什么? 问题答案: 最常见的方法是创建PID文件:定义文件将要到达的位置(在/ var / run内部很常见)。成功启动后,您会将PID写入此文件。在决定是否启动时,请阅读文件并检查以确保所引用的进程不存在(或者如果存在,则它不是守护程序的实例:在Linux上,您可以查看)。关机时,您可以删除文件,但这不是绝对必要的。 有一些脚

  • 问题 在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。 方法 使用jsoup HTMLCleaner 方法进行清除,但需要指定一个可配置的Whitelist。 String unsafe = "<

  • 问题内容: 我想打印文件的内容,但是所有以#开头的行都想忽略。我正在尝试使用grep和awk进行操作,但是它一直在打印整个文件,或者只是打印以#开头的行。我可以以正确的方式推动我,也可以使用grep / awk命令在不以#开头的文件中打印任意行。 问题答案: 使用选项可以否定条件: