Kod przezroczysty pod względem zabezpieczeń, poziom 1Security-Transparent Code, Level 1

Przestroga

Zabezpieczenia dostępu kodu (CAS) i częściowo zaufany kodCode Access Security (CAS) and Partially Trusted Code

Platforma .NET Framework zapewnia mechanizm wymuszania różnych poziomów zaufania dla różnego kodu uruchamianego w tej samej aplikacji nazywany zabezpieczeniami dostępu kodu (CAS, Code Access Security).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).

Urzędy certyfikacji nie są obsługiwane w wersjach .NET Core, .NET 5 i nowszych. Urzędy certyfikacji nie są obsługiwane w wersjach języka C# nowszych niż 7,0.CAS is not supported in .NET Core, .NET 5, or later versions. CAS is not supported by versions of C# later than 7.0.

Urzędów certyfikacji w .NET Framework nie należy używać jako mechanizmu wymuszania granic zabezpieczeń na podstawie pochodzenia kodu lub innych aspektów tożsamości.CAS in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Urzędy certyfikacji i kod Security-Transparent nie są obsługiwane jako granice zabezpieczeń z częściowo zaufanym kodem, szczególnie kod nieznanego źródła.CAS and Security-Transparent Code are not supported as a security boundary with partially trusted code, especially code of unknown origin. Odradzamy ładowanie i wykonywanie kodu z nieznanego źródła bez zapewnienia alternatywnych środków bezpieczeństwa.We advise against loading and executing code of unknown origins without putting alternative security measures in place. .NET Framework nie będzie wystawiał poprawek zabezpieczeń dla wszystkich luk w zabezpieczeniach, które mogą zostać odnalezione w piaskownicy urzędów certyfikacji..NET Framework will not issue security patches for any elevation-of-privilege exploits that might be discovered against the CAS sandbox.

Te zasady mają zastosowanie do wszystkich wersji platformy .NET Framework, ale nie mają zastosowania do platformy .NET Framework zawartej w technologii Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Przejrzystość ułatwia deweloperom pisanie bardziej bezpiecznych bibliotek .NET Framework, które uwidaczniają funkcjonalność do częściowo zaufanego kodu.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. Przejrzystość poziomu 1 została wprowadzona w .NET Framework w wersji 2,0 i była używana głównie tylko w firmie Microsoft.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. Począwszy od .NET Framework 4, można użyć przezroczystości poziomu 2.Starting with the .NET Framework 4, you can use level 2 transparency. Przejrzystość poziomu 1 została jednak zachowana, aby można było zidentyfikować starszy kod, który musi zostać uruchomiony przy użyciu wcześniejszych reguł zabezpieczeń.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Ważne

Należy określić przezroczystość poziomu 1 w celu zapewnienia zgodności. oznacza to, że należy określić poziom 1 tylko dla kodu, który został opracowany z .NET Framework 3,5 lub wcześniejszym, który używa AllowPartiallyTrustedCallersAttribute lub nie używa modelu przezroczystości.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. Na przykład użyj przejrzystości poziomu 1 dla zestawów .NET Framework 2,0, które zezwalają na wywołania od częściowo zaufanych wywołujących (APTCA).For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). W przypadku kodu opracowanego dla .NET Framework 4 zawsze używaj przejrzystości poziomu 2.For code that is developed for the .NET Framework 4, always use level 2 transparency.

Ten temat zawiera następujące sekcje:This topic contains the following sections:

Model przejrzystości poziomu 1The Level 1 Transparency Model

W przypadku korzystania z przejrzystości poziomu 1 jest używany model zabezpieczeń, który oddziela kod do metod zabezpieczeń-przezroczystych, zabezpieczeń-bezpiecznych i krytycznych dla zabezpieczeń.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.

