繁体   English   中英

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

[英]Is there a “safe” subset of Python for use as an embedded scripting language?

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

虽然这对内部应用程序非常有效,但我会警惕将此类应用程序发布到野外,因为担心有人意外或恶意地将破坏性代码添加到文件中。 使用 Python 作为嵌入式脚本语言也是如此。

是否有一个 Python 子集被认为是“安全的”嵌入? 我意识到它可以被认为是多么安全是相当主观的。 然而,Java Applets 和 Flash 都有明确定义的安全沙箱。 我想知道是否有具有类似规则的 Python 版本?

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

以下是一些链接,可让您了解您所面临的问题:

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

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

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

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

最好的办法是创建自己的解析器,或者使用系统调用挂钩和被监禁的帐户隔离 python 进程。

有些人可能会将您指向 PyPy,但它尚未完成。

tinypy ( tinypy.org ) 是一个小型的、可嵌入的 Python 子集,以 Lua 风格编写。 由于 lua 有一种创建沙箱的方法,我估计tinypy 也可能会被黑客入侵。 由于tinypy 的代码库非常小,因此很容易学习并找出如何更改内容以满足您的需求。

AFAIK,在标准python库中进行了一些尝试,但没有成功。 有关详细信息,请参阅受限执行

警告

在 Python 2.3 中,由于各种已知且不易修复的安全漏洞,这些模块已被禁用。 这些模块仍然记录在此处以帮助阅读使用 rexec 和 Bastion 模块的旧代码。

有点难以理解你想要做什么——没有足够的细节。

您是否托管本机应用程序并允许用户编写插件? 考虑通过在 jail/chroot/similar 中将 Python 应用程序作为单独的运行时进程运行并通过套接字进行通信来使用操作系统级解决方案。

您是否希望您的客户托管本机应用程序并让“不受信任方”编写插件? 是否有原因上述解决方案不起作用? (例如,客户希望在没有这些选项的情况下部署在奇怪的操作系统上......)

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

请注意,如果没有更严格的限制(最大 CPU 周期、最大内存、内存所有权问题……),仅沙箱通常是不够的? 你想阻止什么样的恶意? 请注意,在此,操作系统也具有并非所有沙盒环境都能复制的出色功能(优先级、终止进程、ulimit)——并且与操作系统中的事物相比,安全性测试肯定更少。 (在我相信 PyPy 不会让恶意编码器占用无限量的内存之前,我相信 Linux 不会有可破坏的 ulimits,仅仅因为 Linux 在野外受到了更多的攻击。)

我会谨慎地将此类应用程序发布到野外,以免有人意外或恶意地将破坏性代码添加到文件中。

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

如果您非常偏执并想要​​更高的速度,您可以让托管脚本实例的本机应用程序检查内容的哈希值。 那么偶然的变化是不可能的; 只有故意更改才会麻烦更新校验和。 您还可以进一步检查它们是否也使用公钥签名; 那么只有破解你的原生应用程序才能让新脚本进入。

但是沙箱呢? 别担心!

您可以在 Silverlight/Moonlight 上尝试 IronPython,因为这些人似乎正在做的令人印象深刻。 有很多这些类型的从分解一个开发商IronPython的应用极大的信息在这里

我不太了解您在 Java 虚拟机或 .NET 运行时中获得的安全功能,但您可能需要考虑使用JythonIronPython运行 Python 代码是否可以让您获得额外的安全性。

这听起来像您想要的: Reviving Python 限制模式

Python 解释器具有内置的“受限”模式,可通过更改__builtins__魔术变量启用。 这篇文章为保护 Python 解释器的安全铺平了道路,更详细地解释了这个技巧。 请注意,要完全工作,它需要一个 Python 解释器的补丁; 不知道是不是已经申请了。

有关纯 Python 的概念验证,请参阅他之前的帖子A Challenge To Break Python Security

starlark是在 go 中实现的 Python 的一个子集。

它被 Google 用作其构建工具 Bazel 的配置语言。 关于它的文档/细节少得令人沮丧,但它可能符合要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM