如何验证Python字节码?

6 投票
3 回答
704 浏览
提问于 2025-04-18 04:04

我想在Python中进行一些字节码操作(可以理解为基因编程)。

我在Python源代码树的崩溃测试部分发现了一个测试案例,上面写着:

损坏的字节码对象很容易导致解释器崩溃。这是不会被修复的。

所以我想问,如何验证修改过的字节码不会让解释器崩溃?这可能吗?

测试源代码,来自http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

cc = (lambda fc=(
    lambda n: [
        c for c in
            ().__class__.__bases__[0].__subclasses__()
            if c.__name__ == n
        ][0]
    ):
    fc("function")(
        fc("code")(
            0, 0, 0, 0, "KABOOM", (), (), (), "", "", 0, ""
        ), {}
    )()
)

在这里,这个模块定义了一个叫cc的函数,如果调用它,mymod.cc()就会让解释器崩溃。这个例子确实很棘手,因为它创建了一个新的代码对象,并使用了自定义的字节码"KABOOM",然后运行它。

我希望能有一种方法来验证预定义的字节码,比如来自一个.pyc文件的字节码。

3 个回答

1

Python 可能不是做这些任务的最佳语言,原因在问题中已经提到过了。

一种方法是:不要直接创建或接受原始的字节码,只接受 Python 源代码,然后自己进行编译。

此外,还有一些库(RestrictedPython)可以在抽象语法树(AST)层面上处理 Python,以提供一些安全保障,比如防止沙箱逃逸。

3

使用字节码汇编器可以在程序跳转时跟踪栈的状态,它会全局检查栈的层级预测是否一致,并自动拒绝生成无用的代码。几乎不可能意外生成会导致解释器崩溃的字节码。

这个 链接 可能对你有帮助。

1

这两个链接都比较旧,第一个链接里没有代码(至少我找不到),但可能对你了解可以做什么、怎么做以及有什么限制会有帮助。

完全有效的字节码仍然可能做出可怕的事情。

撰写回答