Share via


CA2116: I metodi APTCA devono chiamare solo metodi APTCA

Articolo Valore
ID regola CA2116
Categoria Microsoft.Security
Modifica Interruzione

Causa

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

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Per impostazione predefinita, i metodi pubblici o protetti negli assembly con nomi sicuri vengono protetti in modo implicito da una richiesta di collegamento per l'attendibilità completa. Solo i chiamanti completamente attendibili possono accedere a un assembly con nome sicuro. Gli assembly con nome sicuro contrassegnati con l'attributo AllowPartiallyTrustedCallersAttribute APTCA non dispongono di questa protezione. L'attributo disabilita la richiesta di collegamento, rendendo l'assembly accessibile ai chiamanti che non hanno attendibilità totale, ad esempio il codice eseguito da una intranet o Da Internet.

Quando l'attributo APTCA è presente in un assembly completamente attendibile e l'assembly esegue codice in un altro assembly che non consente chiamanti parzialmente attendibili, è possibile un exploit di sicurezza. Se due metodi M1 e M2 soddisfano le condizioni seguenti, i chiamanti malintenzionati possono usare il metodo M1 per ignorare la richiesta implicita di collegamento di attendibilità completa che protegge M2:

  • M1 è un metodo pubblico dichiarato in un assembly completamente attendibile con l'attributo APTCA.

  • M1 chiama un metodo M2 all'esterno M1dell'assembly.

  • M2L'assembly non ha l'attributo APTCA e pertanto non deve essere eseguito da o per conto dei chiamanti parzialmente attendibili.

Un chiamante X parzialmente attendibile può chiamare il metodo M1, causando M1 la chiamata M2a . Poiché M2 non dispone dell'attributo APTCA, il chiamante immediato (M1) deve soddisfare una richiesta di collegamento per l'attendibilità totale; M1 ha attendibilità completa e pertanto soddisfa questo controllo. Il rischio di sicurezza è dovuto X al fatto che non partecipa alla soddisfazione della richiesta di collegamento che protegge M2 dai chiamanti non attendibili. Pertanto, i metodi con l'attributo APTCA non devono chiamare metodi che non dispongono dell'attributo .

Come correggere le violazioni

Se l'attributo APTCA è obbligatorio, usare una richiesta per proteggere il metodo che chiama nell'assembly di attendibilità totale. Le autorizzazioni esatte richieste dipendono dalla funzionalità esposta dal metodo. Se possibile, proteggere il metodo con una richiesta di attendibilità totale per garantire che la funzionalità sottostante non sia esposta ai chiamanti parzialmente attendibili. Se non è possibile, selezionare un set di autorizzazioni che consente di proteggere efficacemente le funzionalità esposte.

Quando eliminare gli avvisi

Per eliminare in modo sicuro un avviso da questa regola, è necessario assicurarsi che la funzionalità esposta dal metodo non consenta direttamente o indirettamente ai chiamanti di accedere a informazioni riservate, operazioni o risorse che possono essere usate in modo distruttivo.

Esempio 1

Nell'esempio seguente vengono usati due assembly e un'applicazione di test per illustrare la vulnerabilità di sicurezza rilevata da questa regola. Il primo assembly non ha l'attributo APTCA e non deve essere accessibile ai chiamanti parzialmente attendibili (rappresentati dalla M2 discussione 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.");
      }
   }
}

Esempio 2

Il secondo assembly è completamente attendibile e consente chiamanti parzialmente attendibili (rappresentati dalla M1 discussione 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();
     }
   }
}

Esempio 3

L'applicazione di test (rappresentata da X nella discussione 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 testClass = new ClassRequiringFullTrust();
          testClass.Access();
      }
   }
}

Nell'esempio viene prodotto l'output seguente:

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

Vedi anche