是否有 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
模块中遇到的问题的一些讨论:
这些来自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 的“安全”子集可用作嵌入式脚本语言?的主要内容,如果未能解决你的问题,请参考以下文章
Firestore 安全规则 - 允许基于其父文档数据读取子集合