我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译)。用户不受信任,这显然会产生一些巨大的安全隐患。
所以我需要为应用创建一些沙盒。在最基本的层面上,我想限制对某些指定目录的文件系统访问。我无法直接使用chroot jails,因为Web应用程序不是以特权用户身份运行。我想一个设置监狱的suid可执行文件将是一个选项。
上传的程序相当小,因此它们应该快速执行(最多几秒钟)。因此,我可以在预设超时后终止进程,但是如何确保它不会产生新进程?或者如果我不能,那就是杀死整个pgid一个可靠的方法吗?
除了“根本不做”之外,最好的方法是什么? :)我错过了哪些其他明显的安全问题?
FWIW,网络应用程序将用Python编写。
答案 0 :(得分:5)
答案 1 :(得分:4)
您提供的一些细节意味着您对服务器本身具有管理控制权,因此我的建议做出了这样的假设。
我将此作为批处理系统解决。 Web服务器接受源文件的上载,进程轮询提交目录,处理文件,然后将结果提交到Web应用程序轮询的另一个目录,直到找到结果并显示它。
有趣的部分是如何安全地处理执行。
我选择的操作系统是FreeBSD,因此我会设置一个预配置的jail(不要与vanilla chroot jail混淆),它将编译,运行和保存输出。然后,对于每个源文件提交,为每次执行启动jail的原始副本,并在其中包含源文件的副本。
如果jail的/ dev被修剪到几乎没有,系统资源限制被安全地设置,并且流量无法路由出监狱(绑定到不可路由的地址或简单地防火墙),我个人会很舒服在我照顾的服务器上运行它。
由于你使用的是Linux,我会研究用户模式Linux或Linux-VServer,它们在概念上与FreeBSD jails非常相似(我自己从未使用过它们,但已经读过它们)。还列出了其他几个此类系统here。
这种方法比香草chroot监狱安全得多,而且比使用qemu / kvm或VMware等完全虚拟化更轻巧。
我不是程序员,所以我不会用什么样的AJAX-y来调查结果,但我确信它可以完成。作为管理员,我会发现这是一个有趣的项目参与。玩得开心。 :)
答案 2 :(得分:3)
我认为这在很多层面都非常危险。您实际上是在开放自己可以在系统上找到的任何漏洞利用(而您通常只限于人们可以远程利用的漏洞)。如果可以避免,我会说不要这样做。
如果您确实想这样做,您可能希望使用某种虚拟机来运行用户代码。使用类似KVM之类的东西,可以使用相同的基本映像设置多个虚拟机(您甚至可以将快照存储在已启动状态,但我不确定它将如何处理克隆) 。然后,您可以按需创建VM,运行用户代码,返回结果,然后终止VM。如果您将虚拟机彼此隔离并与网络隔离,则用户可能会造成他们想要的任何破坏,并且不会损害您的物理服务器。你在这些条件下暴露自己的唯一危险就是允许它们从虚拟机中逃脱的某种攻击......这些非常罕见,随着硬件虚拟化的改进,这种情况会更加罕见。
答案 3 :(得分:3)
虽然它仍处于开发阶段,尚未被认为是安全的,但您可以查看Google Native Client背后的技术。它旨在允许不受信任的本机代码在Web浏览器中运行,但可能适用于Web服务器。您可以在其他技术(如虚拟机)之上使用此类内容,以提高安全性。
答案 4 :(得分:2)
在Fedora 11上,SELinux Sandbox似乎完全符合您的要求(除了可能限制产生新流程;链接的博客文章没有提及)。
当然,总是存在内核错误的风险;即使使用SELinux,内核的某些部分仍然会暴露给所有进程。
答案 5 :(得分:2)
见this page on Google Chrome's sandboxing methods for Linux。正如您所看到的,有很多方法,但它们都不适用于像Chrome这样的可分发应用程序,因为某些发行版可能不包含它们。但这对于Web应用程序来说并不是一个问题,因为您可以控制服务器上安装的内容。
就个人而言,我最喜欢的是Seccomp,因为与其他工具(例如每个系统调用上的开关地址空间)相比,它具有非常低的开销。或KVM(大内存饥饿的虚拟机),与SELinux等工具相比,它非常简单(因此更可能是安全的)。
答案 6 :(得分:2)
我猜libsandbox符合你的目的。它的核心库是为C / C ++编写的,但它也有一个Python程序包装器。它提供了自定义允许哪些系统调用,可以使用多少内存,运行guest程序多长时间等的选项。它已经被用于几个在线评判,例如HOJ。
答案 7 :(得分:1)
有一个名为strace的工具 - 它监视由给定进程进行的系统调用。您只需要注意建议“非法”功能访问的特定呼叫。 AFAIK,它是用于沙盒参赛者节目的比赛编程的方法。
答案 8 :(得分:0)
我认为您的解决方案必须专注于分析源代码。我不知道任何工具,我认为这对于C
来说会非常困难,但是,例如,在我看来,一个不包含任何模块的Pascal
程序将是非常无害的。
答案 9 :(得分:0)
在KVM或qemu下生成一个新VM来编译和运行代码看起来像是要走的路。在jail / LXC下运行代码可能会损害机器,如果它利用操作系统的不安全部分,如网络代码。在VM下运行的优势是显而易见的。人们只能破解VM而不是机器本身。但副作用是您需要大量资源(CPU和内存)来为每个请求生成VM。
答案 10 :(得分:0)
不受信任程序的基于ptrace的限制可以像http://www.cs.vu.nl/~rutger/publications/jailer.pdf,http://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
答案 11 :(得分:-2)
关于您运行VirtualMachine的唯一机会,那些可能存在漏洞。如果您希望您的计算机在短期内被黑客攻击,只需使用权限并使特殊用户可以访问某个目录。如果您希望将黑客推迟到将来的某个时间点,那么在虚拟机内部运行一个Web服务器并将其转发到该虚拟机。你需要保留它的备份,因为你可能会在一小时内被黑客入侵,并希望每隔几个小时重新启动一个新副本。您还需要保留整个机器的图像,以便每周一次重新映射整个事物,以便克服每周的黑客攻击。不要让该机器与网络上的任何其他机器通信。将它列入黑名单。我在谈论虚拟机和物理机IP地址。对网络上其他计算机上的任何其他计算机进行定期安全审核。请重命名机器IHaveBeenHacked1和IHaveBeenHacked2,并阻止访问主机列表和防火墙中的机器。
通过这种方式,你可以暂时避开你的hackage。