Знаю о проблемах с безопасностью у Pickle, но она заключается в основе своей в методе __REDUCE__, который позволяет исполнить произвольный код.
Написав код взлома
import pickle
class cls3(object):
def __reduce__(self):
import subprocess
return (eval, (('print("hacked")'),))
t = pickle.dumps(cls3())
pickle.loads(t)
При разборе этого класса pickletools сказал следующее
0: \x80 PROTO 3
2: c GLOBAL 'builtins eval'
17: q BINPUT 0
19: X BINUNICODE 'print("hacked")'
39: q BINPUT 1
41: \x85 TUPLE1
42: q BINPUT 2
44: R REDUCE
45: q BINPUT 3
47: . STOP
highest protocol among opcodes = 2
Проблема заключается в BINPUT+REDUCE+BINPUT т.е. чисто теоретически если в приходящей строке будет эти 3 инструкции, то можно сразу браковать сообщение с помощью
if str(t).find('\\x02Rq\\x03.') != -1:
raise Exception("Secure error")
Это вообще обходится или стоит оставить эти игры с огнем?