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

kor*_*rda 35 linux security executable

我正在编写一个程序来测试学生编写的程序。恐怕我不能相信他们,我需要确保它不会对运行它的计算机造成严重影响。

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

有人可以帮助我选择正确的方法吗?安全对我来说是一个大问题。另一方面,我不想要一个矫枉过正的解决方案,并且浪费很多时间来学习我并不真正需要的东西。

roz*_*acz 30

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

  • 另一种选择,甚至比虚拟机的安全性更高:不访问硬盘的情况下启动“实时”CD/DVD/pendrive(在 BIOS 中暂时禁用硬盘;如果不能,至少不要挂载驱动器/卸载它,如果自动安装 - 但这不太安全)

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

  • 有诸如isolate之类的程序可以创建一个特殊的、安全的环境——这通常被称为沙箱——那些通常是基于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 确实防止(这里提到的限制)是直接系统渗透,而无需提权。然而,正如吉尔斯在另一条评论中指出的那样,甚至可能会绕过该级别的安全性,从而允许程序脱离 chroot。


Gil*_*il' 11

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

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

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

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

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