在Linux中沙盒

我想创build一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译)。 用户不信任,这显然有一些巨大的安全隐患。

所以我需要为应用程序创build一些沙箱。 在最基本的层面上,我想限制对某些指定目录的文件系统的访问。 我不能直接使用chroot jail,因为web应用程序没有作为特权用户运行。 我想一个设置监狱suid可执行文件将是一个选项。

上传的程序会比较小,所以应该快速执行(最多几秒钟)。 因此,我可以在预设超时后终止进程,但是如何确保它不会产生新进程? 或者如果我不能,杀死整个pgid一个可靠的方法?

什么是最好的方式去做这件事 – 除了“不要做这件事”? :)还有什么其他明显的安全问题,我错过了?

FWIW,networking应用程序将用Python编写。

Solutions Collecting From Web of "在Linux中沙盒"

随着其他sugestions你可能会发现这个有用的。

http://www.eelis.net/geordi/

这是从http://codepad.org/about,codepad.org的关于页面。

你提供的一些细节意味着你对服务器本身有管理控制权,所以我的建议做出了这个假设。

我将把它作为一个批处理系统来解决。 Web服务器接受源文件的上传,进程轮询提交目录,处理文件,然后将结果提交给Web应用程序轮询的另一个目录,直到找到结果并显示为止。

有趣的部分是如何安全地处理执行。

我选择的操作系统是FreeBSD,所以我建立了一个预先配置好的jail(不要和vanilla chroot jail混淆),它会编译,运行和保存输出。 然后,为每个源文件提交,为每个执行启动一个原始的监狱拷贝,里面有一个源文件的副本。

如果监狱的/ dev被削减到几乎没有,系统资源限制安全设置,并且交通不能走出监狱(绑定到untroutable地址或只是防火墙),我个人会舒服地运行这个一个服务器在我的照顾下。

既然你使用Linux,我会研究用户模式Linux或Linux-Vserver,它们在概念上与FreeBSD jails非常相似(我从来没有用过它们,但是已经阅读过它们)。 这里列出了其他几个这样的系统。

这种方法比香草chroot监狱更安全,而且比使用完全虚拟化(如qemu / kvm或VMware)轻得多。

我不是程序员,所以我不会用什么样的AJAX-Y来轮询结果,但是我确信它可以完成。 作为管理员,我会发现这是一个有趣的项目,分享。玩得开心。 🙂

我会说这在很多层面上是非常危险的。 你基本上打开自己的系统上可以找到的任何利用(而你通常限于人们可以远程利用的)。 如果可以避免的话,我会说不要这样做。

如果你想这样做,你可能需要使用某种虚拟机来运行用户的代码。 使用类似KVM的东西,可以使用相同的基本映像来设置许多虚拟机(甚至可以将快照存储在已经启动的状态,尽管我不知道如何处理被克隆)。 然后,您可以按需创建虚拟机,运行用户代码,返回结果,然后关闭虚拟机。 如果让虚拟机与网络互相隔离,用户可能会造成任何他们想要的破坏,而且不会损害物理服务器。 在这种情况下,你唯一的危险就是某些漏洞,让他们逃离虚拟机……这些是非常罕见的,随着硬件虚拟化技术的提高,这种攻击将更加罕见。

虽然它仍处于开发阶段,但尚未被认为是安全的,您可以查看Google Native Client背后的技术。 它旨在允许不可信的本机代码在Web浏览器中运行,但可能适用于Web服务器。 为了获得额外的安全性,您可以在其他技术(如虚拟机)之上使用类似的东西。

在Fedora 11中 ,有一个SELinux Sandbox ,它似乎正是你想要的(除了可能限制产生新的进程;链接的博客文章没有提到这一点)。

当然,总会有内核bug的风险; 即使在SELinux中,内核的一部分仍然暴露在所有进程中。

请参阅Google Chrome浏览器针对Linux的沙箱方法 。 正如你所看到的,有很多方法,但是它们都不适合像Chrome这样的可分发应用程序,因为有些发行版可能不包含它们。 这对于Web应用程序来说并不是一个问题,因为您可以控制在您的服务器上安装的内容。

就我个人而言,我最喜欢的是Seccomp ,因为与其他工具(如每个系统调用的交换机地址空间)或KVM(大内存饥饿的虚拟机)相比,它的开销非常低,与SELinux等工具相比,它非常简单因此更可能是安全的)。

我猜libsandbox服务于你的目的。 它的核心库是为C / C ++编写的,但它也有Python程序的封装。 它提供了一些选项来定制哪些系统调用可以被允许,可以使用多少内存,客户程序可以运行多久,等等。它已经被一些在线评审人员(如HOJ)使用 。

有一个名为strace的工具 – 它监视给定进程的系统调用。 您只需要注意建议“非法”功能访问的具体电话。 AFAIK,这是在沙盘选手节目编程竞赛中使用的方法。

我认为你的解决方案必须专注于分析源代码。 我不知道任何工具,我认为这对于C来说是相当困难的,但是,例如,一个不包含任何模块的Pascal程序在我看来是无害的。

在KVM或qemu下产生一个新的虚拟机来编译和运行代码看起来像是要走的路。 在jail / LXC下运行代码可以危害机器,如果它利用OS的不安全的部分,如网络代码。 在虚拟机下运行的好处是显而易见的。 人只能攻击虚拟机,而不是机器本身。 但副作用是你需要大量的资源(CPU和内存)为每个请求产生一个虚拟机。

可以像http://www.cs.vu.nl/~rutger/publications/jailer.pdf,www.cs.vu.nl/~guido中描述的那样使用基于ptrace的不可信程序的限制/mansion/publications/ps/secrypt07.pdf

他们有一个改变根源的政策规则,CHRDIR,其效果类似于chroot。 (“监狱政策”一节)

但是,他们可能没有发布他们的源代码(部分基于修改后的strace http://www.liacs.nl/~wichert/strace/ – “实施”部分)…

另请参阅其他基于ptrace的chroot-in-userpace方法: https ://unix.stackexchange.com/a/72697/4319

关于你唯一的机会是运行一个虚拟机,那些可能有漏洞。 如果你想在短期内破解你的机器,只需使用权限,然后让一个特殊的用户访问一个目录即可。 如果你想在将来的某个时候推迟黑客行为,那么在虚拟机里面运行一个web服务器,然后向前端口转发。 你会想保留一个备份,因为你可能会在一小时内被黑客攻击,并希望每隔几个小时重新启动一个新的副本。 为了克服每周的黑客攻击,你还需要保留整台机器的图像,以便每周重新映像一次。 不要让机器与网络上的其他机器通话。 黑名单无处不在。 我正在谈论虚拟机和物理机器IP地址。 对网络上其他机器上的任何其他机器执行常规安全审计。 请重命名机器IHaveBeenHacked1和IHaveBeenHacked2,并阻止访问您的主机列表和防火墙。

这样你可以避开一段时间的黑客行为。