Można oznaczyć cały zestaw, niektóre klasy w zestawie lub niektóre metody klasy jako przezroczyste dla zabezpieczeń.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. Kod przezroczysty pod względem zabezpieczeń nie może podwyższyć poziomu uprawnień.Security-transparent code cannot elevate privileges. To ograniczenie ma trzy konsekwencje:This restriction has three consequences:

  • Kod przezroczysty pod względem zabezpieczeń nie może wykonać Assert akcji.Security-transparent code cannot perform Assert actions.

  • Wszystkie żądania dotyczące linków, które byłyby spełnione przez kod przezroczysty dla zabezpieczeń, staną się pełnymi żądaniami.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Dowolny niebezpieczny (niemożliwy do zweryfikowania) kod, który musi zostać wykonany w nieprzezroczystym kodzie zabezpieczeń, powoduje pełny popyt na UnmanagedCode uprawnienia zabezpieczeń.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Te reguły są wymuszane podczas wykonywania przez środowisko uruchomieniowe języka wspólnego (CLR).These rules are enforced during execution by the common language runtime (CLR). Kod przezroczysty pod względem zabezpieczeń przekazuje wszystkie wymagania dotyczące zabezpieczeń kodu, który wywołuje z powrotem do jego wywoływania.Security-transparent code passes all the security requirements of the code it calls back to its callers. Wymaga, aby przepływ przez kod przezroczysty pod względem zabezpieczeń nie mógł podwyższyć poziomu uprawnień.Demands that flow through the security-transparent code cannot elevate privileges. Jeśli aplikacja z niskim zaufaniem wywołuje kod przezroczysty z zabezpieczeniami i powoduje żądanie wysokiego poziomu uprawnień, żądanie zostanie przekazane z powrotem do kodu niskiego zaufania i nie powiedzie się.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. Kod przezroczysty pod względem zabezpieczeń nie może zatrzymać żądania, ponieważ nie może wykonać akcji potwierdzeń.The security-transparent code cannot stop the demand because it cannot perform assert actions. Ten sam kod przezroczysty pod względem zabezpieczeń, który jest wywoływany z kodu pełnego zaufania, skutkuje pomyślnym zapotrzebowaniem.The same security-transparent code called from full-trust code results in a successful demand.

Krytyczne dla zabezpieczeń są przeciwieństwem przezroczystości zabezpieczeń.Security-critical is the opposite of security-transparent. Kod krytyczny dla zabezpieczeń jest wykonywany z pełnym zaufaniem i może wykonywać wszystkie uprzywilejowane operacje.Security-critical code executes with full trust and can perform all privileged operations. Bezpieczny-krytyczny kod jest uprzywilejowanym kodem, który został przeprowadzona przez kompleksową inspekcję zabezpieczeń, aby upewnić się, że nie zezwala częściowo zaufanym wywołującym na używanie zasobów, do których nie ma uprawnień dostępu.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.

Musisz jawnie zastosować przezroczystość.You have to apply transparency explicitly. Większość kodu, który obsługuje manipulowanie danymi i logikę, może być zwykle oznaczona jako przezroczysty dla zabezpieczeń, podczas gdy mniejsza ilość kodu, która wykonuje podniesienie uprawnień, jest oznaczona jako krytyczna dla zabezpieczeń lub bezpieczna — zabezpieczenia krytyczne.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.

Ważne

Przezroczystość poziomu 1 jest ograniczona do zakresu zestawu; nie jest wymuszany między zestawami.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. Przejrzystość poziomu 1 została głównie użyta w firmie Microsoft do celów inspekcji zabezpieczeń.Level 1 transparency was primarily used within Microsoft for security audit purposes. Typy krytyczne pod względem zabezpieczeń i elementy członkowskie w zestawie poziomu 1 są dostępne przez kod przezroczysty dla zabezpieczeń w innych zestawach.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. Ważne jest, aby wykonać wymagania dotyczące linków w celu pełnego zaufania we wszystkich typach i elementach krytycznych zabezpieczeń na poziomie 1.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. Typy i składowe z bezpiecznymi zabezpieczeniami muszą także potwierdzić, że wywołujący mają uprawnienia do chronionych zasobów, do których dostęp jest uzyskiwany przez typ lub element członkowski.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

