Руководство по безопасности BinaryFormatterBinaryFormatter security guide

Эта статья применяется к следующим реализациям .NET:This article applies to the following .NET implementations:

  • Все версии .NET Framework.NET Framework all versions
  • .NET Core 2.1 – 3.1.NET Core 2.1 - 3.1
  • .NET 5.0 и более поздней версии.NET 5.0 and later

ФонBackground

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

Тип BinaryFormatter не является безопасным и не рекомендуется к применению для обработки данных.The BinaryFormatter type is dangerous and is not recommended for data processing. Даже если есть основания доверять обрабатываемым в приложении данным, следует как можно скорее прекратить использование типа BinaryFormatter.Applications should stop using BinaryFormatter as soon as possible, even if they believe the data they're processing to be trustworthy. Тип BinaryFormatter является небезопасным, и его безопасность нельзя обеспечить.BinaryFormatter is insecure and can't be made secure.

Эта статья также применима к следующим типам:This article also applies to the following types:

Уязвимости десериализации относятся к категории угроз, связанных с небезопасной обработкой полезных данных запроса.Deserialization vulnerabilities are a threat category where request payloads are processed insecurely. Использующие такие уязвимости злоумышленники могут провести на целевое приложение атаки, приводящие к отказу в обслуживании, раскрытию информации или удаленному выполнению кода в нем.An attacker who successfully leverages these vulnerabilities against an app can cause denial of service (DoS), information disclosure, or remote code execution inside the target app. Риски этой категории отнесены к 10 основным угрозам в рамках открытого проекта безопасности веб-приложений (OWASP).This risk category consistently makes the OWASP Top 10. В качестве целевых могут выступать приложения, написанные на самых разных языках, включая C/C++, Java и C#.Targets include apps written in a variety of languages, including C/C++, Java, and C#.

В .NET основная угроза связана с приложениями, в которых для десериализации данных используется тип BinaryFormatter.In .NET, the biggest risk target is apps that use the BinaryFormatter type to deserialize data. Тип BinaryFormatter широко применяется в экосистеме .NET благодаря своей эффективности и простоте использования.BinaryFormatter is widely used throughout the .NET ecosystem because of its power and its ease of use. Тем не менее, именно благодаря столь широким возможностям злоумышленники могут использовать его для внедрения в поток управления целевого приложения.However, this same power gives attackers the ability to influence control flow within the target app. В случае успешной атаки злоумышленник получает возможность выполнять код в контексте целевого процесса.Successful attacks can result in the attacker being able to run code within the context of the target process.

Для простоты можно привести следующую аналогию: вызов BinaryFormatter.Deserialize в отношении полезной нагрузки эквивалентен интерпретации такой нагрузки как автономного исполняемого файла и его запуску.As a simpler analogy, assume that calling BinaryFormatter.Deserialize over a payload is the equivalent of interpreting that payload as a standalone executable and launching it.

Уязвимости безопасности BinaryFormatterBinaryFormatter security vulnerabilities

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

Метод BinaryFormatter.Deserialize ни при каких обстоятельствах не может считаться безопасным при работе с входными данными, не относящимися к доверенным.The BinaryFormatter.Deserialize method is never safe when used with untrusted input. Вместо него мы настоятельно рекомендуем использовать любой из описываемых далее в этой статье альтернативных подходов.We strongly recommend that consumers instead consider using one of the alternatives outlined later in this article.

Тип BinaryFormatter был реализован еще до того, как были четко определены угрозы, связанные с уязвимостями десериализации.BinaryFormatter was implemented before deserialization vulnerabilities were a well-understood threat category. Соответственно, его код не соответствует современным рекомендациям.As a result, the code does not follow modern best practices. Таким образом, злоумышленники могут использовать метод Deserialize для проведения атак типа "отказ в обслуживании" на использующее его приложение.The Deserialize method can be used as a vector for attackers to perform DoS attacks against consuming apps. В случае успешного проведения подобных атак приложение может перестать отвечать, а также может произойти непредвиденное завершение процесса.These attacks might render the app unresponsive or result in unexpected process termination. Обратите внимание, что предотвратить атаки этой категории с помощью SerializationBinder или любого другого параметра конфигурации BinaryFormatter невозможно.This category of attack cannot be mitigated with a SerializationBinder or any other BinaryFormatter configuration switch. В .NET такое поведение считается преднамеренным и не приводит к изменению поведения в результате обновления кода..NET considers this behavior to be by design and won't issue a code update to modify the behavior.

