运行不受信任的python代码,它能够与主程序通信但与系统隔离

Byt*_*der 7 python security interpreter execution python-3.x

序言:我知道很多人已经尝试在Python中沙箱化Python代码并且失败了,但是我还没有看到将脚本作为文本进行额外预处理的方法,并且拒绝包含类似关键字的脚本__base__可以用来恢复隐藏__buuiltins__.我认为这种方法是新的,尚未证明失败 - 是吗?

我计划编写一个多人策略游戏,玩家通常不会使用键盘/鼠标命令与他们的单位交互,但只能通过他们必须提交的脚本来改变单位的自动行为.这是基于http://screeps.com的想法.

我想在Python 3中编写它,但主要问题似乎是在服务器上安全执行不受信任的外部播放器脚本.我知道,我可能不信任exec()eval()将它们空,即使,globalslocals作为环境.我也知道简单的擦除__builtins__也行不通,因为人们仍然可以使用Python的内省功能轻松恢复它们,如下所述:http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html

我已经知道PyPy或Jython可能有某种沙盒功能可能适用于我的目的,但我不知何故更愿意继续使用CPython参考解释器.此外,我只能找到这些沙盒功能适用于整个程序的示例,但没有一个包含将不受信任的脚本作为子线程运行并与它们高效通信的主程序.


但我认为我还有一次机会:我可以按字面意思预处理提交的脚本并搜索字符串,__class__或者__base__拒绝包含这些关键字的脚本.我也必须更换eval(),并exec()在我自己的,安全功能也拒绝运行包含这些关键字的代码脚本.

这种方法是否会与使用自定义globals参数覆盖所有潜在危险的物品(哪些会是?)exec()一起安全?我需要查找哪些关键字?

如果没有,为什么会失败?你能提出更好的解决方案吗?

Ser*_*sta 1

我不确定这是个好主意。可以使用 pypy,甚至是已经处理了大部分系统隔离的专用项目python 沙箱。但前者需要大量工作来构建安全环境,而后者并不直接支持Python 3.x

但pysandbox的作者自2013年起就停止了开发,因为他在其github站点中声明

pysandbox 的设计已被破坏,请移至新的沙箱解决方案(在沙箱中运行 python,而不是相反!)https://lwn.net/Articles/574215/ *

如果您可以接受有限的语法,那么定义专用语法并使用PythonLexYacc构建自定义解释器肯定会更安全。

我必须承认这比完整的答案更多的提示,但这是我现在能做的最好的事情(并且 python sandbox 没有引用前一个 SO 问题