Протокол python pickle (версия 4) сериализует строки в виде: токена, за которым следует длина строки, за которой следует содержимое в кодировке utf-8. Маркер является кодом, который отмечает, что данные должны интерпретироваться как строка (и определяет размер данных промежуточного целого числа). Таким образом, теоретически, все закодированные строковые данные будут скопированы непосредственно в новый строковый объект без разбора (не давая возможности содержимому строки влиять на поведение машины выбора).
Это означает, что даже вредоносная строка по-прежнему должна обрабатывать и открывать данные без изменений, и у них нет возможности перехватить машину для удаления и запустить произвольный код (в отличие от того, что сами данные были подвергнуты риску).
import pickle, pickletools
pickletools.dis(pickle.dumps("Hello World"))
Подробнее см. комментарии pickletools .
Ранее (версия протокола 0) вместо указания фиксированной длины протокол использовал разделитель для завершения строки и ожидаемое экранирование быть примененным (в случае, если тот же разделитель должен был появиться и внутри строки). В качестве альтернативы, даже с существующим протоколом, вы можете повторно реализовать средство выбора для выполнения сжатия строк повторяющихся последовательностей. В любом случае, безопасность зависит от того, что ваша библиотека pickle не содержит ошибок.