首页 > 解决方案 > 如何在反序列化期间执行 python 代码?

问题描述

我正在阅读有关持久实例上下文中的酸洗的信息,并遇到了这个片段:

Pickle 文件可以被黑客入侵。如果您通过网络收到原始 pickle 文件,请不要相信它!它可能包含恶意代码,当您尝试对其进行反酸处理时会运行任意 python。[1]

我的理解是酸洗将数据结构转换为字节数组,并且泡菜库还包含获取酸洗字节数组并从中重建python实例的方法。

我测试了一些代码,看看是否只需将代码放入类或 init 方法中就可以运行它:

import pickle

class A:
    print('class')
    def __init__(self):
        print('instance')

a = A()

print('pickling...')
with open('/home/usrname/Desktop/pfile', 'wb') as pfile:
    pickle.dump(a, pfile, pickle.HIGHEST_PROTOCOL)

print('de-pickling...')
with open('/home/usrname/Desktop/pfile', 'rb') as pfile:
    a2 = pickle.load(pfile)

然而,这只会产生

class
instance
pickling...
de-pickling...

暗示 __ init__ 方法在实例未腌制时实际上并没有运行。所以我仍然很困惑如何在该过程中运行代码。

标签: python-3.xserializationpickle

解决方案


在这里写得很透彻:https ://intoli.com/blog/dangerous-pickles/

据我了解,这与泡菜机(PM)如何解释泡菜并运行有关。您可以制作一个 pickle 文件,使其使用eval()提供的语句进行评估。


推荐阅读