16

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

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

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

除了“根本不这样做”之外,最好的解决方法是什么?:) 我错过了哪些其他明显的安全问题?

FWIW,网络应用程序将用 Python 编写。

4

12 回答 12

5

与其他建议一起,您可能会发现这很有用。

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

这是来自http://codepad.org/aboutcodepad.org的关于页面。

于 2009-06-19T22:12:13.583 回答
4

您提供的一些细节暗示您对服务器本身具有管理控制权,所以我的建议是做出这个假设。

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

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

我选择的操作系统是 FreeBSD,所以我设置了一个预配置的监狱(不要与普通的 chroot 监狱混淆),它可以编译、运行和保存输出。然后,对于每个源文件提交,为每次执行启动一个原始的 jail 副本,其中包含源文件的副本。

如果监狱的 /dev 被修剪到几乎没有,系统资源限制被安全设置,并且流量不能路由出监狱(绑定到不可路由的地址或只是防火墙),我个人会很乐意在上面运行我照顾的服务器。

由于您使用 Linux,我将研究用户模式 ​​Linux 或 Linux-VServer,它们在概念上与 FreeBSD 监狱非常相似(我自己从未使用过它们,但已经阅读过它们)。这里列出了其他几个这样的系统。

这种方法比普通的 chroot 监狱要安全得多,而且比使用 qemu/kvm 或 VMware 等完全虚拟化要轻得多。

我不是程序员,所以我不知道你可以使用什么样的 AJAX-y 东西来轮询结果,但我相信它可以完成。作为管理员,我会发现这是一个有趣的项目。玩得开心。:)

于 2009-06-19T21:24:28.407 回答
3

我想说这在很多层面上都非常危险。您实际上是在向您的系统上可以找到的任何漏洞利用敞开心扉(而您通常仅限于人们可以远程利用的漏洞)。如果可以避免,我会说不要这样做。

如果您确实想这样做,您可能需要使用某种虚拟机来运行用户的代码。使用KVM之类的东西,可以使用相同的基本映像设置多个虚拟机(您甚至可以将快照存储在已启动的状态,尽管我不确定它将如何处理被克隆)。然后,您可以按需创建 VM,运行用户的代码,返回结果,然后终止 VM。如果您将虚拟机彼此隔离并与网络隔离,则用户可以造成他们想要的任何破坏,并且不会损害您的物理服务器。在这些情况下,您面临的唯一危险是某种允许它们从 VM 中逃脱的漏洞……这些极为罕见,并且随着硬件虚拟化的改进将更加罕见。

于 2009-06-19T19:40:48.490 回答
3

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

于 2009-06-19T21:00:31.980 回答
2

Fedora 11上,有一个SELinux 沙盒,它似乎完全可以满足您的需求(除了可能限制生成新进程;链接的博客文章没有提到这一点)。

当然,总是存在内核错误的风险;即使使用 SELinux,部分内核仍然暴露给所有进程。

于 2009-06-19T21:01:57.267 回答
2

请参阅此页面,了解 Google Chrome 的 Linux 沙盒方法。正如你所看到的,有很多方法,但它们都不适用于像 Chrome 这样的可分发应用程序,因为某些发行版可能不包含它们。不过,这对于 Web 应用程序来说并不是真正的问题,因为您可以控制服务器上安装的内容。

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

于 2009-06-19T22:17:47.893 回答
2

我猜libsandbox符合您的目的。它的核心库是为 C/C++ 编写的,但它也有一个 Python 程序的包装器。它提供了选项来自定义可以允许哪些系统调用、可以使用多少内存、可以运行来宾程序多长时间等。它已经在一些在线评委中使用,例如HOJ

于 2013-07-25T20:26:19.683 回答
1

有一个名为strace的工具——它监视给定进程的系统调用。您只需要注意暗示“非法”功能访问的特定调用。AFAIK,这是编程比赛中用于沙盒参赛者程序的方法。

于 2009-06-19T19:39:42.470 回答
0

我认为您的解决方案必须专注于分析源代码。C我不知道任何工具,而且我认为这Pascal对 .

于 2009-06-22T20:45:42.310 回答
0

在 KVM 或 qemu 下生成一个新的 VM 来编译和运行代码看起来像是要走的路。在 jail/LXC 下运行代码可能会破坏机器,如果它利用操作系统的不安全部分(如网络代码)。在虚拟机下运行的优势是显而易见的。一个人只能破解虚拟机,但不能破解机器本身。但副作用是您需要大量资源(CPU 和内存)来为每个请求生成一个 VM。

于 2013-03-25T06:42:47.383 回答
0

不受信任程序的基于 ptrace 的限制可以像 http://www.cs.vu.nl/~rutger/publications/jailer.pdfhttp://www.cs.vu.nl/~guido中描述的那样使用/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

于 2013-04-17T02:27:37.467 回答
-2

您唯一的机会是运行 VirtualMachine,而那些可能存在漏洞。如果您希望您的机器在短期内被黑客入侵,只需使用权限并设置一个可以访问一个目录的特殊用户。如果您想将黑客攻击推迟到将来的某个时间点,请在虚拟机中运行一个网络服务器并将端口转发到该虚拟机。你会想要保留它的备份,因为你可能会在一个小时内被黑客入侵,并且想要每隔几个小时重新启动一个新副本。您还需要保留整台机器的映像,以便每周左右重新映像一次,以克服每周的黑客攻击。不要让那台机器与网络上的任何其他机器通信。到处都是黑名单。我说的是虚拟机和物理机IP地址。对网络上其他机器上的任何其他机器进行定期安全审计。请重命名机器 IHaveBeenHacked1 和 IHaveBeenHacked2 并阻止访问您的主机列表和防火墙中的机器。

这样你可能会暂时避免你的黑客攻击水平。

于 2009-06-19T20:53:23.913 回答