CA2116: Los métodos APTCA deben llamar solo a métodos APTCACA2116: APTCA methods should only call APTCA methods

TypeNameTypeName AptcaMethodsShouldOnlyCallAptcaMethodsAptcaMethodsShouldOnlyCallAptcaMethods
Identificador de comprobaciónCheckId CA2116CA2116
CategoríaCategory Microsoft.SecurityMicrosoft.Security
Cambio problemáticoBreaking Change ProblemáticoBreaking

MotivoCause

Un método en un ensamblado con el System.Security.AllowPartiallyTrustedCallersAttribute atributo llama a un método en un ensamblado que no tiene el atributo.A method in an assembly with the System.Security.AllowPartiallyTrustedCallersAttribute attribute calls a method in an assembly that does not have the attribute.

Descripción de la reglaRule Description

De forma predeterminada, los métodos públicos o protegidos de ensamblados con nombres seguros implícitamente están protegidos por un peticiones de vínculo de plena confianza; solo de plena confianza para los autores de llamada pueden tener acceso a un ensamblado con nombre seguro.By default, public or protected methods in assemblies with strong names are implicitly protected by a Link Demands for full trust; only fully trusted callers can access a strong-named assembly. Los ensamblados con nombre seguro marcados con el AllowPartiallyTrustedCallersAttribute atributo (APTCA) no tiene esta protección.Strong-named assemblies marked with the AllowPartiallyTrustedCallersAttribute (APTCA) attribute do not have this protection. El atributo deshabilita la petición de vínculo, lo que el ensamblado puede tener acceso a los llamadores que no tienen plena confianza, por ejemplo, el código que se ejecuta desde una intranet o Internet.The attribute disables the link demand, making the assembly accessible to callers that do not have full trust, such as code executing from an intranet or the Internet.

Si el atributo APTCA está presente en un ensamblado de plena confianza y el ensamblado ejecuta código en otro ensamblado que no permite a llamadores parcialmente confiables, es posible un ataque de seguridad.When the APTCA attribute is present on a fully trusted assembly, and the assembly executes code in another assembly that does not allow partially trusted callers, a security exploit is possible. Si dos métodos M1 y M2 cumplen las condiciones siguientes, los llamadores malintencionados pueden usar el método M1 para omitir la petición de vínculo de plena confianza implícita que protege M2:If two methods M1 and M2 meet the following conditions, malicious callers can use the method M1 to bypass the implicit full trust link demand that protects M2:

  • M1 es un método público que se declara en un ensamblado de plena confianza que tiene el atributo APTCA.M1 is a public method declared in a fully trusted assembly that has the APTCA attribute.

  • M1 llama a un método M2 fuera M1del ensamblado.M1 calls a method M2 outside M1's assembly.

  • M2del ensamblado no tiene el atributo APTCA y, por lo tanto, no debe ejecutarse por o en nombre de los llamadores de confianza parcial.M2's assembly does not have the APTCA attribute and, therefore, should not be executed by or on behalf of callers that are partially trusted.

    Un llamador de confianza parcial X puede llamar al método M1, con lo que M1 para llamar a M2.A partially trusted caller X can call method M1, causing M1 to call M2. Dado que M2 no tiene el atributo APTCA, su llamador inmediato (M1) debe satisfacer una petición de vínculo de plena confianza; M1 es de plena confianza y, por tanto, supera esta comprobación.Because M2 does not have the APTCA attribute, its immediate caller (M1) must satisfy a link demand for full trust; M1 has full trust and therefore satisfies this check. El riesgo de seguridad es porque X no participa en el cumplimiento de la petición de vínculo que protege M2 de llamadores de confianza.The security risk is because X does not participate in satisfying the link demand that protects M2 from untrusted callers. Por lo tanto, los métodos con el atributo APTCA no deben llamar métodos que no tienen el atributo.Therefore, methods with the APTCA attribute must not call methods that do not have the attribute.

Cómo corregir infraccionesHow to Fix Violations

Si el atributo APCTA es necesario, use una petición para proteger el método que llama al ensamblado de plena confianza.If the APCTA attribute is required, use a demand to protect the method that calls into the full trust assembly. Los permisos exactos que se solicitan dependerán de la funcionalidad expuesta por el método.The exact permissions you demand will depend on the functionality exposed by your method. Si es posible, proteja el método con una petición de plena confianza para asegurarse de que la funcionalidad subyacente no se expone a los llamadores de confianza parcial.If it is possible, protect the method with a demand for full trust to ensure that the underlying functionality is not exposed to partially trusted callers. Si esto no es posible, seleccione un conjunto de permisos que proteja eficazmente la funcionalidad expuesta.If this is not possible, select a set of permissions that effectively protects the exposed functionality.

Cuándo suprimir advertenciasWhen to Suppress Warnings

Para suprimir una advertencia de esta regla de forma segura, debe asegurarse de que la funcionalidad expuesta por el método no directa ni indirectamente que los llamadores tener acceso a información confidencial, operaciones o recursos que se pueden usar de forma destructiva.To safely suppress a warning from this rule, you must ensure that the functionality exposed by your method does not directly or indirectly allow callers to access sensitive information, operations, or resources that can be used in a destructive manner.

EjemploExample

El ejemplo siguiente utiliza dos ensamblados y una aplicación de prueba para ilustrar la vulnerabilidad de seguridad detectada por esta regla.The following example uses two assemblies and a test application to illustrate the security vulnerability detected by this rule. El primer ensamblado no tiene el atributo APTCA y no debe estar accesible a los llamadores de confianza parcial (representado por M2 en la explicación anterior).The first assembly does not have the APTCA attribute and should not be accessible to partially trusted callers (represented by M2 in the previous discussion).

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

EjemploExample

El segundo ensamblado es de plena confianza y permite llamadores parcialmente confiables (representado por M1 en la explicación anterior).The second assembly is fully trusted and allows partially trusted callers (represented by M1 in the previous discussion).

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

EjemploExample

La aplicación de prueba (representada por X en la explicación anterior) es de confianza parcial.The test application (represented by X in the previous discussion) is partially trusted.

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:This example produces the following output.

Solicitar código de plena confianza: error en la solicitud. ** **ClassRequiringFullTrust.DoWork se llamó.Demand for full trust:Request failed. ClassRequiringFullTrust.DoWork was called.

CA2117: Los tipos APTCA solo amplían tipos base APTCACA2117: APTCA types should only extend APTCA base types

Vea tambiénSee Also

Instrucciones de codificación segura utilizar parcialmente bibliotecas de código de confianza las peticiones de vínculo datos y modeladoSecure Coding Guidelines Using Libraries from Partially Trusted Code Link Demands Data and Modeling