Прозрачный для системы безопасности код, уровень 1Security-Transparent Code, Level 1

Внимание!

Управление доступом для кода и частично доверенный кодCode Access Security and Partially Trusted Code

Платформа .NET Framework предоставляет механизм для принудительного применения различных уровней доверия к разным частям кода, выполняемым в одном и том же приложении. Этот механизм называется управлением доступом для кода.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). Управление доступом для кода в .NET Framework не следует использовать в качестве механизма обеспечения границ безопасности на основе происхождения кода или других аспектов, связанных с удостоверениями.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Мы обновляем рекомендации с учетом того, что управление доступом для кода и прозрачный для системы безопасности код не будут поддерживаться в качестве механизма безопасности при работе с частично доверенным кодом, особенно с кодом неизвестного происхождения.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Мы не рекомендуем загружать и выполнять код из неизвестных источников, не предприняв дополнительные меры безопасности.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Эта политика действует в отношении всех версий платформы .NET Framework, кроме платформы .NET Framework в составе Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Прозрачность позволяет разработчикам создавать более безопасные библиотеки .NET Framework, предоставляющие частично доверенному коду доступ к функциям.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. Прозрачность уровня 1 появилась в платформе .NET Framework версии 2.0 и в основном использовалась только корпорацией Майкрософт.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. Начиная с .NET Framework 4 можно использовать прозрачность уровня 2.Starting with the .NET Framework 4, you can use level 2 transparency. Однако прозрачность уровня 1 была сохранена, чтобы можно было найти устаревший код, который должен выполняться с более ранними правилами безопасности.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Важно!

Прозрачность уровня 1 следует указывать только для совместимости, то есть уровень 1 следует задавать только для кода, разработанного на платформе .NET Framework 3.5 или более ранней версии и использующего AllowPartiallyTrustedCallersAttribute или не использующего модель прозрачности.You should specify level 1 transparency for compatibility only; that is, specify level 1 only for code that was developed with the .NET Framework 3.5 or earlier that uses the AllowPartiallyTrustedCallersAttribute or does not use the transparency model. Например, используйте прозрачность уровня 1 для сборок .NET Framework 2.0, которые допускают вызовы из частично доверенных вызывающих объектов (APTCA).For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). Для кода, разработанного для .NET Framework 4, всегда используйте прозрачность уровня 2.For code that is developed for the .NET Framework 4, always use level 2 transparency.

В этом разделе содержатся следующие подразделы.This topic contains the following sections:

Модель прозрачности уровня 1The Level 1 Transparency Model

При использовании прозрачности уровня 1 применяемая модель безопасности разделяет весь код на прозрачные, надежные и критические с точки зрения безопасности методы.When you use Level 1 transparency, you are using a security model that separates code into security-transparent, security-safe-critical, and security-critical methods.

Пометить как прозрачную с точки зрения безопасности можно всю сборку, некоторые ее классы или некоторые методы класса.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. Прозрачный с точки зрения безопасности код не может повышать уровень привилегий.Security-transparent code cannot elevate privileges. Это ограничение имеет три последствия.This restriction has three consequences:

  • Прозрачный с точки зрения безопасности код не может выполнять действия Assert.Security-transparent code cannot perform Assert actions.

  • Требования связывания, которым должен удовлетворять прозрачный с точки зрения безопасности код, становятся полными требованиями.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Небезопасный (непроверяемый) код, который должен выполняться в рамках прозрачного с точки зрения безопасности кода, вызывает полное требование для разрешения безопасности UnmanagedCode.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Применение этих правил во время выполнения обеспечивается средой CLR.These rules are enforced during execution by the common language runtime (CLR). Прозрачный с точки зрения безопасности код передает все требования безопасности вызываемого кода вызывающим объектам.Security-transparent code passes all the security requirements of the code it calls back to its callers. Требования, которые обрабатываются прозрачным с точки зрения безопасности кодом, не могут повышать уровень привилегий.Demands that flow through the security-transparent code cannot elevate privileges. Если приложение с низким уровнем доверия обращается к прозрачному с точки зрения безопасности коду и вызывает требование высокой привилегии, это требование будет перенаправлено обратно в код с низким уровнем доверия и не будет удовлетворено.If a low-trust application calls security-transparent code and causes a demand for high privilege, the demand will flow back to the low-trust code and fail. Прозрачный с точки зрения безопасности код не может приостановить действие требования, так как он не может осуществлять действия Assert.The security-transparent code cannot stop the demand because it cannot perform assert actions. При вызове того же прозрачного с точки зрения безопасности кода из кода с полным доверием требование будет удовлетворено.The same security-transparent code called from full-trust code results in a successful demand.

