代码之家  ›  专栏  ›  技术社区  ›  Flavius

沙盒式python插件

  •  2
  • Flavius  · 技术社区  · 14 年前

    我计划用python(+qt4)编写一个可插入的应用程序。不过,我对安全非常担心。插件应该足够强大,可以在应用程序中做任何他们想做的事情(并且作为进一步的限制,当使用这样的插件时,将有一个签名过程和一个警告),但是与环境(文件系统、其他进程、网络等)的交互应该是一个接一个的插件只能通过一些python代码来编写。

    除了在安装插件之前必须对插件的代码进行静态代码分析之外,还有什么安全而简单的方法来实现它吗?

    3 回复  |  直到 10 年前
        1
  •  5
  •   augurar    10 年前

    简而言之:不。

    说明:多年来,python专家一直试图为python构建一个沙箱。沙盒的问题是,你需要做一些事情来完成任何IO(即能够在沙盒和应用程序之间传输数据)。他们没有找到一种自动的,蟒蛇式的方法来做这件事。或者,您无法与插件交换数据,或者自省将允许在应用程序中遍历对象树->访问您喜欢的所有内容。

    想象一下您的想法:插件调用您编写的一些python代码。这可能意味着调用方法或函数。这意味着你必须给我一个有效的方法或函数对象。从方法或函数对象,我可以得到你的模块对象。从你的模块,我可以得到所有的符号(即导入)。从那里,我可以做你的模块能做的一切(至少)。

    See this article 一些指点。

        2
  •  2
  •   H3g3m0n    14 年前

    在普通python进程中运行的python代码不能被沙盒化,因为您总是可以爬出,但是您可以沙盒化整个python解释器。

    例如,pypy支持沙箱: http://codespeak.net/pypy/dist/pypy/doc/sandbox.html

    如果愿意,您可以编写一个python库,在一个安全的pypy-c实例中运行一个python脚本,该实例具有一些用于传输您信任的数据的共享内存和一些触发程序中事件的信号。

    您还可以使用selinux之类的东西对普通的嵌入式cpython解释器进行沙箱处理,我相信这些东西可以在代码中使用(通常是系统管理的东西),并且在大多数linux发行版或其他windows替代版本上都受支持,这取决于您的平台。谷歌Chrome有一些沙盒代码,如果你愿意挖掘通过巨大的代码库。

        3
  •  1
  •   P.R.    10 年前

    这是一个很老的问题,但也许qtscript就是答案。但是,我不知道您是否可以对其进行沙箱处理,以及qtscript是否足够强大,适合您的应用程序。