【发布时间】:2010-04-20 09:14:30
【问题描述】:
我打算用 python (+qt4) 编写一个可插拔的应用程序。但是,我非常担心安全问题。插件应该足够强大,可以在应用程序中做任何他们喜欢的事情(并且作为进一步的限制,在使用这样的插件时会有一个签名过程和一个警告用户),但与环境交互(文件系统,其他进程,网络等)应该由插件通过我将编写的一些python代码来完成。
除了在安装插件之前对插件的代码进行静态代码分析之外,还有什么安全简单的方法可以实现吗?
【问题讨论】:
我打算用 python (+qt4) 编写一个可插拔的应用程序。但是,我非常担心安全问题。插件应该足够强大,可以在应用程序中做任何他们喜欢的事情(并且作为进一步的限制,在使用这样的插件时会有一个签名过程和一个警告用户),但与环境交互(文件系统,其他进程,网络等)应该由插件通过我将编写的一些python代码来完成。
除了在安装插件之前对插件的代码进行静态代码分析之外,还有什么安全简单的方法可以实现吗?
【问题讨论】:
简而言之:没有。
说明:多年来,Python 专家一直在尝试为 Python 构建沙箱。沙盒的问题是你需要做一些事情来做任何 IO(即能够在你的沙盒和应用程序之间传输数据)。他们没有找到一种自动的、pythonic 的方式来做到这一点。要么,您不能与插件交换数据,要么内省将允许在应用程序中遍历对象树 -> 访问您喜欢的所有内容。
想象一下你的想法:插件调用一些你编写的 python 代码。这可能意味着调用方法或函数。这意味着你必须给我一个有效的方法或函数对象。从方法或函数对象,我可以得到你的模块对象。从您的模块中,我可以获得所有符号(即导入)。从那里,我可以做你的模块可以做的所有事情(至少)。
See this article 一些指针。
【讨论】:
在普通 Python 进程中运行的 Python 代码不能被沙盒化,因为您可以随时爬出,但您可以沙盒化整个 Python 解释器。
例如 PyPy 支持沙盒:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
如果你愿意,你可以编写一个 python 库来在一个安全的 pypy-c 实例中运行一个 python 脚本,其中一些共享内存用于传输你信任的数据和一些信号来触发你的程序中的事件。
您还可以使用 selinux 之类的东西对普通的嵌入式 cpython 解释器进行沙箱处理,我相信它可以在代码中使用(它通常是系统管理员的东西),并且在大多数 Linux 发行版或任何 Windows 替代品上都受支持,具体取决于您的平台。如果您愿意挖掘庞大的代码库,Google chrome 会提供一些沙盒代码。
【讨论】:
这是一个非常古老的问题,但也许 QtScript 可能是答案。但是,我不知道您是否可以对它进行沙箱处理,以及 QtScript 是否对您的应用程序足够强大。
【讨论】: