【问题标题】:Python, safe, sandbox [duplicate]Python,安全,沙箱 [重复]
【发布时间】:2010-09-10 22:08:14
【问题描述】:

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

【问题讨论】:

  • 有一种方法可以配置 Python 以禁用不安全的功能 - 它已在 Paint Shop Pro 中成功使用。不幸的是,我没有技术细节。此外,通过上传无限循环,可能会利用漏洞和普通的旧式拒绝服务。
  • 这对于在自己的计算机上运行的独立应用程序来说可能很棒,而不是在公共服务器上......
  • codepad.org 将允许您粘贴脚本并以包括 Python 在内的多种语言运行它。

标签: python sandbox


【解决方案1】:

“做不到。”

运行任意(不受信任的)脚本和保持安全是矛盾的。您应该尽可能使用自定义内核、jails、vms 等。

你可以看看http://codepad.org/about是怎么做的,这是一个很多的工作。

【讨论】:

  • 哇,这很有帮助。在您的帖子之后,我正在考虑编写自己的类似于 Python 的伪语言来实现我的目标......
  • 你可以修补最新的 PyPy 添加,但我假设你想提供对 cpython 的访问。
  • 不是真的,我只是希望人们提交他们的代码并在之后评估......(运行它,看看它做了什么)无论如何,我只是想让它成为可能上传一些代码并测试它 - 不会造成任何损害 - 很多人都熟悉的任何东西
【解决方案2】:

我不知道在早期版本中,在 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

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

【讨论】:

  • 在 python 2.7.3 上测试并且工作方式完全相同。
  • 你可以轻松摆脱这个。我没有设法获得__import__(还),但file 是可访问的,并且任意读/写被认为是破坏沙盒,IMO。
  • 我自己没试过,但经验法则是只要能访问双下划线属性就可以突破。因此,至少您需要将 AST 列入白名单。
【解决方案3】:

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

您可能想看看他们是如何解决问题的。

或者您可能想看看不同的方法:

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

【讨论】:

    【解决方案4】:

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

    Google App Engine 运行 Python 虚拟机的沙盒版本,它有效地删除了所有可让您访问底层系统的顽皮本机位。要以安全的方式自己执行此操作需要一些 Python VM 专业知识。

    为了保持理智,您可以先删除 所有 内置插件,然后在您证明用户未接触底层系统后将您希望允许的用户列入白名单。

    感觉好像有人已经做过了,但我不知道有任何现有的项目可以做到这一点。 :-/

    【讨论】:

    • 已经尝试过了,如果不走 VM/PyPy/codepad 方式,您将无法正确完成。您需要禁止使用 __builtins__.__import__('sys').exit() 之类的愚蠢内容以及许多其他获取方法(locals() 等)。此外,不会削弱解释器本身。
    • 所以你是说如果没有正确地做就不能正确地做?我想的就这么多。 ;-)
    • 2 个问题:1) javascript 引擎被设计为客户端脚本,python 不是; 2)javascript存在于您的网络浏览器中,他要求运行不受信任的python服务器端。我同意它是可行的,尽管它需要大量的工作并限制很多东西。
    【解决方案5】:

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

    可以在几秒钟内创建并启动一个新的 VM 实例。如果您保留一些并仅更换损坏的那些,那么您将获得良好的服务、绝对的安全性并且几乎不费吹灰之力。

    但有一件事:今天几乎所有的网络主机都是虚拟机,它们不支持内部的另一个虚拟机。您需要一个真实的物理服务器来执行此操作。

    【讨论】:

      【解决方案6】:

      Brett Cannon 对此进行了初步设计,据我所知,但尚未开发。因此,除非您希望付出很多努力来实现这一点,否则目前还没有公开的解决方案。

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

      曾经有一些受限的执行能力,但是因为它们不起作用而被放弃了。

      这不是不可能做到的,但这不是 Python 目前能够做到的。这是人们想要的东西,但从我所看到的情况来看,这并不是一个高优先级。

      【讨论】:

      • AFAICR,该计划被放弃了,因为 Python 本身无法保证这种安全性,而外部强制沙箱应该是实现任何真正安全性的方法。
      • 是的,这就是我所说的“他们只是没有工作”的意思。对不起,我在那里不太清楚。我不同意没有办法保证 Python 的这种安全性,我相信 Brett 有一个允许它的计划,但我不得不以某种方式推迟他的细节。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          您可以尝试 Ideone API - 它支持 Python 2 和 Python 3

          【讨论】:

          • Ideone API 演变为 Sphere Engine (sphere-engine.com)。现在它提供的不仅仅是旧的 Ideone API :)
          猜你喜欢
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 2011-07-06
          • 1970-01-01
          • 2016-03-27
          • 1970-01-01
          • 2013-02-28
          相关资源
          最近更新 更多