沙箱化的Python插件
我打算用Python和QT4写一个可以插拔的应用程序。不过,我对安全性有很大的担忧。插件应该足够强大,可以在应用程序内随心所欲地操作(而且为了安全起见,使用这些插件时会有签名过程和用户警告),但插件与环境(比如文件系统、其他进程、网络等)的互动只能通过我写的一些Python代码来进行。
除了在安装插件之前对它们的代码进行静态分析,还有没有其他安全又简单的方法来实现这个目标呢?
3 个回答
这个问题很老了,但也许QtScript可以解决这个问题。不过,我不太确定你能否把它放在一个安全的环境中使用,也不清楚QtScript是否足够强大,能满足你的应用需求。
在普通的Python进程中运行的代码是无法被完全隔离的,因为总是有办法逃出来。不过,你可以对整个Python解释器进行隔离。
比如,PyPy就支持这种隔离功能:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
如果你愿意的话,可能可以写一个Python库,让Python脚本在一个安全的PyPy实例中运行,使用一些共享内存来传递你信任的数据,并通过某种信号来触发你程序中的事件。
你也可能能用像selinux这样的工具来隔离普通的嵌入式CPython解释器。我记得这个工具可以在代码中使用(通常是系统管理员的工作),而且在大多数Linux发行版上都支持,至于Windows上有什么替代方案就要看你的平台了。如果你愿意深入研究,Google Chrome中也有一些隔离的代码。
简单来说:不可以。
解释一下:多年来,Python的高手们一直在尝试为Python创建一个沙盒环境。沙盒的问题在于,你需要一些东西才能进行输入输出(也就是说,能够在沙盒和应用之间传输数据)。他们没有找到一种自动的、符合Python风格的方法来实现这一点。要么你无法和插件交换数据,要么通过反射(也就是查看对象的结构)就能访问到应用中的所有内容——这样就可以随意获取你想要的东西。
想象一下你的想法:插件调用你写的一些Python代码。这可能意味着调用一个方法或函数。这就要求你必须给我一个有效的方法或函数对象。通过这个方法或函数对象,我可以获取到你的模块对象。然后,从你的模块中,我可以获取到所有的符号(也就是导入的内容)。从那里,我就可以做你模块能做的所有事情(至少是这样)。
查看这篇文章以获取一些指引。