V5.5.3 Deserialization Prevention
Requirement:#
Verify that deserialization of untrusted data is avoided or is protected in both custom code and third-party libraries (such as JSON, XML and YAML parsers).
Explanation:#
Часто удобно сериализовать объекты для связи или сохранить их для последующего использования. Однако десериализованные данные или код часто могут быть изменены без использования предоставленных функций доступа, если они не используют криптографию для своей защиты. Кроме того, любая криптография по-прежнему будет безопасностью на стороне клиента, что является опасным предположением безопасности.
Данные, которые не являются доверенными, нельзя доверять, чтобы они были хорошо сформированы.
Когда разработчики не накладывают ограничений на «цепочки гаджетов» или серию вызовов экземпляров и методов, которые могут выполняться самостоятельно во время процесса десериализации (т. е. до того, как объект будет возвращен вызывающему объекту), злоумышленники иногда могут использовать их для выполнения несанкционированных действий, таких как создание оболочки.
Remediation:#
Вот план исправления для предотвращения десериализации ненадежных данных:
- По возможности избегайте десериализации ненадежных данных: если десериализация ненадежных данных не требуется, ее следует полностью избегать. Это лучший способ предотвратить атаки, связанные с десериализацией.
- Используйте безопасные библиотеки десериализации. Если требуется десериализация, используйте библиотеки, которые заведомо безопасны и протестированы против атак десериализации.
- Проверяйте входные данные перед десериализацией. Перед десериализацией любых данных важно проверить входные данные, чтобы убедиться, что они безопасны и не содержат вредоносных полезных нагрузок.
- Реализуйте пользовательские процедуры десериализации с учетом безопасности. Если требуются пользовательские процедуры десериализации, их следует реализовывать с учетом безопасности. Например, проверив данные перед их десериализацией или используя безопасную библиотеку десериализации.
- Проводите проверки кода и тестирование на проникновение. Регулярные проверки кода и тестирование на проникновение могут помочь выявить любые уязвимости, связанные с десериализацией, и обеспечить их исправление до того, как злоумышленник сможет их использовать.
Важно серьезно относиться к безопасности десериализации, поскольку она может быть вектором для многих типов атак, включая удаленное выполнение кода, подделку данных и раскрытие информации. Следуя этим рекомендациям, вы поможете защитить свои приложения и обезопасить своих пользователей.
Вот пример того, как проверить входные данные перед их десериализацией в Python:
В этом примере функция deserialize_json принимает json_string в качестве входных данных и использует функцию json.loads из библиотеки json для ее анализа. Перед возвратом десериализованных данных входные данные проверяются, чтобы убедиться, что это словарь. Если ввод не является словарем, возникает ошибка ValueError. Кроме того, если функция json.loads вызывает ошибку json.JSONDecodeError, возникает другая ошибка ValueError с сообщением «Недопустимые данные JSON».
Additional:#
CWE - CWE-502: Десериализация ненадежных данных (4.9) (mitre.org)