在Linux上执行可能有害的程序


33

我正在写一个程序来测试学生编写的程序。恐怕我不能信任他们,我需要确保它不会因运行它的计算机而严重损坏。

我当时正在考虑让一些崩溃测试用户只能有限地访问系统资源并以该用户身份运行程序,但是从到目前为止在网上发现的情况来看,制作虚拟系统将是最安全的选择...

有人可以帮助我选择正确的方法吗?安全是我最大的担忧。另一方面,我不想要一个过分的解决方案,并且浪费大量时间尝试学习我真正不需要的东西。


7
只需在浏览器(bellard.org/jslinux)中的linux中运行该程序。这是一个非常好的沙箱。:)
Fixee 2011年

哇,那真的很有趣!但是我必须编写某种类型的接口才能使用它(因为整个过程将是自动的)...我需要将其签出。如果事实证明该Javascript Linux不仅仅是小工具,我什至可以使用它。
korda 2011年

我确实想把我的评论当作一个玩笑,但是如果您真的可以使用它,那就太好了。老实说,LiveCD答案(带有RAMdisk)是一个很好的解决方案。
Fixee 2011年

好吧,如果我设法使用它,我也会在可以访问结果的网页上使用它-这将是非常不错的。另外,极客因素也很重要;)也不能选择使用实时磁盘-正如我说的那样,我正在使程序可以在某些服务器上运行,因此重启不是我负担得起的……我想我还是会坚持使用虚拟机。 ..
korda 2011年

Answers:


28
  • 虚拟机无需重启即可提供最高的安全性,但性能却最低。

  • 另一种选择是,提供比虚拟机更高的安全性:不访问硬盘驱动器的情况下引导“活动” CD / DVD / pendrive(暂时禁用BIOS中的HDD;如果不能,至少不要挂载驱动器/如果自动安装,则将其卸载-但是安全性要低得多)

  • 搬运工容器是有点不太安全的替代整个虚拟机。两者之间的关键区别(就安全性而言)可能是,在docker中运行的系统实际上使用了主机系统的内核。

  • 有些程序(如隔离程序)会创建一个特殊的安全环境-通常被称为沙箱 -这些程序通常基于chroot,需要额外的监督-可以找到适合您的程序。

  • 一个简单的chroot可能最不安全(特别是在执行程序方面),尽管可能更快一些,但是 ……您将需要构建/复制一个完整的单独的根树并为诸如此类使用绑定挂载/dev(请参见注释)。 1以下!)。因此,通常不建议使用这种方法,特别是如果您可以使用更安全且通常更易于设置的sandbox环境。

注0:对于“特殊用户”而言,就像nobody帐户一样:这几乎没有提供任何安全性,甚至没有提供任何安全性chroot。一个nobody用户仍然可以访问文件和程序已经阅读执行了设置权限。您可以使用进行测试su -s /bin/sh -c 'some command' nobody。而且,如果您有任何人都可以访问的配置/历史记录/缓存文件(由于错误或较小的安全漏洞),则具有nobody的权限运行的程序可以访问该文件,可以使用grep获取机密数据(例如“ pass =“等),也可以有很多方法可以通过网络或其他方式发送。

注意1:正如Gilles在下面的评论中所指出的那样,简单的chroot环境对于针对旨在特权升级的漏洞利用的安全性很小。鞋底的chroot有道理安全的角度来看,只有当环境是最小的,由安全确认程序(但仍然存在利用潜在内核级漏洞的风险),以及所有在chroot运行不受信任的程序正在运行作为不在chroot之外运行任何进程的用户。chroot所阻止的(具有此处提到的限制)是没有特权升级的直接系统渗透。但是,正如Gilles在另一条评论中指出的那样,甚至可能会绕过该级别的安全性,从而允许程序脱离chroot。


感谢您的回答。当我谈到这样的事情时,我真是个新手,你能解释一下我的事情:为什么我需要防止程序读取系统中的文件(例如chroot)?(如果程序无法修改它们)。
korda

一个碰撞测试的用户帐户为您提供了一些基本的安全性是肯定的。仍然有很多您可能需要/需要防止的事情。这些可能是利用程序中嵌入的常见漏洞的形式,或者是为了将来进行远程攻击而进行的一些社会黑客入侵,信息收集……甚至可能更多。
rozcietrzewiacz

我们为什么如此:有没有一种方法可以防止用户使用互联网连接?
korda 2011年

1
我想知道是否nobody可以上网。
korda 2011年

1
@rozcietrzewiacz chroot提供任何保护的一项重要要求是,不要以同时在chroot外部运行程序的用户身份运行chroot程序。否则,chroot进程可以ptrace一个非chroot进程并以这种方式执行任何操作。
吉尔(Gilles)'所以

10

使用虚拟机。任何少的东西都不能提供太多的安全性。

几年前,我可能曾建议使用chroot专用用户或类似的用户。但是硬件变得更加强大,虚拟机软件变得更加易于使用。此外,现成的攻击变得更加复杂。不再有任何理由不全盘考虑。

我建议运行VirtualBox。您可以在几分钟内设置虚拟机,然后在其中安装Linux发行版。我推荐的唯一非默认设置是网络设置:创建一个“ NAT”接口(与世界进行通信)和一个“仅主机”接口(这样您就可以轻松地与主机进行文件复制和ssh到) VM)。在运行学生程序时禁用NAT接口¹;仅在安装或升级软件包时启用它。

在虚拟机内部,为每个学生创建一个用户。

¹ 您可以将NAT接口限制为用户白名单,但这比简单的点对点设置所需的功能要先进。


2

这是一个非常彻底的解释,说明为什么使用Chroot仍然是一个非常可行的选择,以及为什么在特定情况下完全使用操作系统或完全硬件虚拟化会显得过大。

Chroot不是安全功能只是一个神话。有一些工具可以自动为您构建chroot文件系统,而Chroot作为有目的的安全功能已内置于许多主流应用程序中。

与普遍看法相反,并非每种情况都需要对操作系统进行完全虚拟化或对硬件进行完全模拟。这实际上意味着要尝试覆盖更多的攻击面。反过来,这意味着安全性较低的系统。(据称是针对知识较少的系统管理员)

规则很简单:不要在chroot中放入不必要的任何东西。不要以root用户身份运行守护程序。不要像在chroot之外运行守护程序的任何用户一样运行守护程序。

删除所有不安全的应用程序,setuid二进制文件,悬挂的无主符号链接/硬链接。使用nosuid,noexec和nodev重新安装不必要的文件夹。从源代码构建运行的守护程序的最新稳定版本。最重要的是,确保基本系统安全!


2

在问题得到正式回答之后,我将添加此内容:MAGIC:电路/核心中的恶意老化,不幸的是,它被锁在ACM的付费专线后面。本文的目的是当今使用的电路中很小的宽度走线会在使用过程中老化,并最终失效。通过找到正确的指令并一遍又一遍地重复,攻击者可以迅速使IC老化,使其失效。

VM,沙箱,容器或chroot监狱都无法阻止这种恶意破坏硬件。该论文的作者发现了这样的指令序列,并在实验上老化了硬件使其失效,但是他们没有放弃指令,因此暂时不会成为真正的威胁。


1

在BSD派生的UNIX(包括Mac OS X)上,有一个名为的功能sandbox。手册说

描述
沙盒功能允许应用程序自愿限制其操作系统资源的访问。该安全机制旨在限制在利用漏洞的情况下可能造成的损害。它不能替代其他操作系统访问控制。

这与chroot也可以使用的设施分开。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.