Udostępnij za pośrednictwem


CA2117: Typy APTCA powinny rozszerzać tylko typy bazowe APTCA

Pozycja Wartość
Ruleid CA2117
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Publiczny lub chroniony typ w zestawie z System.Security.AllowPartiallyTrustedCallersAttribute atrybutem dziedziczy po typie zadeklarowanym w zestawie, który nie ma atrybutu.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Domyślnie typy publiczne lub chronione w zestawach o silnych nazwach są niejawnie chronione przez element InheritanceDemand w celu uzyskania pełnego zaufania. Zestawy o silnych nazwach oznaczone atrybutem AllowPartiallyTrustedCallersAttribute (APTCA) nie mają tej ochrony. Atrybut wyłącza żądanie dziedziczenia. Uwidocznione typy zadeklarowane w zestawie bez żądania dziedziczenia są dziedziczone przez typy, które nie mają pełnego zaufania.

Gdy atrybut APTCA jest obecny w w pełni zaufanym zestawie, a typ w zestawie dziedziczy po typie, który nie zezwala na częściowo zaufane wywołania, możliwe jest wykorzystanie zabezpieczeń. Jeśli dwa typy T1 i T2 spełniają następujące warunki, złośliwi wywołujący mogą użyć typu T1 , aby pominąć niejawne żądanie dziedziczenia pełnego zaufania, które chroni T2:

  • T1 jest typem publicznym zadeklarowanym w w pełni zaufanym zestawie, który ma atrybut APTCA.

  • T1 dziedziczy z typu T2 poza jego zestawem.

  • T2Zestaw "nie ma atrybutu APTCA i dlatego nie powinien być dziedziczony przez typy w częściowo zaufanych zestawach.

Częściowo zaufany typ X może dziedziczyć z T1klasy , co daje mu dostęp do dziedziczynych elementów członkowskich zadeklarowanych w pliku T2. Ponieważ T2 nie ma atrybutu APTCA, jego bezpośredni typ pochodny (T1) musi zaspokoić zapotrzebowanie dziedziczenia na pełne zaufanie; T1 ma pełne zaufanie i dlatego spełnia to sprawdzenie. Zagrożenie bezpieczeństwa wynika z faktu X , że nie uczestniczy w zaspokojeniu zapotrzebowania na dziedziczenie T2 , które chroni przed niezaufaną podklasą. Z tego powodu typy z atrybutem APTCA nie mogą rozszerzać typów, które nie mają atrybutu.

Innym problemem z zabezpieczeniami, a może bardziej typowym, jest to, że typ pochodny (T1) może, za pośrednictwem błędu programisty, uwidocznić chronione elementy członkowskie z typu wymagającego pełnego zaufania (T2). W przypadku wystąpienia tej ekspozycji niezaufane osoby wywołujące uzyskują dostęp do informacji, które powinny być dostępne tylko dla w pełni zaufanych typów.

Jak naprawić naruszenia

Jeśli typ zgłoszony przez naruszenie znajduje się w zestawie, który nie wymaga atrybutu APTCA, usuń go.

Jeśli atrybut APTCA jest wymagany, dodaj żądanie dziedziczenia dla pełnego zaufania do typu. Zapotrzebowanie na dziedziczenie chroni przed dziedziczeniem przez niezaufane typy.

Istnieje możliwość naprawienia naruszenia przez dodanie atrybutu APTCA do zestawów typów podstawowych zgłoszonych przez naruszenie. Nie należy tego robić bez uprzedniego przeprowadzania intensywnego przeglądu zabezpieczeń wszystkich kodu w zestawach i wszystkich kodach, które zależą od zestawów.

Kiedy pomijać ostrzeżenia

Aby bezpiecznie pominąć ostrzeżenie z tej reguły, należy upewnić się, że chronione elementy członkowskie uwidocznione przez typ nie są bezpośrednio lub pośrednio zezwalają niezaufanym obiektom wywołującym na dostęp do poufnych informacji, operacji lub zasobów, które mogą być używane w sposób destrukcyjny.

Przykład

W poniższym przykładzie użyto dwóch zestawów i aplikacji testowej, aby zilustrować lukę w zabezpieczeniach wykrytą przez tę regułę. Pierwszy zestaw nie ma atrybutu APTCA i nie powinien być dziedziczony przez częściowo zaufane typy (reprezentowane w T2 poprzedniej dyskusji).

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

Drugi zestaw reprezentowany T1 w poprzedniej dyskusji jest w pełni zaufany i umożliwia częściowo zaufanym obiektom wywołującym.

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

Typ testu reprezentowany X w poprzedniej dyskusji znajduje się w częściowo zaufanym zestawie.

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

Ten przykład generuje następujące wyniki:

Meet at the shady glen 2/22/2003 12:00:00 AM!
From Test: sunny meadow
Meet at the sunny meadow 2/22/2003 12:00:00 AM!

CA2116: Metody z atrybutem APTCA powinny wywoływać tylko metody z atrybutem APTCA

Zobacz też