【问题标题】:sandbox to execute possibly unfriendly python code [duplicate]沙箱执行可能不友好的python代码[重复]
【发布时间】:2010-10-11 21:53:04
【问题描述】:

假设互联网上有一台服务器,可以将一段代码发送到该服务器进行评估。在某个时刻,服务器获取所有已提交的代码,并开始运行和评估它。但是,在某些时候它肯定会碰到某个邪恶程序员发送的“os.system('rm -rf *')”。除了“rm -rf”之外,您还可以预期人们会尝试使用服务器发送垃圾邮件或执行某人的操作,或者玩弄“while True: pass”之类的东西。

有没有办法处理这种不友好/不受信任的代码?特别是我对python的解决方案感兴趣。但是,如果您有任何其他语言的信息,请分享。

【问题讨论】:

标签: python trusted-vs-untrusted


【解决方案1】:

如果您不是特定于 CPython 实现,则应考虑查看 PyPy[wiki] 以实现这些目的 - 这种 Python 方言允许透明代码沙盒。

否则,您可以在execeval 的相应全局/本地参数中提供假的__builtin____builtins__

此外,您可以提供类字典对象而不是真正的字典,并跟踪不受信任的代码对其命名空间的作用。

此外,您实际上可以跟踪该代码(在执行任何其他代码之前在受限环境中发出 sys.settrace()),以便在出现问题时中断执行。

如果没有任何解决方案是可接受的,请使用操作系统级别的沙盒,例如 chrootunionfs 和标准的 multiprocess python 模块,以在单独的安全进程中生成代码工作者。

【讨论】:

    【解决方案2】:

    您可以查看pysandbox,它可以做到这一点,但如果您负担得起,VM 路线可能更安全。

    【讨论】:

    • 您引用的页面顶部说 pysandbox 天生就坏了,基本上应该找到不同的解决方案。您确定这是一个可行的解决方案吗?
    • 这很老了,我根本没有关注 pysandbox 开发。正如@modchan 建议的那样,我认为现在最安全的方法是 PyPy 的沙盒模式。
    • 是的,这看起来是个不错的解决方案。您是否也碰巧知道 pypy 是否需要与 python 2.7 的语法差异? pypy 页面在这件事上有点不清楚。
    【解决方案3】:

    不可能为此提供一个绝对的解决方案,因为“坏”的定义很难确定。

    打开和写入文件是好是坏?如果那个文件是 /dev/ram 呢?

    您可以分析行为特征,也可以尝试阻止任何可能不好的事情,但您永远不会赢。 Javascript 就是一个很好的例子,人们总是在他们的计算机上运行任意的 javascript 代码——它应该是沙盒的,但是会出现各种各样的安全问题和边缘条件。

    我不是说不要尝试,你会从这个过程中学到很多

    许多公司已花费数百万美元(英特尔刚刚在 McAffee 上花费了数十亿美元)试图了解如何检测“不良代码”——而且每天运行 McAffe 防病毒软件的机器都会感染病毒。 Python 代码的危险性不亚于 C。您可以运行系统调用、绑定到 C 库等。

    【讨论】:

      【解决方案4】:

      我会认真考虑虚拟化环境来运行这些东西,以便通过虚拟机的配置,您实现的任何机制中的漏洞利用都可以再次受到防火墙。

      用户数量以及您希望测试/运行的代码类型会对选择产生相当大的影响。如果他们不希望链接到文件或数据库,或运行计算密集型任务,并且您的压力非常低,那么您可以通过完全阻止文件访问并在进程被杀死之前对进程施加时间限制并施加时间限制。提交被标记为过于昂贵或恶意。

      如果您要测试的代码可能是任意 Django 扩展或页面,那么您可能需要做很多工作。

      【讨论】:

        【解决方案5】:

        您可以尝试一些通用的 sanbox,例如 SydboxGentoo's sandbox。它们不是特定于 Python 的。

        两者都可以配置为限制对某些目录的读/写。 Sydbox 甚至可以对套接字进行沙盒处理。

        【讨论】:

          【解决方案6】:

          我认为这样的修复将非常困难,它让我想起了我参加过的关于在虚拟环境中编程的好处的讲座。 如果你在做这件事,如果他们搞砸了,那真的很酷。暂时解决不了 True: pass but rm -rf / 没关系。

          【讨论】:

            【解决方案7】:

            除非我弄错了(我很可能是这样),否则这就是 Google 将 Python 更改为 App Engine 的主要原因。您在他们的服务器上运行 Python 代码,但他们已经删除了写入文件的能力。所有数据都保存在“nosql”数据库中。

            这不是对您问题的直接回答,而是在某些情况下如何处理此问题的示例。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-04
              • 1970-01-01
              • 2022-06-25
              • 2013-03-06
              • 2017-03-15
              • 2017-09-27
              相关资源
              最近更新 更多