Udostępnij za pośrednictwem


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

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Metoda w zestawie z atrybutem AllowPartiallyTrustedCallersAttribute wywołuje metodę z zestawu, który nie ma atrybutu.

Opis reguły

Domyślnie, metody publiczne lub chronione w zestawach o silnych nazwach są niejawnie chronione przez Żądania połączeń dla pełnego zaufania; tylko w pełni zaufane elementy wywołujące mogą uzyskać dostęp do zestawu o silnej nazwie.Zespoły o silnej nazwie, oznaczone atrybutem AllowPartiallyTrustedCallersAttribute (APTCA) nie mają tej ochrony.Atrybut wyłącza żądanie łącza, udostępnienie zestawu elementom wywołującym, które nie są w pełni zaufane, takim jak kod wykonywany z intranetu lub Internetu.

Gdy atrybut APTCA jest obecny w zestawie całkowicie zaufanym i wykonuje kod w innym zestawie, który nie zezwala na dostęp częściowo zaufanych wywołań, możliwe jest wykorzystanie luk w bezpieczeństwie.Jeśli dwie metody M1 i M2 spełniają następujące warunki, złośliwi wywołujący mogą użyć typu M1 aby pominąć niejawne żądanie łącza pełnego zaufania, które chroni M2:

  • M1 jest metodą publiczną, zadeklarowaną w pełni zaufanym zestawie, który ma atrybut APTCA.

  • M1 wywołuje metodę M2 poza zestawem M1.

  • Zestaw M2 nie ma atrybutu APTCA i dlatego nie powinien być wywoływany przez lub w imieniu częściowo zaufanych elementów wywołujących.

Częściowo zaufany obiekt wywołujący X może wywołać metodę M1, powodując wywołanie metody M2 przez M1.Ponieważ M2 nie ma atrybutu APTCA, jego bezpośredni element wywołujący (M1) musi spełniać żądanie łącza pełnego zaufania; M1 ma pełne zaufanie i dlatego spełnia to żądanie.Zagrożenie bezpieczeństwa istnieje, ponieważ X nie uczestniczy w spełnianiu żądania łącza, która chroni M2 przed niezaufanym elementem wywołującym.Dlatego metody z atrybutem APTCA nie mogą wywołać metod, które nie mają tego atrybutu.

Jak naprawić naruszenia

Jeśli atrybut APCTA jest wymagany, należy używać żądania do ochrony metody, która wywołuje zestaw pełnego zaufania.Dokładne żądane uprawnienia zależą od funkcjonalności udostępnianej przez metodę.Jeśli jest to możliwe, należy chronić metodę z żądaniem pełnego zaufania w celu zapewnienia, że podstawowa funkcjonalność nie jest udostępniona częściowo zaufanym elementom wywołującym.Jeśli nie jest to możliwe, należy zaznaczyć zestaw uprawnień, który skutecznie chroni narażone funkcjonalności.Aby uzyskać więcej informacji na temat żądań, zobacz Żądania.

Kiedy pominąć ostrzeżenia

Aby bezpiecznie pominąć ostrzeżenie od tej reguły, należy się upewnić, że funkcjonalność udostępniana przez metodę nie zezwalają bezpośrednio lub pośrednio niezaufanym wywołującym na dostęp do poufnych informacji, operacji lub zasobów, które mogą być używane w sposób niszczący.

Przykład

Poniższy przykład używa dwóch zestawów i aplikacji testowej do zilustrowania luki w zabezpieczeniach wykrytej przez tę regułę.Pierwszy zestaw nie ma atrybutu APTCA i nie powinien być dostępny dla częściowo zaufanych elementów wywołujących (reprezentowanych przez M2 w poprzednim podrozdziale).

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 and does  
// not allow partially trusted callers.  

namespace AptcaTestLibrary
{
   public class ClassRequiringFullTrust
   {
      public static void DoWork()
      {
        Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
      }
   }
}

Drugi zestaw jest w pełni zaufany i zezwala na częściowo zaufanych wywołujących (reprezentowany przez M1 w poprzednim podrozdziale).

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

// This assembly executes with full trust and  
// allows partially trusted callers. 

[assembly:AllowPartiallyTrustedCallers]  

namespace AptcaTestLibrary
{
   public class AccessAClassRequiringFullTrust
   {
      public static void Access()
      {    
         // This security check fails if the caller  
         // does not have full trust. 
         NamedPermissionSet pset= new NamedPermissionSet("FullTrust");

         // This try-catch block shows the caller's permissions. 
         // Correct code would either not catch the exception, 
         // or would rethrow it. 
         try 
         {
            pset.Demand();
         }
         catch (SecurityException e)
         {
            Console.WriteLine("Demand for full trust:{0}", e.Message);
         }
         // Call the type that requires full trust. 
         // Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
         ClassRequiringFullTrust.DoWork();
     }
   }
}

Aplikacja testowa (reprezentowana przez X w poprzednim podrozdziale) jest częściowo zaufana.

using System;
using AptcaTestLibrary;

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

namespace TestSecLibrary
{
   class TestApctaMethodRule
   {
      public static void Main()
      {
          // Indirectly calls DoWork in the full-trust class.
          ClassRequiringFullTrust testClass = new ClassRequiringFullTrust();
          testClass.Access();
      }
   }
}

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

  

Powiązane reguły

CA2117: Typy APTCA powinny rozszerzać tylko typy bazowe APTCA

Zobacz też

Koncepcje

Zestawy .NET Framework wywoływane przez częściowo zaufany kod

Używanie bibliotek pochodzących z częściowo zaufanego kodu

Żądania

Żądania połączeń

Inne zasoby

Wytyczne dotyczące bezpiecznego programowania

Dane i modelowanie w programie .NET Framework