Condividi tramite


I metodi APTCA devono chiamare solo metodi APTCA

Aggiornamento: novembre 2007

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Un metodo in un assembly con l'attributo System.Security.AllowPartiallyTrustedCallersAttribute chiama un metodo in un assembly che non presenta l'attributo.

Descrizione della regola

Per impostazione predefinita, i metodi pubblici o protetti negli assembly con nomi sicuri sono protetti in modo implicito da Richieste di collegamento per l'attendibilità totale; solo i chiamanti totalmente attendibili possono accedere a un assembly con nome sicuro. Gli assembly con nome sicuro contrassegnati con l'attributo AllowPartiallyTrustedCallersAttribute (APTCA) non presentano questa protezione. L'attributo disattiva la richiesta di collegamento, rendendo l'assembly accessibile ai chiamanti non totalmente attendibili, ad esempio l'esecuzione di codice da una rete Intranet o da Internet.

Quando l'attributo APTCA è presente su un assembly totalmente attendibile e l'assembly esegue codice in un altro assembly che non consente chiamanti parzialmente attendibili, è possibile essere in presenza di una violazione della protezione. Se due metodi M1 e M2 soddisfano le seguenti condizioni, i chiamanti malintenzionati possono utilizzare il metodo M1 per ignorare la richiesta di collegamento di attendibilità totale implicita che protegge M2:

  • M1 è un metodo pubblico dichiarato in un assembly totalmente attendibile che presenta l'attributo APTCA.

  • M1 chiama un metodo M2 al di fuori dell'assembly di M1.

  • L'assembly di M2 non presenta l'attributo APTCA, pertanto non deve essere eseguito da o per conto di chiamanti parzialmente attendibili.

Un chiamante parzialmente attendibile X può chiamare il metodo M1 facendo in modo che M1 chiami M2. Poiché M2 non presenta l'attributo APTCA, il relativo chiamante immediato (M1) deve soddisfare una richiesta di collegamento per l'attendibilità totale; M1 presenta attendibilità totale e pertanto soddisfa questo controllo. Il rischio di protezione è dovuto al fatto che X non contribuisce a soddisfare la richiesta di collegamento che protegge M2 dai chiamanti non attendibili. I metodi con l'attributo APTCA non devono pertanto chiamare metodi che non presentano tale attributo.

Correzione di violazioni

Se è richiesto l'attributo APCTA, utilizzare un Accesso dati per proteggere il metodo che esegue la chiamata nell'assembly totalmente attendibile. Le autorizzazioni esatte richieste dipendono dalla funzionalità esposta dal metodo. Se possibile, proteggere il metodo con una richiesta di attendibilità totale per assicurare che la funzionalità sottostante non sia esposta a chiamanti parzialmente attendibili. Se questo non è possibile, selezionare un insieme di autorizzazioni che proteggano efficacemente la funzionalità esposta.

Esclusione di avvisi

Affinché l'esclusione di un avviso da questa regola sia sicura, è necessario assicurarsi che la funzionalità esposta dal metodo non consenta direttamente o indirettamente ai chiamanti di accedere a informazioni, operazioni o risorse riservate che possano essere utilizzate in modo distruttivo.

Esempio

Nell'esempio riportato di seguito vengono utilizzati due assembly e un'applicazione di test per illustrare la vulnerabilità della protezione rilevata da questa regola. Il primo assembly non presenta l'attributo APTCA e non deve essere accessibile ai chiamanti parzialmente attendibili (rappresentato da M2 nella spiegazione precedente).

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.");
      }
   }
}

Il secondo assembly è totalmente attendibile e consente l'accesso a chiamanti parzialmente attendibili (rappresentato da M1 nella spiegazione precedente).

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

L'applicazione di test (rappresentata da X nella spiegazione precedente) è parzialmente attendibile.

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 a = new ClassRequiringFullTrust();
          a.Access();
      }
   }
}

Questo esempio produce l'output che segue.

Demand for full trust:Request failed.
ClassRequiringFullTrust.DoWork was called.

Regole correlate

I tipi APTCA devono estendere solo tipi di base APTCA

Vedere anche

Concetti

Assembly .NET Framework contrassegnati da AllowPartiallyTrustedCallersAttribute

Utilizzo di librerie da codice parzialmente attendibile

Richieste di collegamento

Altre risorse

Indicazioni per la generazione di codice protetto

Accesso dati