W celu zapewnienia zgodności z poprzednimi wersjami .NET Framework wszystkie elementy członkowskie, które nie są adnotacjami z atrybutami przezroczystości są uznawane za bezpieczne-krytyczne.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. Wszystkie typy, które nie są adnotacjami, są uważane za przezroczyste.All types that are not annotated are considered to be transparent. Brak statycznych reguł analizy do zweryfikowania przejrzystości.There are no static analysis rules to validate transparency. W związku z tym może być konieczne Debugowanie błędów przezroczystości w czasie wykonywania.Therefore, you may need to debug transparency errors at run time.

Atrybuty przezroczystościTransparency Attributes

W poniższej tabeli opisano trzy atrybuty, które służą do dodawania adnotacji do kodu dla przezroczystości.The following table describes the three attributes that you use to annotate your code for transparency.

AtrybutAttribute OpisDescription
SecurityTransparentAttribute Dozwolone tylko na poziomie zestawu.Allowed only at the assembly level. Identyfikuje wszystkie typy i składowe w zestawie jako przezroczyste dla zabezpieczeń.Identifies all types and members in the assembly as security-transparent. Zestaw nie może zawierać żadnego kodu krytycznego dla zabezpieczeń.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute Gdy jest używany na poziomie zestawu bez Scope właściwości, program identyfikuje cały kod w zestawie jako zabezpieczenia-przezroczysty domyślnie, ale wskazuje, że zestaw może zawierać kod krytyczny dla bezpieczeństwa.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.

Gdy jest używana na poziomie klasy, identyfikuje klasę lub metodę jako krytyczny dla zabezpieczeń, ale nie elementy członkowskie klasy.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Aby wszystkie elementy członkowskie miały krytyczne znaczenie dla zabezpieczeń, należy ustawić Scope Właściwość na Everything .To make all the members security-critical, set the Scope property to Everything.

Gdy jest używany na poziomie elementu członkowskiego, atrybut ma zastosowanie tylko do tego elementu członkowskiego.When used at the member level, the attribute applies only to that member.

Klasa lub element członkowski identyfikowany jako krytyczny dla zabezpieczeń może wykonywać podniesienia uprawnień.The class or member identified as security-critical can perform elevations of privilege. Ważne: Na poziomie 1 przejrzystość typy i elementy członkowskie o kluczowym znaczeniu zabezpieczeń są traktowane jako bezpieczne-krytyczne dla bezpieczeństwa, gdy są wywoływane spoza zestawu.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the assembly. Aby uniknąć nieautoryzowanego podniesienia uprawnień, należy chronić typy i członków o kluczowym znaczeniu zabezpieczeń z użyciem żądania linku do pełnego zaufania.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Identyfikuje kod krytyczny dla zabezpieczeń, do którego można uzyskać dostęp za pomocą kodu przezroczystego dla zabezpieczeń w zestawie.Identifies security-critical code that can be accessed by security-transparent code in the assembly. W przeciwnym razie kod przezroczysty pod względem zabezpieczeń nie może uzyskać dostępu do prywatnych lub wewnętrznych składowych o kluczowym znaczeniu zabezpieczeń w tym samym zestawie.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Mogłoby to mieć wpływ na kod krytyczny zabezpieczeń i spowodować nieoczekiwane podwyższenie poziomu uprawnień.Doing so would influence security-critical code and make unexpected elevations of privilege possible. Kod zabezpieczeń-bezpieczny-krytyczny powinien zostać poddany rygorystycznej inspekcji zabezpieczeń.Security-safe-critical code should undergo a rigorous security audit. Uwaga: Typy i składowe z bezpiecznymi zabezpieczeniami muszą sprawdzać uprawnienia obiektów wywołujących w celu ustalenia, czy obiekt żądający ma uprawnienia dostępu do chronionych zasobów.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

