CA2117: APTCA-Typen sollten nur APTCA-Basistypen erweitern

TypeName

AptcaTypesShouldOnlyExtendAptcaBaseTypes

CheckId

CA2117

Kategorie

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Ein öffentlicher oder geschützter Typ in einer Assembly mit dem System.Security.AllowPartiallyTrustedCallersAttribute-Attribut erbt von einem Typ, der in einer Assembly deklariert ist, die nicht über dieses Attribut verfügt.

Regelbeschreibung

Standardmäßig werden öffentliche oder geschützte Typen in Assemblys mit starken Namen implizit durch Vererbungsforderungen geschützt, damit die volle Vertrauenswürdigkeit gewahrt bleibt.Mit dem AllowPartiallyTrustedCallersAttribute- (APTCA-)Attribut markierte Assemblys mit starkem Namen verfügen nicht über diesen Schutz.Das Attribut deaktiviert die Vererbungsanforderung.Dadurch können in der Assembly deklarierte Typen, die verfügbar gemacht werden, an Typen vererbt werden, die keine volle Vertrauenswürdigkeit besitzen.

Wenn das APTCA-Attribut in einer voll vertrauenswürdigen Assembly vorhanden ist und ein in der Assembly enthaltener Typ von einem Typ erbt, der keine nicht voll vertrauenswürdigen Aufrufer zulässt, dann können Sicherheitslücken entstehen, die sich für Angriffe ausnutzen lassen.Wenn zwei Typen T1 und T2 die folgenden Bedingungen erfüllen, dann können böswillige Aufrufer den Typ T1 verwenden, um die implizite Vererbungsanforderung nach voller Vertrauenswürdigkeit zu umgehen, durch die T2 geschützt ist.

  • T1 ist ein öffentlicher Typ, der in einer voll vertrauenswürdigen Assembly deklariert wird, die über das APTCA-Attribut verfügt.

  • T1 erbt von einem Typ T2, der außerhalb dieser Assembly deklariert ist.

  • Bei der Assembly von T2 ist das APTCA-Attribut nicht vorhanden, und daher sollte er nicht an Typen vererbt werden können, die in nicht voll vertrauenswürdigen Assemblys deklariert sind.

Ein nicht voll vertrauenswürdiger Typ X kann von T1 erben, wodurch er Zugriff auf geerbte Member erhält, die in T2 deklariert sind.Da T2 nicht über das APTCA-Attribut verfügt, muss der direkt von ihm abgeleitete Typ (T1) eine Vererbungsanforderung nach voller Vertrauenswürdigkeit erfüllen. T1 ist voll vertrauenswürdig und erfüllt daher diese Bedingung.Das Sicherheitsrisiko liegt darin, dass X nicht der Vererbungsanforderung unterliegt, die T2 davor schützt, dass nicht vertrauenswürdige Subklassen erstellt werden.Aus diesem Grund dürfen Typen, die über das APTCA-Attribut verfügen, Typen nicht erweitern, die nicht über das Attribut verfügen.

Ein anderes, vielleicht häufigeres Sicherheitsproblem besteht darin, dass der abgeleitete Typ (T1) wegen eines Programmierfehlers geschützte Member des Typs, der vollständige Vertrauenswürdigkeit erfordert (T2), verfügbar machen kann.Wenn dies der Fall ist, können nicht vertrauenswürdige Aufrufer auf Informationen zugreifen, die nur für voll vertrauenswürdige Typen verfügbar sein sollten.

Behandeln von Verstößen

Wenn es sich bei dem Typ, der gegen die Regel verstößt, um eine Assembly handelt, die das APTCA-Attribut nicht erfordert, dann entfernen Sie es.

Wenn das APTCA-Attribut erforderlich ist, fügen Sie dem Typ eine Vererbungsanforderung nach voller Vertrauenswürdigkeit hinzu.Dies schützt vor Vererbung durch nicht vertrauenswürdige Typen.

Es ist möglich, einen Verstoß durch Hinzufügen des APTCA-Attributs zu den Assemblys der Basistypen zu beheben, die in diesem Regelverstoß genannt sind.Tun Sie dies aber nur, nachdem Sie den gesamten Code der Assemblys und den gesamten Code, der von diesen Assemblys abhängt, eingehend auf seine Sicherheit hin überprüft haben.

Wann sollten Warnungen unterdrückt werden?

Um eine Warnung dieser Regel gefahrlos zu unterdrücken, müssen Sie sicherstellen, dass geschützte Member, die von diesem Typ verfügbar gemacht werden, weder direkt noch indirekt zulassen, dass nicht vertrauenswürdige Aufrufer auf sicherheitsrelevante Informationen, Operationen oder Ressourcen zugreifen, die sich auf destruktive Weise verwenden lassen.

Beispiel

Im folgenden Beispiel wird anhand von zwei Assemblys und einer Testanwendung die Sicherheitslücke veranschaulicht, die durch diese Regel erkannt wurde.Die erste Assembly verfügt nicht über das APTCA-Attribut und sollte nicht an nicht voll vertrauenswürdige Typen (die in den obigen Erläuterungen durch T2 dargestellt wurden) vererbt werden können.

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;
         }
      }
   }
}

Die zweite Assembly, die in den obigen Erläuterungen durch T1 dargestellt wurde, ist voll vertrauenswürdig und lässt nicht voll vertrauenswürdige Aufrufer zu.

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;
      }
   }
}

Der in den vorherigen Erläuterungen durch X dargestellte Testtyp befindet sich in einer teilweise vertrauenswürdigen Assembly.

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());
        }
    }
}

Folgende Ergebnisse werden zurückgegeben:

  
  

Verwandte Regeln

CA2116: APTCA-Methoden sollten nur APTCA-Methoden aufrufen

Siehe auch

Konzepte

Durch teilweise vertauenswürdigen Code aufrufbare .NET Framework-Assemblys

Verwenden von Bibliotheken aus teilweise vertrauenswürdigem Code

Vererbungsforderungen

Weitere Ressourcen

Richtlinien für das Schreiben von sicherem Code