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

Posted

技术标签:

【中文标题】是否有 Python 的“安全”子集可用作嵌入式脚本语言?【英文标题】:Is there a "safe" subset of Python for use as an embedded scripting language? 【发布时间】:2010-10-26 02:25:14 【问题描述】:

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

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

是否存在被认为“安全”嵌入的 Python 子集?我意识到它可以被认为是多么安全是相当主观的。但是,Java Applet 和 Flash 都有明确定义的安全沙箱。请问有没有类似规则的Python版本?

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

【问题讨论】:

在这种情况下“恶意”是什么意思?我下载你的软件,我配置它,我做了太多不安全的代码搞砸了配置。怎么这么“恶意”?这对我来说听起来很“愚蠢”。您是在问“我能做些什么来防止用户变得愚蠢?” 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

PyPy:我认为你现在必须删除“慢”。【参考方案3】:

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

警告

在 Python 2.3 中,这些模块已 由于各种已知而不是 易于修复的安全漏洞。这 模块仍然记录在这里 帮助阅读使用 rexec 和 Bastion 模块。

【讨论】:

【参考方案4】:

这里有几个链接可以让您了解您所面临的问题:

How can I run an untrusted Python script safely (i.e. Sandbox) Capabilities for Python?Guido 本人

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

【讨论】:

【参考方案5】:

我会谨慎发布此类 应用程序进入野外,因为害怕 有人不小心,或者 恶意添加破坏性代码 到文件中。

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

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

但是沙盒呢?别担心!

【讨论】:

谁会下载、安装和“恶意”破坏他们下载和安装的应用程序?当他们对自己这样做时,“恶意”是什么意思?这只是将代码发布到野外所收集到的众多“愚蠢用户”故事之一。【参考方案6】:

您可以在 Silverlight/Moonlight 上尝试 IronPython,正如 these guys 令人印象深刻的所做的那样。 Resolver One 开发人员here 提供了有关这些 IronPython 应用程序类型的大量重要信息。

【讨论】:

【参考方案7】:

我不太了解您在 Java 虚拟机或 .NET 运行时中获得了哪些安全功能,但您可能需要考虑使用 Jython 或 IronPython 运行您的 python 代码是否允许您获得更高的安全性。

【讨论】:

【参考方案8】:

关于之前在rexec 模块中遇到的问题的一些讨论:

http://mail.python.org/pipermail/python-dev/2002-December/031160.html http://mail.python.org/pipermail/python-dev/2003-January/031848.html

这些来自Restricted Execution HOWTO。

【讨论】:

【参考方案9】:

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

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

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

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

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

【参考方案13】:

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

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

【讨论】:

以上是关于是否有 Python 的“安全”子集可用作嵌入式脚本语言?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌应用脚​​本超时 ~ 5 分钟?

谷歌应用脚​​本超时 ~ 5 分钟?

Firestore 安全规则 - 允许基于其父文档数据读取子集合

python 定义可用作装饰器的上下文管理器

嵌入式闪存在 Chrome 中工作而不是在 FireFox 中

是否有一个模块可以在 python 中用作 FindWindow API