Как можно выполнить код python во время десериализации? - PullRequest
0 голосов
/ 31 января 2020

Я читал о мариновании в контексте сохраняющихся экземпляров и наткнулся на этот фрагмент:

Файлы маринования могут быть взломаны. Если вы получаете сырой файл рассола по сети, не доверяйте ему! В нем может быть вредоносный код, который будет запускаться произвольно 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__ на самом деле не запускается, когда экземпляр не выбран. Поэтому я до сих пор не понимаю, как заставить код работать во время этого процесса.

1 Ответ

1 голос
/ 31 января 2020

Действительно полная запись здесь: https://intoli.com/blog/dangerous-pickles/

Насколько я понимаю, это связано с тем, как соленья интерпретируются машиной для соления (PM) и работают. Вы можете создать файл рассола, который заставит его оценивать, используя eval() предоставленные операторы.

...