代码之家  ›  专栏  ›  技术社区  ›  Soviut

是否有“安全”的Python子集用作嵌入式脚本语言?

  •  11
  • Soviut  · 技术社区  · 15 年前

    在我创建的许多python应用程序中,我经常创建简单的模块,其中只包含用作配置文件的常量。另外,由于配置文件实际上是一个python代码文件,我可以添加简单的逻辑来根据调试级别等更改变量。

    虽然这对内部应用程序很有用,但我会小心地将这些应用程序释放到野外,以免有人意外地或恶意地向文件添加破坏性代码。使用Python作为嵌入式脚本语言也是如此。

    是否有一个子集被认为是嵌入的“安全”?我意识到它的安全性是相当主观的。然而,Java Applet和Flash都有各自的安全沙箱。我想知道是否有一个版本的python有类似的规则?

    编辑: 我的要求不是因为配置文件方法,而是因为我有兴趣在一个新的应用程序中实现一些脚本/插件机制,并且不希望插件或脚本能够,比如删除文件。这超出了应用程序应该能够做到的范围。

    12 回复  |  直到 8 年前
        1
  •  8
  •   Aaron Digulla    11 年前

    下面有几个链接可以让您了解您面临的挑战:

    还有一个死的谷歌代码项目在 http://code.google.com/p/sandbox-python/

        2
  •  3
  •   Unknown    15 年前

    不,没有“安全”的python的生产就绪子集。python有一些沙盒模块,由于缺陷而被弃用。

    您最好的选择是创建自己的解析器,或者使用syscall钩子和一个被监禁的帐户隔离python进程。

    有些人可能会把你指给派比,但这是缓慢和未完成的。

        3
  •  3
  •   dwhall    15 年前

    这个 PyMite VM 如果你只需要设置简单的变量、循环、条件和函数,就可以满足你的要求。pymite很小,用C编写,使用静态内存池,可以嵌入。它有一组非常有限的内置函数,易于配置。同样,唯一的标准库是字符串、dict、list和sys的部分实现。pymite vm是python-on-a-chip项目的一部分,因此它被设计为在微控制器上运行,但可以在posix风格的桌面系统上运行。缺点是,pymite没有其他Python实现那样广泛地消除bug。

        4
  •  3
  •   Florian Rhiem    8 年前

    Pypy项目提供沙盒功能,请参见 http://doc.pypy.org/en/latest/sandbox.html .

        5
  •  2
  •   dwhall    15 年前

    蒂尼普 tinypy.org )被设计成一个小的、可嵌入的、用Lua样式编写的Python子集。由于Lua有一种创建沙盒的方式,我估计Tinypy可以沿着同一条静脉被切割。因为Tinypy的代码库非常小,所以很容易学习和理解如何改变周围的事物以满足您的需求。

        6
  •  1
  •   Konstantin Tenzin    15 年前

    在标准的python库中进行了一些尝试,但是没有成功。见 Restricted Execution 详情。

    警告

    在python 2.3中,这些模块 因各种已知和未知而禁用 容易固定的安全孔。这个 模块仍然记录在这里 帮助阅读使用 Rexec和Bastion模块。

        7
  •  1
  •   Will    15 年前

    我会小心释放这样的 应用到野外的恐惧 有人不小心,或者 恶意添加破坏性代码 文件。

    您的本地代码“在野外”同样容易受到这种攻击;它在机器代码中只是一个减速带,没有安全性。

    如果你非常偏执并且想要一个更高的减速带,你可以让承载脚本实例的本地应用程序检查内容的散列。那么,不可能发生意外更改;只有经过深思熟虑的更改才会导致更新校验和的麻烦。你可以进一步检查它们是否也用公钥签名;然后只有黑客攻击你的本地应用程序才能让新的脚本进入。

    但是沙盒呢?别担心!

        8
  •  1
  •   unmounted    15 年前

    你可以在Silverlight/Moasth上尝试Ironpython,就像 these guys 令人印象深刻的似乎是这样。解析器一号开发人员提供了大量关于这些类型的Ironpython应用程序的信息。 here .

        9
  •  1
  •   garethm    15 年前

    我不太了解Java虚拟机或.NET运行时内的安全能力,但您可能需要考虑是否运行Python代码。 Jython IronPython 可能会允许您获得额外的安全性。

        10
  •  1
  •   moshez    15 年前

    要理解你想做什么有点困难——细节不够。

    你是本地应用的宿主,允许用户写插件吗?考虑使用操作系统级的解决方案,将python应用程序作为单独的运行时进程在jail/chroot/similar中运行,并通过套接字进行通信。

    您是否希望您的客户托管本机应用程序并让“不受信任方”编写插件?上面的解决方案不起作用有什么原因吗?(例如,客户希望在没有此类选项的情况下部署在奇怪的OSS上…)

    您是否希望同一个人托管本机应用程序和“不受信任的脚本”,并希望保护他们不受自己的攻击?在保护他们不写“os.remove”的意义上,让它做他们写的事情?你能解释一下为什么吗?

    请注意,如果没有更严格的限制(最大CPU周期、最大内存、内存所有权问题…)单独进行沙盒处理通常是不够的?你想阻止什么样的恶意行为?请注意,在这里,OSS也有许多出色的功能(优先级、杀戮过程、ulimits),这些功能并不是所有沙盒环境都能复制的,而且肯定比OSS中的安全测试要少。(在我信任Pypy之前,我相信Linux不会有易碎的ulimits,而不会让恶意的编码人员占用无限的内存,这仅仅是因为Linux在野外受到了更多的攻击。)

        12
  •  0
  •   CesarB    15 年前

    这听起来像你想要的: Reviving Python restricted mode .

    python解释器具有内置的“受限”模式,通过更改 __builtins__ 魔力变量。文章 Paving the Way to Securing the Python Interpreter 更详细地解释了这个技巧。请注意,要完全工作,它需要一个python intrepreter的补丁;我不知道它是否已经被应用了。

    关于纯Python概念验证,请参阅他的前一篇文章 A Challenge To Break Python Security .

    推荐文章