Ten SecuritySafeCriticalAttribute atrybut umożliwia nieprzezroczysty kod w celu uzyskania dostępu do elementów członkowskich o znaczeniu krytycznym w tym samym zestawie.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Rozważ użycie kodu o kluczowym znaczeniu zabezpieczeń i zabezpieczeń w zestawie, który jest podzielony na dwa zestawy.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. Kod przezroczysty pod względem zabezpieczeń nie może zobaczyć prywatnych lub wewnętrznych elementów członkowskich kodu krytycznego dla zabezpieczeń.The security-transparent code would not be able to see the private or internal members of the security-critical code. Ponadto kod krytyczny dla zabezpieczeń jest ogólnie objęty inspekcją w celu uzyskania dostępu do jego interfejsu publicznego.Additionally, the security-critical code is generally audited for access to its public interface. Nie oczekuje się, że stan prywatny lub wewnętrzny będzie dostępny poza zestawem; należy zachować stan izolowany.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. Ten SecuritySafeCriticalAttribute atrybut utrzymuje izolację stanu między kodem nieprzezroczystym i krytycznym dla zabezpieczeń, jednocześnie zapewniając możliwość przesłonięcia izolacji, gdy jest to konieczne.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. Kod przezroczysty pod względem zabezpieczeń nie może uzyskać dostępu do prywatnego lub wewnętrznego kodu krytycznego zabezpieczeń, chyba że te elementy członkowskie zostały oznaczone za pomocą SecuritySafeCriticalAttribute .Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Przed zastosowaniem SecuritySafeCriticalAttribute , Przeprowadź inspekcję tego elementu członkowskiego tak, jakby był on ujawniony publicznie.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Adnotacja w całej zestawieAssembly-wide Annotation

W poniższej tabeli opisano efekty używania atrybutów zabezpieczeń na poziomie zestawu.The following table describes the effects of using security attributes at the assembly level.

Atrybut zestawuAssembly attribute Stan zestawuAssembly state
Brak atrybutu dla częściowo zaufanego zestawuNo attribute on a partially trusted assembly Wszystkie typy i elementy członkowskie są przezroczyste.All types and members are transparent.
Brak atrybutu w w pełni zaufanym zestawie (w globalnej pamięci podręcznej zestawów lub zidentyfikowanym jako pełne zaufanie AppDomain )No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Wszystkie typy są przezroczyste i wszystkie elementy członkowskie są bezpieczne-krytyczne.All types are transparent and all members are security-safe-critical.
SecurityTransparent Wszystkie typy i elementy członkowskie są przezroczyste.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Wszystkie typy i elementy członkowskie są krytyczne dla zabezpieczeń.All types and members are security-critical.
SecurityCritical Wszystkie wartości domyślne kodu są przezroczyste.All code defaults to transparent. Jednak poszczególne typy i elementy członkowskie mogą mieć inne atrybuty.However, individual types and members can have other attributes.

Przykłady przezroczystości zabezpieczeńSecurity Transparency Examples

Aby użyć reguł przezroczystości .NET Framework 2,0 (przezroczystość poziomu 1), użyj następującej adnotacji zestawu:To use the .NET Framework 2.0 transparency rules (level 1 transparency), use the following assembly annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Jeśli chcesz, aby cały zestaw był przezroczysty, aby wskazać, że zestaw nie zawiera kodu krytycznego i nie Podnieś poziomu uprawnień w dowolny sposób, można jawnie dodać przezroczystość do zestawu przy użyciu następującego atrybutu: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]  

Jeśli chcesz mieszać kod krytyczny i przezroczysty w tym samym zestawie, Zacznij od oznaczenia zestawu przy użyciu SecurityCriticalAttribute atrybutu, aby wskazać, że zestaw może zawierać kod krytyczny w następujący sposób: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]  

Jeśli chcesz wykonać akcje krytyczne dla zabezpieczeń, musisz jawnie oznaczyć kod, który wykona akcję krytyczną z innym SecurityCriticalAttribute atrybutem, jak pokazano w poniższym przykładzie kodu: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 */ }  
    }  
}  

Poprzedni kod jest przezroczysty z wyjątkiem Critical metody, która jest jawnie oznaczona jako krytyczna dla zabezpieczeń.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. Przezroczystość jest ustawieniem domyślnym, nawet z atrybutem na poziomie zestawu SecurityCriticalAttribute .Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

Zobacz teżSee also