Подтвердить что ты не робот

Нападение питонного рассола

Я пишу веб-приложение, которое хранит пользовательский ввод в объекте. Этот объект будет маринован.

Возможно ли, что пользователь может создать вредоносный ввод, который может сделать что-то грубое, когда объект не заполнен?

Вот действительно простой пример кода, который игнорирует замечательные принципы, такие как инкапсуляция, но олицетворяет то, что я ищу:

import pickle

class X(object):
    some_attribute = None

x = X()
x.some_attribute = 'insert some user input that could possibly be bad'

p = pickle.dumps(x)

# Can bad things happen here if the object, before being picked, contained
# potentially bad data in some_attribute?
x = pickle.loads(p)
4b9b3361

Ответ 1

Да и нет...

Нет - если нет ошибки с интерпретатором или модулем рассола, вы не можете запускать произвольный код с помощью маринованного текста или что-то в этом роде. если маринованный текст eval ed позже, или вы делаете такие вещи, как создание нового объекта с типом, упомянутым в этих данных.

Да - в зависимости от того, что вы планируете делать с информацией в объекте позже, пользователь может делать всевозможные вещи. Из попыток внедрения SQL, изменения учетных данных, взлома паролей в грубой форме или всего, что следует учитывать при проверке ввода пользователя. Но вы, вероятно, проверяете все это.

Изменить:

В документации на python указано следующее: 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.

Однако это не ваш случай - вы принимаете вход, выставляете его через регулярную проверку, а затем рассовываете его.

Ответ 2

Хорошо согласно документации

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.

Это означало бы, что можно атаковать эту функциональность, просто вызвав ее, если структура данных существовала в таком состоянии, что алгоритм рассола входил в состояние, когда поведение программы не гарантировалось.

В соответствии с этим сайт

 import pickle
pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") # This will run: ls ~

Все, что требуется для выполнения произвольного кода. Существуют и другие примеры, а также "улучшение" для травления в целях безопасности.

Ответ 3

Я нашел это в документации модуля многопроцессорности, который, как я думаю, отвечает на вопрос:

Предупреждение

Метод Connection.recv() автоматически распаковывает данные, которые он получает, что может представлять угрозу безопасности, если вы не можете доверять который отправил сообщение.

Следовательно, , если объект подключения не был создан с использованием Pipe(), вы следует использовать методы recv() и send() после выполнения некоторых вид аутентификации. См. Раздел "Идентификационные ключи".

(акцент мой)

Заключение заключается в том, что если объект соединения создается с использованием доверенной трубы, то есть надежного рассола, тогда он может быть безопасно рассыпан.