我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译).用户不受信任,这显然具有一些巨大的安全隐患.
所以我需要为应用程序创建一些沙盒.在最基本的层面上,我想限制对某些指定目录的文件系统访问.我无法直接使用chroot jails,因为Web应用程序不是以特权用户身份运行.我想一个suid可执行文件设置jail将是一个选项.
上传的程序相当小,因此它们应该快速执行(最多几秒钟).因此,我可以在预设超时后终止进程,但是如何确保它不会产生新进程?或者,如果我不能,那么杀死整个pgid是一种可靠的方法吗?
除了"根本不做"之外,最好的方法是什么?:)我错过了哪些其他明显的安全问题?
FWIW,Web应用程序将用Python编写.
我正在尝试运行从未知来源的C代码编译的程序.我想确保程序不会损害我的系统.例如,system("rm -rf /")除非彻底检查代码,否则程序可能在源代码中有类似的内容,这是不可检测的.
我想到了以下两种方式
两者都不是非常优雅的解决方案,我不能自动化它们.而且,如果是1,它可能会损害VM.
任何帮助,将不胜感激.
我想在我们称之为"沙盒"的程序中运行该程序.
我正在考虑沙盒化Linux进程的几个选项.使用clone()具有CLONE_NEWNET(等)的选择之一.CLONE_NEWNET确保沙盒进程无法建立或接受真正的网络连接.但我想完全禁用该进程的套接字,甚至bind()是任何端口0.0.0.0,并绑定到Unix doman套接字(甚至匿名).我想这样做是为了防止进程通过绑定到数千个端口来使用过多的内核资源.我怎么做?
一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的方法和强制执行的方法ptrace()),但在这个问题中,我只对沙盒方法的套接字创建方面感兴趣(所以如果你建议使用沙盒)方法,请解释如何防止使用它创建套接字),我对需要内核修补或涉及加载内核模块的方法不感兴趣,内核模块不是Ubuntu Lucid默认二进制内核包的一部分,或者会影响系统上的每个进程.
问:有没有办法沙盒Go程序?
答:是的.参见GAE w/Go或play.golang.org
这是怎么做到的?
在我的特定情况下,我想允许用Go编写的不受信任的扩展.我想Go Goground正是我所需要的.它是开源的吗?或者至少有一些关于如何构建类似服务的文档?
code.google.com/p/go-playground是Go Playground编辑器的源代码.但沙箱隐藏在POST后面http://golang.org/compile?output=json.
虽然我知道系统调用和安全性不是齐头并进的,但我确实需要一个项目.我正在编写一个小代码检查器,我需要编译并执行用户提交的代码来测试我的测试用例.
基本上我想在沙盒中运行代码,这样它就无法触及临时目录之外的任何文件,并且外部世界无法访问它创建的任何文件.最近我遇到了一个漏洞,用户可以shell.php使用以下内容创建一个文件.
<?php
echo system($_GET['x']);
?>
Run Code Online (Sandbox Code Playgroud)
这为攻击者提供了一个远程shell,并且由于该文件的所有者是apache,攻击者基本上可以在整个/var/wwwmysql密码存储的地方移动以及其他配置信息.
虽然我知道像SQL Injections这样的威胁,并且在涉及数据库的任何操作之前已经清理了用户输入,但我不知道如何设置沙箱.我可以使用哪些技术来禁用系统调用(现在我正在用户提交的代码中搜索"系统"一词而不执行找到它的那些片段)并限制对用户访问的文件的访问权限提交的代码创建.
截至目前,我的代码检查程序仅适用于C,我计划在保护它之后添加对其他语言(如C++,Java,Ruby和Python)的支持.此外,我想了解更多关于我遇到的这个问题,以便指出我可以了解更多关于网络安全的地方也将受到赞赏.
我的开发机器运行的是Mac OS Lion,部署机器是linux服务器,所以如果是跨平台的解决方案将是最受欢迎的,但只涉及linux机器的解决方案也会这样做.
我有一个Web服务,用户上传在服务器上运行的python脚本.这些脚本处理在服务器上的文件,我希望他们能够看到仅在服务器的文件系统中某一层级(最好:关于这一点我复制我要处理的文件和脚本的临时文件夹).
服务器最终将是基于Linux的服务器,但如果在Windows上也可以使用解决方案,那么知道如何解决这个问题会很好.
我的目的是创建一个限制访问FS文件夹的用户 - 最终只包含脚本和文件的文件夹 - 并使用该用户启动python解释器.
有人可以给我一个更好的选择吗?因为只依靠这个让我觉得不安全,我想要一个真正的沙盒或虚拟FS功能,我可以安全地运行不受信任的代码.