Метод BinaryFormatter.Deserialize также может быть уязвим для атак других категорий, например, ведущих к раскрытию информации или удаленному выполнению кода.BinaryFormatter.Deserialize may be vulnerable to other attack categories, such as information disclosure or remote code execution. При этом в достаточной степени снизить соответствующие риски с помощью таких функций, как пользовательский класс SerializationBinder, не всегда возможно.Utilizing features such as a custom SerializationBinder may be insufficient to properly mitigate these risks. Кроме того, существует вероятность выявления новых уязвимостей, для которых будет невозможна своевременная публикация обновлений системы безопасности .NET.The possibility exists that a novel vulnerability will be discovered for which .NET cannot practically publish a security update. Мы рекомендуем всем потребителям проанализировать особенности конкретных сценариев применения и оценить их уязвимость в отношении этих рисков.Consumers should assess their individual scenarios and consider their potential exposure to these risks.

Кроме того, если в ваших приложениях используется тип BinaryFormatter, мы рекомендуем провести отдельную оценку рисков для них.We recommend that BinaryFormatter consumers perform individual risk assessments on their apps. Ответственность за использование типа BinaryFormatter полностью возлагается на потребителя.It is the consumer's sole responsibility to determine whether to utilize BinaryFormatter. Потребители должны самостоятельно оценивать угрозы в области нарушения безопасности, возникновения технических проблем, потери репутации, а также несоответствия юридическим и нормативным требованиям, которые влечет за собой применение типа BinaryFormatter.Consumers should risk assess the security, technical, reputation, legal, and regulatory requirements of using BinaryFormatter.

Рекомендуемые альтернативыPreferred alternatives

В .NET предлагается несколько встроенных сериализаторов, которые обеспечивают безопасную работу с ненадежными данными:.NET offers several in-box serializers that can handle untrusted data safely:

Опасные альтернативные вариантыDangerous alternatives

Не рекомендуется использовать следующие сериализаторы:Avoid the following serializers:

Все описываемые выше сериализаторы выполняют неограниченную полиморфную десериализацию и, как и BinaryFormatter, являются небезопасными.The preceding serializers all perform unrestricted polymorphic deserialization and are dangerous, just like BinaryFormatter.

Риски, связанные с необоснованным доверием даннымThe risks of assuming data to be trustworthy

Зачастую разработчик приложения полагается на то, что в нем обрабатываются только надежные данные.Frequently, an app developer might believe that they are processing only trusted input. Однако на самом деле входные данные действительно являются безопасными лишь в редких случаях.The safe input case is true in some rare circumstances. Куда чаще полезная нагрузка выходит за границы доверенной области, о чем разработчик может даже не догадываться.But it's much more common that a payload crosses a trust boundary without the developer realizing it.

Рассмотрим локальный сервер, где располагается служба, с которой сотрудники взаимодействуют при помощи установленных на рабочих станциях классических версий клиента.Consider an on-prem server where employees use a desktop client from their workstations to interact with the service. Такой сценарий может ошибочно считаться безопасным, в котором допустимо применение типа BinaryFormatter.This scenario might be seen naïvely as a "safe" setup where utilizing BinaryFormatter is acceptable. Тем не менее, в нем существует способ проникновения вредоносных программ, которые могут получать доступ к компьютеру отдельного сотрудника и затем распространятся по всей организации.However, this scenario presents a vector for malware that gains access to a single employee's machine to be able to spread throughout the enterprise. Если организация использует тип BinaryFormatter, благодаря ему такие вредоносные программы могут проникнуть с рабочей станции сотрудника на внутренний сервер.That malware can leverage the enterprise's use of BinaryFormatter to move laterally from the employee's workstation to the backend server. После этого они смогут перехватывать конфиденциальные данные компании.It can then exfiltrate the company's sensitive data. К ним, помимо прочего, могут относиться данные клиентов или сведения, представляющие коммерческую тайну.Such data could include trade secrets or customer data.

