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

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

我正在编写一个程序来测试学生编写的程序。我担心我不能相信他们,我需要确保它不会对运行它的计算机造成糟糕的结果。

我正在考虑让一些崩溃测试用户对系统资源的访问受到限制,并以该用户的身份运行程序,但从我迄今为止在网上发现的情况来看,创建虚拟系统将是最安全的选择......

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

答案1

  • 虚拟机可以为您提供最高的安全性而无需重新启动,但性能却最低。

  • 另一种选择,比虚拟机具有更高的安全性:启动“实时”CD/DVD/随身碟无法访问硬盘驱动器(在 BIOS 中暂时禁用 HDD;如果不能,至少不要安装驱动器/卸载它,如果自动安装的话 - 但这不太安全)

  • A泊坞窗容器是完整虚拟机的安全替代方案。也许这两者之间的关键区别(在安全性方面)是在 docker 中运行的系统实际上使用主机系统的内核。

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

  • 一个简单的chroot将是最不安全的(特别是在执行程序方面),尽管可能更快一点,...您需要构建/复制整个单独的根树并使用绑定安装/dev等(请参阅注1以下!)。因此,一般来说,不建议使用这种方法,特别是如果您可以使用更安全且通常更易于设置的sandbox环境。

注0:对于“特殊用户”的方面,例如帐户nobody:这给出了几乎没有安全性,甚至比简单的chroot.用户nobody仍然可以访问具有以下权限的文件和程序:执行权限设置为其他。您可以使用 来测试它su -s /bin/sh -c 'some command' nobody。如果您有任何人都可以访问的配置/历史/缓存文件(由于错误或较小的安全漏洞),则以 的权限运行的程序nobody可以访问它, grep 获取机密数据(如“pass=”等)并在有很多方法通过网络或其他方式发送它。

注1:正如吉尔斯指出的那样下面有评论,简单的 chroot 环境对于针对特权升级的攻击提供的安全性非常低。从安全角度来看,单独的 chroot 是有意义的,除非环境很小,由安全确认的程序组成仅有的(但仍然存在利用潜在内核级漏洞的风险),并且在 chroot 中运行的所有不受信任的程序都以不在 chroot 之外运行任何进程的用户身份运行。 chroot 所防止的(通过此处提到的限制)是无需权限升级的直接系统渗透。然而,正如吉尔斯在另一条评论,即使是这种安全级别也可能会被绕过,从而允许程序突破 chroot。

答案2

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

几年前,我可能会建议使用 chroot 专用用户或类似的用户。但硬件变得更加强大,虚拟机软件也变得更容易使用。此外,现成的攻击变得更加复杂。再也没有理由不一路走到底了。

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

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

1 您可以将 NAT 接口限制为用户白名单,但这比您在简单、直接的设置中需要的更高级。

答案3

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

虚拟机、沙箱、容器或 chroot 监狱都无法阻止这种对硬件的恶意破坏。该论文的作者发现了这样的指令序列,并通过实验使硬件老化到故障,但他们没有泄露这些指令,因此它可能暂时不会成为真正的威胁。

答案4

这是一个非常详尽的解释为什么使用 Chroot 仍然是一个非常可行的选择,以及为什么完整操作系统或完整硬件虚拟化在特定场景下尤其过大。

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

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

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

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

相关内容