Zerstoren
@Zerstoren

Обезопасить прием pickle сообщений?

Знаю о проблемах с безопасностью у 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")


Это вообще обходится или стоит оставить эти игры с огнем?
  • Вопрос задан
  • 2541 просмотр
Пригласить эксперта
Ответы на вопрос 2
bobrovskyserg
@bobrovskyserg
У вас какая-то дивная задача.
Хотелось бы подробностей.
А так, навскидку - чужой код и без евлаов с екзеками может дров наломать.
Ответ написан
sumej
@sumej
DevOps
Я понимаю, что речь идёт про Exploiting Misuse of Python's "Pickle", Playing with Pickle Security.
В данной статье он еще и медленный
Don't Pickle Your Data:
Pickle is slow

Pickle is both slower and produces larger serialized values than most of the alternatives.
To illustrate this, I put together a simple benchmark comparing pickle to the built in JSON module, the Apache Thrift library, and MessagePack. This benchmark measures the number of objects a second each of these libraries can read and write. The data being serialized here are just randomly generated fake 'Tweet' objects containing just four fields:

Pickle is the clear underperformer here. Even the 'cPickle' extension thats written in C has a serialization rate thats about a quarter that of JSON or Thrift. Pickle also produces serialized values that are around double the size of Thrift or MessagePack.


Но на что бы я обратил внимание:
Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.


Я думаю лучше поискать другое решение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы