Если я сама засолу нить в Python, разве это может быть опасно? - PullRequest
2 голосов
/ 14 февраля 2020

Допустим, у нас есть база данных Postgres 12, в которой есть таблица с именем MyClass, в которой есть столбец Text с именем notes. У пользователей есть возможность сохранить все, что у них есть sh в этом поле для заметок. Для целей этого вопроса давайте предположим, что они каким-то образом обошли все санации данных.

Могут ли следующие строки кода быть опасными из-за вредоносного текста в obj.notes?

import pickle
# (obj is a Python3 instance of MyClass using the Django ORM, so obj.notes is always represented as a unicode string)
obj = MyClass.objects.get(id=1)
pickled = pickle.dumps(obj.notes)
unpickled = pickle.loads(pickled)

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Протокол python pickle (версия 4) сериализует строки в виде: токена, за которым следует длина строки, за которой следует содержимое в кодировке utf-8. Маркер является кодом, который отмечает, что данные должны интерпретироваться как строка (и определяет размер данных промежуточного целого числа). Таким образом, теоретически, все закодированные строковые данные будут скопированы непосредственно в новый строковый объект без разбора (не давая возможности содержимому строки влиять на поведение машины выбора).

Это означает, что даже вредоносная строка по-прежнему должна обрабатывать и открывать данные без изменений, и у них нет возможности перехватить машину для удаления и запустить произвольный код (в отличие от того, что сами данные были подвергнуты риску).

import pickle, pickletools
pickletools.dis(pickle.dumps("Hello World"))

Подробнее см. комментарии pickletools .

Ранее (версия протокола 0) вместо указания фиксированной длины протокол использовал разделитель для завершения строки и ожидаемое экранирование быть примененным (в случае, если тот же разделитель должен был появиться и внутри строки). В качестве альтернативы, даже с существующим протоколом, вы можете повторно реализовать средство выбора для выполнения сжатия строк повторяющихся последовательностей. В любом случае, безопасность зависит от того, что ваша библиотека pickle не содержит ошибок.

0 голосов
/ 14 февраля 2020

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

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

В нашем примере я бы сохранил идентификатор и использовал его для перезагрузки объекта из базы данных. Для других целей, когда я хочу перемещать данные в приложение и из него, я бы порекомендовал функцию load_safe из pyyaml ​​или loads из json (с кодером по умолчанию).

...