Критические с точки зрения безопасности методы являются противоположностью прозрачных с точки зрения безопасности.Security-critical is the opposite of security-transparent. Критический с точки зрения безопасности код выполняется с полным доверием и может выполнять операции с любым уровнем привилегий.Security-critical code executes with full trust and can perform all privileged operations. Надежный с точки зрения безопасности код является привилегированным кодом, прошедшим расширенный аудит безопасности, в результате которого было подтверждено, что он не позволяет частично доверенным вызывающим объектам использовать ресурсы, на доступ к которым у них нет разрешения.Security-safe-critical code is privileged code that has been through an extensive security audit to confirm that it does not allow partially trusted callers to use resources they do not have permission to access.

Прозрачность необходимо применять явно.You have to apply transparency explicitly. Большая часть кода, отвечающая за обработку данных и логику, обычно может быть помечена как прозрачная с точки зрения безопасности, в то время как меньшая часть, выполняющая повышение привилегий, помечается как критическая или надежная с точки зрения безопасности.The majority of your code that handles data manipulation and logic can typically be marked as security-transparent, whereas the lesser amount of code that performs elevations of privileges is marked as security-critical or security-safe-critical.

Важно!

Прозрачность уровня 1 ограничена областью сборки; она не применяется между сборками.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. Прозрачность уровня 1 первоначально использовалась в продуктах Майкрософт в целях аудита безопасности.Level 1 transparency was primarily used within Microsoft for security audit purposes. К критическим с точки зрения безопасности типам и членам сборки уровня 1 может получать доступ прозрачный с точки зрения безопасности код из других сборок.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. Очень важно выполнять запросы компоновки с полным доверием во всех критических с точки зрения безопасности типах и членах уровня 1.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. Надежные с точки зрения безопасности типы и члены также должны подтверждать, что вызывающие объекты обладают разрешениями в отношении защищенных ресурсов, доступ к которым осуществляется типом или членом.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

Для обеспечения обратной совместимости с предыдущими версиями .NET Framework все члены, не помеченные атрибутами прозрачности, считаются надежными с точки зрения безопасности.For backward compatibility with earlier versions of the .NET Framework, all members that are not annotated with transparency attributes are considered to be security-safe-critical. Все непомеченные типы считаются прозрачными.All types that are not annotated are considered to be transparent. Для проверки прозрачности не существует правил статического анализа.There are no static analysis rules to validate transparency. Поэтому может потребоваться отладка ошибок времени выполнения, связанных с прозрачностью.Therefore, you may need to debug transparency errors at run time.

Атрибуты прозрачностиTransparency Attributes

В таблице ниже описываются три атрибута, используемые для указания прозрачности кода.The following table describes the three attributes that you use to annotate your code for transparency.

АтрибутAttribute ОписаниеDescription
SecurityTransparentAttribute Применяется только на уровне сборки.Allowed only at the assembly level. Помечает все типы и члены внутри сборки как прозрачные с точки зрения безопасности.Identifies all types and members in the assembly as security-transparent. При этом сборка не может содержать критический с точки зрения безопасности код.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute При использовании на уровне сборки без свойства Scope помечает весь код внутри сборки как прозрачный с точки зрения безопасности по умолчанию, однако показывает, что сборка может содержать критический с точки зрения безопасности код.When used at the assembly level without the Scope property, identifies all code in the assembly as security-transparent by default, but indicates that the assembly may contain security-critical code.

При использовании на уровне класса помечает класс или метод как критический с точки зрения безопасности.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Чтобы пометить все члены как критические с точки зрения безопасности, установите для свойства Scope значение Everything.To make all the members security-critical, set the Scope property to Everything.

При использовании на уровне члена атрибут применяется только к этому члену.When used at the member level, the attribute applies only to that member.

Класс или метод, помеченный как критический с точки зрения безопасности, может осуществлять повышение привилегий.The class or member identified as security-critical can perform elevations of privilege. Важно! При прозрачности уровня 1, критические с точки зрения безопасности типы и члены считаются надежными с точки зрения безопасности, если они вызываются из-за пределов сборки.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the assembly. Чтобы предотвратить несанкционированное повышение привилегий, нужно защитить критические с точки зрения безопасности типы и члены запросом компоновки с полным доверием.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Помечает критический с точки зрения безопасности код, доступ к которому может получить прозрачный с точки зрения безопасности код в сборке.Identifies security-critical code that can be accessed by security-transparent code in the assembly. В противном случае прозрачный с точки зрения безопасности код не может получить доступ к закрытым или внутренним членам, критическим с точки зрения безопасности, внутри этой же сборки.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Возможность такого доступа могла бы повлиять на работу критического с точки зрения безопасности кода и сделать возможным непредусмотренное повышение привилегий.Doing so would influence security-critical code and make unexpected elevations of privilege possible. Надежный с точки зрения безопасности код должен проходить строгий аудит безопасности.Security-safe-critical code should undergo a rigorous security audit. Примечание. Надежные с точки зрения безопасности типы и члены должны проверять разрешения вызывающих объектов, чтобы определить, имеют ли они право на доступ к защищенным ресурсам.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

