如何验证Python字节码?
我想在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
这两个链接都比较旧,第一个链接里没有代码(至少我找不到),但可能对你了解可以做什么、怎么做以及有什么限制会有帮助。
完全有效的字节码仍然可能做出可怕的事情。