Также рассмотрим приложение, в котором тип BinaryFormatter применяется для хранения состояния сохранения.Consider also an app that uses BinaryFormatter to persist save state. Как и в предыдущем случае, этот сценарий может изначально показаться безопасным, поскольку операции чтения данных с собственного жесткого диска и записи на него вряд ли могут представлять особую угрозу.This might at first seem to be a safe scenario, as reading and writing data on your own hard drive represents a minor threat. Тем не менее, многие современные пользователи активно обмениваются документами через электронную почту и Интернет, но при этом спокойно открывают скачанные файлы, не рассматривая их как угрозу.However, sharing documents across email or the internet is common, and most end users wouldn't perceive opening these downloaded files as risky behavior.

Такой сценарий также может быть использован злоумышленниками.This scenario can be leveraged to nefarious effect. Например, пользователи игрового приложения, которые обмениваются сохраненными файлами, непреднамеренно подвергают себя риску.If the app is a game, users who share save files unknowingly place themselves at risk. Кроме того, целью злоумышленников могут быть и сами разработчики.The developers themselves can also be targeted. Злоумышленник может отправить в службу поддержки разработчика электронное письмо, приложив к нему вредоносный файл данных и попросив сотрудника открыть его.The attacker might email the developers' tech support, attaching a malicious data file and asking the support staff to open it. Таким образом, злоумышленник может проникнуть в инфраструктуру организации.This kind of attack could give the attacker a foothold in the enterprise.

Кроме того, файл данных может размещаться в облачном хранилище и автоматически синхронизироваться с компьютерами пользователей.Another scenario is where the data file is stored in cloud storage and automatically synced between the user's machines. В таком сценарии злоумышленник может получить доступ к учетной записи облачного хранилища и внедрить в этот файл вредоносный код или заменить его.An attacker who is able to gain access to the cloud storage account can poison the data file. После этого вредоносный файл автоматически синхронизируется с компьютерами пользователей.This data file will be automatically synced to the user's machines. В следующий раз, когда пользователь откроет этот файл данных, будет запущена вредоносная полезная нагрузка.The next time the user opens the data file, the attacker's payload runs. Таким образом, злоумышленник может использовать учетную запись облачного хранилища для получения полных разрешений на выполнение кода.Thus the attacker can leverage a cloud storage account compromise to gain full code execution permissions.

Рассмотрим приложение, для которого классическая модель установки заменяется облачной.Consider an app that moves from a desktop-install model to a cloud-first model. Например, этот сценарий может включать в себя классические приложения, для которых осуществляется переход к модели полнофункционального клиента или веб-приложения.This scenario includes apps that move from a desktop app or rich client model into a web-based model. Модели угроз, характерные для классических приложений, не обязательно будут относиться к облачным службам.Any threat models drawn for the desktop app aren't necessarily applicable to the cloud-based service. К примеру, определенная угроза может исключаться, поскольку клиент не заинтересован в атаке на собственную систему.The threat model for the desktop app might dismiss a given threat as "not interesting for the client to attack itself." Тем не менее, та же самая угроза становится вполне реальной в контексте намерения удаленного пользователя (клиента) атаковать саму облачную службу.But that same threat might become interesting when it considers a remote user (the client) attacking the cloud service itself.

Примечание

В общем смысле сериализация предназначена для передачи объекта в приложение или из него.In general terms, the intent of serialization is to transmit an object into or out of an app. В рамках моделирования угроз подобные операции передачи данных почти всегда рассматриваются как пересекающие границу доверия.A threat modeling exercise almost always marks this kind of data transfer as crossing a trust boundary.

Дополнительные ресурсыFurther resources