CA2116: Los métodos APTCA deben llamar solo a métodos APTCA

Elemento Valor
RuleId CA2116
Category Microsoft.Security
Cambio importante Problemático

Causa

Un método de un ensamblado con el atributo System.Security.AllowPartiallyTrustedCallersAttribute llama a un método de un ensamblado que no tiene el atributo.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

De forma predeterminada, los métodos públicos o protegidos de ensamblados con nombres seguros están protegidos implícitamente por Peticiones de vínculos de plena confianza; solo los autores de llamadas de plena confianza pueden acceder a un ensamblado con nombre seguro. Los ensamblados con nombre seguro marcados con el atributo AllowPartiallyTrustedCallersAttribute (APTCA) no tienen esta protección. El atributo deshabilita la petición de vínculo, lo que hace que el ensamblado sea accesible para autores de llamadas que no tienen plena confianza como, por ejemplo, el código que se ejecuta desde una intranet o Internet.

Si está presente el atributo APTCA en un ensamblado de plena confianza y el ensamblado ejecuta código en otro ensamblado que permite autores de llamadas de confianza parcial, se puede producir una vulnerabilidad en el sistema de seguridad. Si dos métodos M1 y M2 cumplen las siguientes condiciones, los autores de llamadas malintencionados pueden usar el método M1 para omitir la petición implícita de vínculo de plena confianza que protege M2:

  • M1 es un método público declarado en un ensamblado de plena confianza que tiene el atributo APTCA.

  • M1 llama a un método M2 fuera del ensamblado M1.

  • El ensamblado M2 no tiene el atributo APTCA y, por lo tanto, no deben ejecutarlo los autores de llamadas de confianza parcial ni siquiera en su nombre.

Un autor de llamada X de confianza parcial puede llamar al método M1, lo que hace que M1 llame a M2. Dado que M2 no tiene el atributo APTCA, su autor de llamada inmediato (M1) debe satisfacer una petición de vínculo de plena confianza; M1 tiene plena confianza y, por lo tanto, cumple este requisito. El riesgo de seguridad se debe a que X no participa a la hora de satisfacer la petición de vínculo que protege M2 de los autores de llamadas que no son de confianza. Por lo tanto, los métodos con el atributo APTCA no deben llamar a métodos que no tengan ese atributo.

Cómo corregir infracciones

Si se requiere el atributo APTCA, use una demanda para proteger el método que llama al ensamblado de plena confianza. Los permisos exactos que solicite dependerán de la funcionalidad expuesta por el método. Si es posible, proteja el método con una petición de plena confianza para asegurarse de que la funcionalidad subyacente no esté expuesta a autores de llamadas de confianza parcial. Si esto no es posible, seleccione un conjunto de permisos que proteja eficazmente la funcionalidad expuesta.

Cuándo suprimir las advertencias

Para suprimir de forma segura una advertencia de esta regla, debe asegurarse de que la funcionalidad expuesta por el método no permita directa ni indirectamente a los autores de llamadas acceder a información, operaciones o recursos confidenciales que se puedan usar de forma destructiva.

Ejemplo 1

En el ejemplo siguiente se usan dos ensamblados y una aplicación de prueba para ilustrar la vulnerabilidad de seguridad detectada por esta regla. El primer ensamblado no tiene el atributo APTCA y no debe ser accesible para autores de llamadas de confianza parcial (representados por M2 en el análisis anterior).

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

Ejemplo 2

El segundo ensamblado es de plena confianza y permite autores de llamadas de confianza parcial (representados por M1 en el análisis anterior).

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

Ejemplo 3

La aplicación de prueba (representada por X en el análisis anterior) es de confianza parcial.

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

Este ejemplo produce el siguiente resultado:

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

Consulte también