【问题标题】:How is it possible to execute python code during deserialization?如何在反序列化期间执行 python 代码?
【发布时间】:2020-01-31 19:01:03
【问题描述】:

我正在阅读有关持久实例上下文中酸洗的内容,并遇到了这个 sn-p:

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.x serialization pickle


    【解决方案1】:

    在这里写得非常详尽:https://intoli.com/blog/dangerous-pickles/

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2021-05-03
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多