我即将从不受信任的来源获取一堆python脚本。
我想确保代码的任何部分都不会损害我的系统,这意味着:
(1) the code is not allowed to import ANY MODULE
(2) the code is not allowed to read or write any data, connect to the network etc
(每个脚本的目的是遍历列表,从给定的输入计算一些数据并返回计算值)
在我执行这样的代码之前,我想让一个脚本'检查'它,并确保那里没有任何危险可能会损害我的系统。
我想过使用以下方法:check that the word 'import' is not used (so we are guaranteed that no modules are imported)
然而,用户(如果需要)仍然可以编写代码来读/写文件等(例如,使用open
)。
接下来是问题:
(1)我在哪里可以得到一个'全局'的python方法列表(比如open
)?
(2)是否有一些代码可以添加到发送给我的每个脚本(在顶部),这会使某些“全局”方法对该脚本无效(例如,使用关键字{{ 1}}会导致异常)?
我知道有一些python沙盒的解决方案。但请尽量回答这个问题,因为我认为这是满足我需求的更相关方法。
编辑:假设我确保文件中没有open
,并且没有可能有害的方法(例如import
,open
,等等)。我可以断定该文件是安全的吗? (你能想到内置方法可以运行的任何其他“危险”方式吗?)
答案 0 :(得分:24)
这一点尚未制定,应该是:
您无法保护任意Python代码。
除非你想要安全问题,否则就可以使用虚拟机了。
答案 1 :(得分:9)
您仍然可以在不使用import
的情况下对eval
进行模糊处理:
s = '__imp'
s += 'ort__'
f = globals()['__builtins__'].__dict__[s]
** BOOM **
答案 2 :(得分:3)
请注意,您需要执行查找“文件”和“打开”的操作,因为两者都可以打开文件。
此外,正如其他人所指出的那样,这并不是100%肯定会阻止某人决定插入错误代码。
答案 3 :(得分:3)
一种方法应该比字符串匹配我们更好地使用module ast,解析python代码,在树上进行白名单过滤(例如只允许基本操作),然后编译并运行树。
Andrew Dalke关于操纵AST的this nice example。
答案 4 :(得分:2)
内置函数/关键字:
__import__
__builtins__
我可能没有想到其他很多其他人。
不幸的是,像这样的废话是可能的......
object().__reduce__()[0].__globals__["__builtins__"]["eval"]("open('/tmp/l0l0l0l0l0l0l','w').write('pwnd')")
所以事实证明关键字,导入限制以及默认情况下符号范围不足以覆盖,您需要验证整个图...
答案 5 :(得分:1)
使用虚拟机而不是在您关注的系统上运行它。
答案 6 :(得分:0)
如果没有沙盒环境,除了不运行之外,不可能防止 Python 文件对您的系统造成危害。
创建 Cryptominer、删除/加密/覆盖文件、运行 shell 命令以及对您的系统造成普遍危害很容易。
如果您使用的是 Linux,您应该能够使用 docker 来沙箱您的代码。
有关详细信息,请参阅此 GitHub 问题:https://github.com/raxod502/python-in-a-box/issues/2。
我确实在 GitHub 上遇到过 this,所以可以使用类似的东西,但是有很多限制。