Управление доступом для кода

Современные, в высокой степени взаимосвязанные компьютерные системы часто подвержены воздействию кода из разных, иногда неизвестных источников. Код может быть прикреплен к сообщению электронной почты, содержаться в документах или загружаться из Интернета. К сожалению, многие пользователи уже на собственном опыте испытали действие небезопасного кода, включая вирусы и черви, который может повреждать и уничтожать данные, приводя к потере времени и денег.

Большинство распространенных механизмов обеспечения безопасности предоставляют пользователям права на основе их пользовательских данных (обычно это пароль), и ограничивают доступ пользователей к ресурсам (как правило, папкам и файлам). Однако этот подход неспособен решить некоторые проблемы: пользователи получают код из множества источников, некоторые из которых могут быть ненадежны; код может содержать ошибки или уязвимые места, которые могут быть использованы вредоносным кодом. Кроме того, код в некоторых случаях может выполнять действия без ведома пользователя. В результате возможно повреждение компьютерных систем и утечка конфиденциальных данных, когда осмотрительные и благонадежные пользователи запускают вредоносное или содержащее множество ошибок программное обеспечение. Для выполнения кода большинство механизмов безопасности, применяемых в операционных системах, требуют, чтобы каждый его участок был полностью доверенным, кроме, возможно, сценариев на веб-страницах. Таким образом, необходим механизм безопасности с широкой областью применения, позволяющий коду, полученному от одной компьютерной системы, безопасно выполняться на другой системе даже при отсутствии отношений доверия между этими системами.

В целях защиты компьютерных систем от вредоносного мобильного кода, обеспечения возможности безопасного исполнения кода, поступившего из неизвестных источников, и защиты доверенного кода от преднамеренного или случайного нарушения систем безопасности платформа .NET Framework предоставляет механизм безопасности, называемый управлением доступом для кода. Управление доступом для кода позволяет определять разные уровни надежности для кода в зависимости от его происхождения и других свойств. Управление доступом для кода также обеспечивает соблюдение различных уровней доверия для кода, минимизируя количество кода, который должен быть полностью доверенным для его выполнения. Использование управления доступом для кода может снизить вероятность того, что код будет использован не по назначению вредоносным или содержащим множественные ошибки кодом. Оно может также ограничить ответственность разработчика благодаря возможности указания для кода набора операций, разрешенных к выполнению, и операций, которые должны всегда запрещаться. Управление доступом для кода помогает также снизить уровень возможных потерь от уязвимых мест в коде.

ПримечаниеПримечание

В .NET Framework 4 произошли серьезные изменения системы управления доступом для кода.Самое заметное изменение — это прозрачность безопасности, хотя в управлении доступом для кода произошли и другие важные изменения.Дополнительные сведения об этих изменениях см. в разделе Изменения системы безопасности в платформе .NET Framework 4.

Управление доступом для кода в основном затрагивает код библиотек и приложений с частичным доверием. Разработчики библиотек должны защищать свой код от несанкционированного доступа из приложений с частичным доверием. Приложения с частичным доверием — это приложения, загружаемые из внешних источников, например Интернета. Приложения, установленные на локальном компьютере или в локальной интрасети, выполняются с полным доверием. Приложения с полным доверием не затрагиваются управлением доступом для кода, если только они не помечены как прозрачные для системы безопасности, поскольку они пользуются полным доверием. Единственное ограничение для приложений с полным доверием состоит в том, что приложения с атрибутом SecurityTransparentAttribute не могут вызывать код, помеченный атрибутом SecurityCriticalAttribute. Приложения с частичным доверием должны запускаться в "песочнице" (например, в браузере Internet Explorer), чтобы к ним применялось управление доступом для кода. При попытке запуска приложения, загруженного из Интернета, на локальном компьютере возникает исключение NotSupportedException со следующим сообщением: "Предпринята попытка загрузки сборки из сетевого размещения, при которой в предыдущих версиях платформы .NET Framework сборка была бы изолирована. В данном выпуске платформы .NET Framework политика разграничения доступа кода по умолчанию недоступна, поэтому данная загрузка может быть опасной". Если надежность приложения не вызывает сомнений, можно разрешить для него запуск с полным доверием, используя элемент <loadFromRemoteSources>. Дополнительные сведения о запуске приложений в "песочнице" см. в разделе Практическое руководство. Выполнение не вполне безопасного кода в изолированной среде.

Любой управляемый код, попадающий в среду CLR, получает преимущества управления доступом для кода, даже если этот код не выполняет ни одного вызова управления доступом для кода. Дополнительные сведения см. в разделе Основы управления доступом для кода.

Ключевые функции управления доступом для кода

Система управления доступом для кода помогает ограничить доступ кода к защищенным ресурсам и операциям. В.NET Framework управление доступом для кода выполняет следующие функции.

  • Определяет разрешения и наборы разрешений, предоставляющие право доступа к различным системным ресурсам.

  • Позволяет коду требовать, чтобы вызывающий его код имел определенные разрешения.

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

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

Проход по стеку вызова

Чтобы определить, разрешено ли коду осуществлять доступ к ресурсу или выполнять операцию, система безопасности среды выполнения последовательно проверяет стек вызовов, сравнивая разрешения, выданные каждому вызывающему объекту, с разрешениями, которые были затребованы. Если какой-либо из вызывающих объектов в стеке вызовов не имеет требуемых разрешений, создается исключение безопасности и доступ отвергается. Проверка всего стека вызовов разработана с целью предотвращения отвлекающих атак, когда менее доверенный код вызывает более доверенный и использует его для выполнения неправомочных действий. Требование разрешений от всех вызывающих объектов во время выполнения влияет на производительность, но необходимо для защиты кода от отвлекающих атак со стороны менее доверенного кода. Для улучшения производительности можно заставить код выполнять меньшее количество проверок стека; однако нужно быть уверенным, что при этом в системе безопасности не возникнет уязвимостей.

На следующем рисунке показан проход по стеку, происходящий, когда метод сборки A4 требует, чтобы вызывающие его объекты обладали разрешением P.

Проверка стека безопасности

Управление доступом для кода

Связанные разделы

Заголовок

Описание

Основы управления доступом для кода

Описание управления доступом для кода и способов его использования.

Прозрачный с точки зрения безопасности код, уровень 2

Описание модели прозрачности безопасности в .NET Framework 4.

Использование библиотек из не вполне надежного кода

Предоставление доступа к библиотекам и использование библиотек из неуправляемого кода.

Написание безопасных библиотек классов

Вопросы безопасности библиотек классов.

Создание собственных разрешений доступа к коду

Описание создания пользовательских разрешений.

Основные понятия безопасности

Обзор многих ключевых терминов и принципов, используемых в системе безопасности .NET Framework.

Безопасность на основе ролей

Использование безопасности на основе ролей.

Службы криптографии

Использование шифрования в приложениях.

Средства обеспечения безопасности (платформа .NET Framework)

Средства, используемые для реализации и администрирования системы безопасности .NET Framework.