危险的Python关键词?

时间:2011-04-01 18:51:59

标签: python

我即将从不受信任的来源获取一堆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,并且没有可能有害的方法(例如importopen,等等)。我可以断定该文件是安全的吗? (你能想到内置方法可以运行的任何其他“危险”方式吗?)

7 个答案:

答案 0 :(得分:24)

这一点尚未制定,应该是:

  

您无法保护任意Python代码。

除非你想要安全问题,否则就可以使用虚拟机了。

答案 1 :(得分:9)

您仍然可以在不使用import的情况下对eval进行模糊处理:

s = '__imp'
s += 'ort__'
f = globals()['__builtins__'].__dict__[s]
** BOOM **

答案 2 :(得分:3)

Built-in functions

Keywords

请注意,您需要执行查找“文件”和“打开”的操作,因为两者都可以打开文件。

此外,正如其他人所指出的那样,这并不是100%肯定会阻止某人决定插入错误代码。

答案 3 :(得分:3)

一种方法应该比字符串匹配我们更好地使用module ast,解析python代码,在树上进行白名单过滤(例如只允许基本操作),然后编译并运行树。

Andrew Dalke关于操纵AST的this nice example

答案 4 :(得分:2)

内置函数/关键字:

  • EVAL
  • EXEC
  • __import__
  • 文件
  • 输入
  • 的execfile
  • 如果你有一个在看到某些输出时执行代码的哑壳,那么
  • print会很危险。
  • 标准输入
  • __builtins__
  • 必须阻止
  • globals()和locals(),否则它们可用于绕过您的规则

我可能没有想到其他很多其他人。

不幸的是,像这样的废话是可能的......

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,所以可以使用类似的东西,但是有很多限制。


另一种方法是创建另一个 Python 文件,该文件解析原始文件、删除错误代码并运行该文件。然而,这仍然是一击即中。