Атрибут SecuritySafeCriticalAttribute позволяет прозрачному с точки зрения безопасности коду получать доступ к критическим с точки зрения безопасности членам внутри этой же сборки.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Следует стараться разграничивать прозрачный и критический с точки зрения безопасности код внутри сборки, как если бы он принадлежал двум разным сборкам.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. Прозрачный с точки зрения безопасности код не сможет получать доступ к закрытым или внутренним членам критического с точки зрения безопасности кода.The security-transparent code would not be able to see the private or internal members of the security-critical code. Кроме того, для критического с точки зрения безопасности кода обычно применяется контролируемый доступ к его открытому интерфейсу.Additionally, the security-critical code is generally audited for access to its public interface. Доступ к закрытому или внутреннему состоянию извне сборки обычно является нежелательным. Как правило, стремятся изолировать это состояние.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. Атрибут SecuritySafeCriticalAttribute обеспечивает изоляцию состояния между прозрачным и критическим с точки зрения безопасности кодом, но в то же время дает возможность при необходимости переопределить изоляцию.The SecuritySafeCriticalAttribute attribute maintains the isolation of state between security-transparent and security-critical code while providing the ability to override the isolation when it is necessary. Прозрачный с точки зрения безопасности код может получить доступ к закрытым или внутренним членам критического с точки зрения безопасности кода, только если эти члены помечены атрибутом SecuritySafeCriticalAttribute.Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Перед применением атрибута SecuritySafeCriticalAttribute проведите аудит соответствующего члена, как если бы он был открытым.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Заметка на уровне сборкиAssembly-wide Annotation

В таблице ниже описываются последствия использования атрибутов безопасности на уровне сборки.The following table describes the effects of using security attributes at the assembly level.

Assembly - атрибутAssembly attribute Состояние сборкиAssembly state
Частично доверенная сборка без атрибутовNo attribute on a partially trusted assembly Все типы и члены являются прозрачными.All types and members are transparent.
Полностью доверенная сборка без атрибутов (находящаяся в глобальном кэше сборок или помеченная как полностью доверенная в AppDomain)No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Все типы являются прозрачными, а все члены — надежными с точки зрения безопасности.All types are transparent and all members are security-safe-critical.
SecurityTransparent Все типы и члены являются прозрачными.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Все типы и члены являются прозрачными.All types and members are security-critical.
SecurityCritical Весь код по умолчанию является прозрачным.All code defaults to transparent. Однако отдельные типы и члены могут иметь другие атрибуты.However, individual types and members can have other attributes.

Примеры использования прозрачности безопасностиSecurity Transparency Examples

Чтобы применить правила прозрачности платформы .NET Framework 2.0 (прозрачность уровня 1), используйте в сборке следующую заметку:To use the .NET Framework 2.0 transparency rules (level 1 transparency), use the following assembly annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Если нужно сделать прозрачной всю сборку, указав тем самым, что она не содержит критический код и не может повышать уровень привилегий, можно задать прозрачность для сборки явным образом с помощью следующего атрибута:If you want to make a whole assembly transparent to indicate that the assembly does not contain any critical code and does not elevate privileges in any way, you can explicitly add transparency to the assembly with the following attribute:

[assembly: SecurityTransparent]  

Если сборка должна содержать как критический, так и прозрачный код, сначала примените атрибут SecurityCriticalAttribute ко всей сборке, чтобы указать на возможность включения в нее критического кода. Это можно сделать следующим образом:If you want to mix critical and transparent code in the same assembly, start by marking the assembly with the SecurityCriticalAttribute attribute to indicate that the assembly can contain critical code, as follows:

[assembly: SecurityCritical]  

Если нужно выполнять критические с точки зрения безопасности операции, следует явно применить еще один атрибут SecurityCriticalAttribute к коду, выполняющему критическую операцию, как показано в примере ниже.If you want to perform security-critical actions, you must explicitly mark the code that will perform the critical action with another SecurityCriticalAttribute attribute, as shown in the following code example:

[assembly: SecurityCritical]  
public class A  
{  
    [SecurityCritical]  
    private void Critical()  
    {  
        // critical  
    }  
  
    public int SomeProperty  
    {  
        get {/* transparent */ }  
        set {/* transparent */ }  
    }  
}  
public class B  
{
    internal string SomeOtherProperty  
    {  
        get { /* transparent */ }  
        set { /* transparent */ }  
    }  
}  

Приведенный выше код является прозрачным за исключением метода Critical, который явным образом помечен как критический с точки зрения безопасности.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. Прозрачность задается по умолчанию даже при установленном на уровне сборки атрибуте SecurityCriticalAttribute.Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

См. такжеSee also