Sdílet prostřednictvím


CA2117: Typy APTCA by měl rozšířit pouze základní typy APTCA

TypeName

AptcaTypesShouldOnlyExtendAptcaBaseTypes

CheckId

CA2117

Kategorie

Microsoft.Security

Narušující změna

Narušující

Příčina

Chráněný nebo veřejný typ v sestavení AllowPartiallyTrustedCallersAttribute atribut dědí z typu v sestavení, které neobsahuje atribut deklarován.

Popis pravidla

Ve výchozím nastavení, chráněný nebo veřejný typů v sestavení se silnými názvy jsou implicitně chráněny Požadavky na dědičnost pro úplný vztah důvěryhodnosti.Sestavení se silným názvem označené atributem AllowPartiallyTrustedCallersAttribute (APTCA) nemají tuto ochranu.Atribut zakáže požadavek dědičnosti.Díky ohrožené typy deklarované v sestavení dědičné podle typů, které nemají úplný vztah důvěryhodnosti.

Pokud atribut APTCA nachází v plně důvěryhodném sestavení a typu v sestavení dědí z typu, který neumožňuje částečně důvěryhodným volajícím, je možné zabezpečení zneužít.Pokud dva typy T1 a T2 splňovat následující podmínky, škodlivých volajících použít typ T1 obejít požadavek dědičnosti implicitní úplný vztah důvěryhodnosti, který chrání T2:

  • T1veřejné typ deklarován v plně důvěryhodných sestavení, který má atribut APTCA.

  • T1dědí z typu T2 mimo jeho sestavení.

  • T2na sestavení nemá atribut APTCA a proto by neměl být dědičná pomocí typů v částečně důvěryhodném sestavení.

Částečně důvěryhodný typ X může dědit z T1, který mu přístup k zděděné členy deklarované v T2.Vzhledem k tomu, T2 nemá atribut APTCA jeho okamžité odvozeného typu (T1) musí splňovat požadavek dědičnosti pro úplný vztah důvěryhodnosti; T1 má úplný vztah důvěryhodnosti a proto splňuje tuto kontrolu.Je bezpečnostní riziko, protože X není součástí splňující požadavek dědičnosti, která chrání T2 z nedůvěryhodných vytváření podtříd.Z tohoto důvodu nesmí rozšířit typy atributem APTCA typy, které nemají atribut.

Jiný problém zabezpečení a jedna možná častěji, je odvozený typ (T1) můžete prostřednictvím chybě programátora vystavit chráněné členy z typu, který vyžaduje úplný vztah důvěryhodnosti (T2).V tomto případě nedůvěryhodných volajících získat přístup k informacím, které by měly být k dispozici pouze pro typy plně důvěryhodné.

Jak vyřešit porušení

Pokud v sestavení, které nevyžaduje atribut APTCA je typ oznámila porušením, odeberte jej.

Pokud je vyžadován atribut APTCA, přidáte k tomuto typu požadavek dědičnosti pro úplný vztah důvěryhodnosti.Je to ochrana proti nedůvěryhodných typy dědičnosti.

Je možné vyřešit narušení přidáním atributu APTCA sestavení oznámila porušením základních typů.Nelze provést bez první provedení revize intenzivní zabezpečení všechen kód v sestavení a všechen kód, který závisí na sestavení.

Kdy potlačit upozornění

Bezpečně potlačit upozornění od tohoto pravidla, musí zajistit, že chráněné členy vašeho typu vystavené přímo nebo nepřímo neumožňují nedůvěryhodné volající přístup k citlivé informace, operace a prostředky, které lze použít v destruktivním způsobem.

Příklad

Následující příklad používá dvě sestavení a testovací aplikaci pro ilustraci chyby zabezpečení zjištěné tímto pravidlem.První sestavení neobsahuje atribut APTCA a neměla by být dědičné typy částečně důvěryhodné (reprezentované T2 v předchozí diskusi).

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This code is compiled into a strong-named assembly 
// that requires full trust.  

namespace AptcaTestLibrary
{
   public class ClassRequiringFullTrustWhenInherited
   {
      // This field should be overridable by fully trusted derived types. 
      protected static string location = "shady glen";

      // A trusted type can see the data, but cannot change it. 
      public virtual string TrustedLocation 
      {
         get 
         {
            return location;
         }
      }
   }
}

Druhý sestavení, reprezentované T1 v předchozí diskusi je plně důvěryhodný a umožňuje částečně důvěryhodným volajícím.

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This class is compiled into an assembly that executes with full  
// trust and allows partially trusted callers.  

// Violates rule: AptcaTypesShouldOnlyExtendAptcaBaseTypes. 

namespace AptcaTestLibrary
{
   public class InheritAClassRequiringFullTrust: 
      ClassRequiringFullTrustWhenInherited
   {
      private DateTime meetingDay = DateTime.Parse("February 22 2003");

      public override string ToString() 
      {
         // Another error: 
         // This method gives untrusted callers the value  
         // of TrustedLocation. This information should  
         // only be seen by trusted callers. 
         string s = String.Format(
            "Meet at the {0} {1}!", 
            this.TrustedLocation, meetingDay.ToString());
         return s;
      }
   }
}

Zkouška typu reprezentované X v předchozí diskusi je v částečně důvěryhodném sestavení.

using System;
using AptcaTestLibrary;

// If this test application is run from the local machine,  
//  it gets full trust by default. 
// Remove full trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, Name = "FullTrust")]

namespace TestSecLibrary
{
    class InheritFromAFullTrustDecendent : ClassRequiringFullTrust
    {
        public InheritFromAFullTrustDecendent()
        {
            // This constructor maliciously overwrites the protected  
            // static member in the fully trusted class. 
            // Trusted types will now get the wrong information from  
            // the TrustedLocation property.
            InheritFromAFullTrustDecendent.location = "sunny meadow";
        }

        public override string ToString()
        {
            return InheritFromAFullTrustDecendent.location;
        }
    }

    class TestApctaInheritRule
    {
        public static void Main()
        {
            ClassRequiringFullTrust iclass =
               new ClassRequiringFullTrust();
            Console.WriteLine(iclass.ToString());

            // You cannot create a type that inherits from the full trust type 
            // directly, but you can create a type that inherits from  
            // the APTCA type which in turn inherits from the full trust type.

            InheritFromAFullTrustDecendent inherit =
               new InheritFromAFullTrustDecendent();
            //Show the inherited protected member has changed.
            Console.WriteLine("From Test: {0}", inherit.ToString());

            // Trusted types now get the wrong information from  
            // the TrustedLocation property.
            Console.WriteLine(iclass.ToString());
        }
    }
}

Tento příklad vytvoří následující výstup.

  

Související pravidla

CA2116: Metody APTCA by měly volat pouze metody APTCA

Viz také

Koncepty

Sestavení .NET Framework volatelná částečně důvěryhodným kódem

Používání knihoven z částečně důvěryhodného kódu

Požadavky na dědičnost

Další zdroje

Pokyny pro zabezpečené kódování