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

Python函数“compile”和“compiler.parse”是否安全(沙盒)?

  •  4
  • dekomote  · 技术社区  · 14 年前

    我计划在web环境中使用这些函数,所以我担心这些函数是否可以被利用并用于在服务器上执行恶意软件。

    编辑: 我不执行结果。我解析AST树和/或捕获SyntaxError。

    try:
        #compile the code and check for syntax errors
        compile(code_string, filename, "exec")
    except SyntaxError, value:
        msg = value.args[0]
    
        (lineno, offset, text) = value.lineno, value.offset, value.text
    
        if text is None:
            return [{"line": 0, "offset": 0, 
                "message": u"Problem decoding source"}]
    
        else:
            line = text.splitlines()[-1]
    
            if offset is not None:
                offset = offset - (len(text) - len(line))
            else:
                offset = 0
    
            return [{"line": lineno, "offset": offset, "message": msg}]
    
    else:
        #no syntax errors, check it with pyflakes
        tree = compiler.parse(code_string)
        w = checker.Checker(tree, filename)
        w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
    

    checker.checker是解析AST树的pyflakes类。

    5 回复  |  直到 14 年前
        1
  •  2
  •   aaronasterling    14 年前

    compiler.parse compile 如果攻击者能够控制其输入并执行输出,则最有可能用于攻击。在大多数情况下,你要么 eval exec 他们的输出使它运行,所以那些仍然是通常的嫌疑犯和 编译 编译器.parse (不推荐使用BTW)只是在恶意输入和执行之间添加了另一个步骤。

    编辑: 刚刚看到你留下了一条评论,表明你实际上打算在 用户输入 . 别那么做。或者至少,不要实际执行结果。那是一个 巨大的 既然你澄清了你只想检查语法,这应该没问题。不过,我不会存储输出,因为没有理由让潜在的攻击者更容易进行任何操作,第一步就是能够在系统中获取任意代码。

    如果您确实需要存储它,我可能会支持类似于通常用于图像的方案,在该方案中,图像将以不可预测的方式重命名,并添加了确保它不存储在导入路径上的步骤。

        2
  •  4
  •   tobyodavies    14 年前

    我已经测试了一些我认为仅仅是语法检查器(不能重新定义类/函数等)的漏洞 无论如何,要让python在编译时执行任意代码

        3
  •  2
  •   Paulo Scardine    14 年前

    如果生成的代码或AST对象从未计算过,我认为您只会受到DDoS攻击。

    如果您正在评估用户输入的代码,这与向每个用户提供作为webserver用户的shell访问相同。

        4
  •  2
  •   Armin Ronacher    14 年前

    还感兴趣吗?前往jinja2。沙箱:)

        5
  •  1
  •   Pi Delport    14 年前

    是的,他们可以被恶意利用。

    如果你真的想要安全的沙箱,你可以看看 PyPy's sandboxing features 但是要知道沙箱并不容易,而且可能有更好的方法来完成你想要的。

    由于您已经更新了您的问题,以澄清您只是将不受信任的输入解析为AST,因此不需要对任何内容进行沙箱处理:沙箱处理是关于 执行 不受信任的代码(大多数人可能认为你的目标是通过询问沙箱)。

    compile / compiler 只有这样的解析才应该是安全的:Python源解析没有任何代码执行挂钩。(请注意,这不一定适用于所有语言:例如,不执行代码就无法(完全)分析Perl。)

    剩下的唯一风险是,可能有人能够编写一些病态的Python源代码,使其中一个解析器使用失控的内存/处理器时间,但资源耗尽攻击会影响所有内容,因此您只需要在必要时管理它。(例如,如果您的部署是任务关键型的,并且无法承受使用病态源代码的攻击者的拒绝服务,则可以在 resource-limited 子流程)。