Python,安全,沙盒

时间:2010-09-10 22:08:15

标签: python sandbox

我想创建一个人们可以上传他们的Python脚本的网站。当然我想执行这些脚本。这些脚本应该做一些有趣的工作。问题是人们可能上传可能损害我的服务器的脚本,我想阻止它。在不损害我的系统的情况下运行任意脚本的选项是什么 - 实际上根本没有看到我的系统?谢谢

9 个答案:

答案 0 :(得分:7)

“无法完成。”

运行任意(不受信任)脚本并保持安全是一个矛盾。你应该使用自定义内核,jails,vms等。

你可以看看http://codepad.org/about是如何做到的,这是很多的工作。

答案 1 :(得分:4)

我不知道在早期版本中,在Python 3中,您可以通过types.FunctionType创建可访问自定义范围的函数。

def f():
  return __builtins__

f() # this will work because it has access to __builtins__
scope = {}
sandboxed = FunctionType(f.__code__,scope)
sandboxed()  # will throw NameError, builtins is not defined

返回的函数只能访问您在范围字典中提供的任何内容。我想知道是否还有黑客攻击。

答案 2 :(得分:3)

现在有很多网络服务器运行不受信任的python代码:

你可能想看看他们是如何处理他们的问题的。

或者你可能想看一个不同的方法:

  • http://pyjs.org/ - 睡衣 - python-to-javascript编译器(运行客户端,将安全问题转移到他们一边)

答案 3 :(得分:2)

我认为这样做的方法是在普通的Python shell中运行这些脚本,但是在虚拟机上运行。我可能有偏见,因为我的“工作”目前正在玩虚拟机(大学很棒!)。

可以在几秒钟内创建并启动新的VM实例。如果您保留一些并且只替换那些破损的那些,那么您将获得良好的服务,绝对的安全性并且几乎不会付出任何努力。

但有一件事:今天几乎所有的网络主机都是虚拟机,它们不支持其他虚拟机。你需要一个真实的物理服务器才能做到这一点。

答案 4 :(得分:1)

“不能做”,太苛刻了。 JavaScript引擎存在于您的Web浏览器中,它们可以安全地接受和运行不受信任的脚本。总是存在漏洞利用的可能性,但在正确的发动机操作中它们是无害的。甚至还有“慢速脚本”检查,可防止无限制的拒绝服务攻击您的浏览器,从而制作那些小警报对话框。

Google App Engine运行沙盒版本的Python VM,可以有效地删除所有顽皮的本机位,让您可以进入底层系统。要以安全的方式自己完成这项工作将需要一些Python VM专业知识。

为了理智,您可以先删除所有内置文件,然后在您认证用户未触及底层系统时将其设置为白名单。

感觉就像某人必须已经做过的事情,但我不知道有任何现有的项目。 : - /

答案 5 :(得分:1)

Brett Cannon有一个暂时的设计,最后我知道,但它尚未开发。因此,除非您希望为实现这一目标投入大量精力,否则目前尚无公开解决方案。

Brett的博客位于:http://sayspy.blogspot.com/如果你想尝试阅读它,我找不到他关于新安全设计的讨论的直接链接。我不记得我是否读过他的博客谈论它,或者他是否亲自提到它,抱歉。

曾经存在一些受限制的执行能力,但由于它们无法正常工作而被删除。

这不是不可能的,但它不是Python现在能做的事情。这是人们想要的东西,但它并不是我所见过的高优先级。

答案 6 :(得分:1)

trypython.orgBSD licensed source here)在IronPython(通过Silverlight / Moonlight)中为这样的sanbox做了一个安全的浏览器导向版本。您可以将无头版本混合在一起以便在服务器上使用 - 但您绝对可以让用户在彼此之间分发脚本,或者您可以分发这些脚本以在插件环境中执行。

答案 7 :(得分:1)

如果使用Linux,seccomp可能是解决方案,即使mode 2也更好。有了这些,您可以创建一个新进程,它将使任何系统调用失败,并且只能读取已有的文件描述符。

也许使用名称空间和cgroup会有所帮助,这可以通过ctypes来完成。

答案 8 :(得分:1)

您可以尝试Ideone API - 它允许Python 2和Python 3