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

14
在我创建的许多Python应用程序中,我经常创建简单的模块来包含仅用作配置文件的常量。此外,由于配置文件实际上是Python代码文件,我可以添加简单的逻辑来根据调试级别更改变量等。
虽然这对于内部应用程序非常有效,但我会谨慎发布此类应用程序,因为担心有人会意外或恶意地向文件中添加破坏性代码。对于使用Python作为嵌入式脚本语言同样也是如此。
是否存在被认为是“安全”的Python子集可供嵌入?我意识到被认为安全程度相当主观。但是,Java小程序和Flash都有其安全沙箱明确定义。我想知道是否有一个具有类似规则的Python版本?
编辑:我之所以提问并不是因为配置文件方法,而是因为我有兴趣在新应用程序中实现一些脚本/插件机制,并且不希望插件或脚本能够删除文件。那超出了应用程序应该能够做的范围。

在这个上下文中,“恶意”的意思是什么?我下载了你的软件,我配置它,我通过编写过多的不安全代码搞砸了配置。那怎么会是“恶意”的呢?对我来说听起来很“愚蠢”。你是在问“我该怎么做才能防止用户变得愚蠢”吗? - S.Lott
13个回答

10

4

如果你只需要设置简单变量、循环、条件和函数,那么PyMite VM就能胜任。 PyMite非常小巧,用C语言编写,使用静态内存池,并可嵌入。 它具有极为有限的内置函数集,易于配置。 同样,唯一的标准库是字符串、字典、列表和系统的部分实现。 PyMite VM是python-on-a-chip项目的一部分,因此它被设计用于微控制器上运行,但也可以在类Unix桌面系统上运行。 缺点是PyMite没有其他Python实现那样经过完善的调试。


4

4

目前没有一种“安全”的Python生产级子集。Python曾经有过一些沙盒模块,但由于其缺陷而被弃用。

你最好的选择是要么创建自己的解析器,要么使用系统调用钩子和受限账户来隔离Python进程。

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


2
PyPy: 我认为你现在得删掉“慢”这个词了。 - EoghanM
我认为在7年之后更新“pypy未完成”的评论是时候了。 - Martin Thoma

3

tinypy (tinypy.org) 是一种小型、可嵌入的 Python 子集,采用 Lua 风格编写。由于 Lua 有创建沙盒的方式,我估计 tinypy 可以沿着同样的思路被黑客攻击。由于 tinypy 的代码库非常小,因此很容易学习并找出如何改变事物以适应您的需求。


3
据我所知,标准的Python库曾试图实现过相关功能,但并未成功。具体细节请参见Restricted Execution

警告

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


1

Starlark 是在 Go 语言中实现的 Python 子集。

它被 Google 用作 Bazel 构建工具的配置语言。关于它的文档和细节非常少,但它可能符合要求。


1

你的意图有点难以理解——细节不够。

你是否正在托管本地应用程序并允许用户编写插件?考虑使用操作系统级别的解决方案,通过在监狱/ chroot /类似环境中运行Python应用程序作为单独的运行时进程,并通过套接字进行通信。

您是否希望客户托管本地应用程序并让“不受信任的方”编写插件?上述解决方案无法使用的原因是什么?(例如,客户希望在没有此类选项的奇怪操作系统上部署...)

您是否希望同一人托管本地应用程序和“不受信任的脚本”,并希望保护他们免受自己的影响?从保护他们免受编写“os.remove”并使其执行所编写内容的角度来看?您能解释一下原因吗?

请注意,仅仅进行沙箱隔离通常是不够的,需要更严格的限制条件(最大CPU周期、最大内存、内存所有权问题等)。你想要防止哪种恶意行为?需要注意的是,操作系统也有非常出色的功能(优先级、杀死进程、ulimits),而并非所有沙箱环境都能复制这些功能,并且与操作系统中的东西相比,它们显然经过的安全测试也较少。(我会相信Linux不会打破ulimits,而不是相信PyPy不会使恶意代码者占用无限量的内存,因为Linux已经在野外遭受了攻击。)

1
我会对发布这样的应用程序感到谨慎,因为担心有人会无意或恶意地向文件中添加破坏性代码。

你在“野外”中的本机代码同样容易受到此类攻击;它只是机器代码的速度障碍,而不是安全措施。

如果你非常偏执并想要更高的速度障碍,你可以使托管脚本实例的本机应用程序检查内容的哈希值。然后,意外更改是不可能的;只有故意更改才会费力更新校验和。你还可以进一步检查它们是否使用公钥签名;然后只有黑客攻击你的本机应用程序才能让新脚本进入。

但沙盒?别担心!


谁会下载、安装并“恶意地”破坏他们下载和安装的应用程序呢?当他们这样做时,“恶意”是什么意思?这只是发布代码后你会收集到的许多“愚蠢用户”故事之一。 - S.Lott

1

你可以尝试在Silverlight/Moonlight上使用IronPython,就像这些人所做的那样令人印象深刻。从Resolver One开发人员这里可以获得大量关于这些类型的IronPython应用程序的优秀信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接