13

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

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

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

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

4

13 回答 13

10

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

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

于 2009-05-14T07:12:56.847 回答
4

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

于 2009-05-14T06:41:01.370 回答
4

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

你最好的选择是要么创建你自己的解析器,要么用系统调用钩子和一个被监禁的帐户隔离 python 进程。

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

于 2009-05-14T06:42:57.073 回答
4

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

于 2009-07-16T01:30:08.100 回答
3

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

警告

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

于 2009-05-14T07:09:14.250 回答
3

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

于 2009-06-24T01:49:19.857 回答
1

我会警惕将此类应用程序发布到野外,因为担心有人意外或恶意地向文件添加破坏性代码。

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

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

但是沙盒呢?别担心!

于 2009-05-14T07:15:18.853 回答
1

您可能会在 Silverlight/Moonlight 上尝试 IronPython,因为这些人似乎正在做令人印象深刻的事情。Resolver One 开发人员在此处提供了有关这些类型的 IronPython 应用程序的大量重要信息。

于 2009-05-14T07:35:37.197 回答
1

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

于 2009-05-14T07:37:09.130 回答
1

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

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

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

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

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

于 2009-06-16T09:27:19.593 回答
0

有关模块先前遇到的问题的一些讨论rexec

这些来自Restricted Execution HOWTO

于 2009-05-15T01:03:10.660 回答
0

这听起来像你想要的:恢复 Python 受限模式

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

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

于 2009-07-16T02:00:45.537 回答
0

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

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

于 2020-05-11T07:28:54.203 回答