Partilhar via


Métodos APTCA somente devem chamar métodos APTCA

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Quebrando

Causa

Um método em um assembly com o System.Security.AllowPartiallyTrustedCallersAttribute atributo chama um método em um assembly que não tem o atributo.

Descrição da regra

Por padrão, os métodos públicos ou protegidos em assemblies com nomes fortes implicitamente são protegidos por um Demandas de link confiança total; somente totalmente confiável chamadores podem acesso um assembly de nome forte. Assemblies de nomes de alta segurança marcados com o AllowPartiallyTrustedCallersAttribute Atributo (APTCA) não têm essa proteção. O atributo desativa a demanda de link, tornando o assembly acessíveis aos chamadores que não têm confiança total, sistema autônomo o código executado de uma intranet ou da Internet.

Quando o atributo APTCA estiver presente em um assembly totalmente confiável e o assembly executa código em outro assembly que não permite chamadores parcialmente confiável, uma exploração de segurança é possível.Se dois métodos M1 e M2 atender às seguintes condições, chamadores mal-intencionados podem usar o método M1 para ignorar a demanda de link implícita de confiança total que protege M2:

  • M1 um método público está declarado em um assembly totalmente confiável que tem o atributo APTCA.

  • M1 chama um método M2 fora M1do assembly.

  • M2do assembly não tem o atributo APTCA e, portanto, não deve ser executado por ou em nome dos chamadores parcialmente confiável.

Parcialmente confiável telefonar er X pode telefonar método M1, causando M1 para telefonar M2. Porque M2 não tem o atributo APTCA, seu chamador imediato)M1) deve estar de acordo com uma demanda de link de confiança total; M1 tem confiança total e, portanto, satisfaz essa verificação. O risco de segurança é porque X não participa de satisfazer a demanda de link que protege M2 de chamadores não confiáveis. Portanto, os métodos com o atributo APTCA não devem chamar métodos que não possuem o atributo.

Como corrigir violações

Se o atributo APCTA for necessário, use um Dados do Access para proteger o método que chama o assembly confiança total. As permissões exatas depende de você demanda a funcionalidade exposta pelo seu método.Se for possível, proteja o método com uma solicitação de confiança total garantir que a funcionalidade subjacente não é exposta aos chamadores parcialmente confiável.Se não for possível, selecionar um conjunto de permissões que protege com eficácia a funcionalidade exposta.

Quando suprimir avisos

Para eliminar com segurança um aviso da regra, você deve garantir que a funcionalidade exposta pelo seu método não direta ou indiretamente permite chamadores para acessar informações confidenciais, operações ou recursos que podem ser usados de maneira destrutiva.

Exemplo

O exemplo a seguir usa dois assemblies e um aplicativo de teste para ilustrar a vulnerabilidade de segurança detectada por essa regra.A primeira assembly não tem o atributo APTCA e não devem ser acessíveis aos chamadores parcialmente confiável (representados por M2 na discussão 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.");
      }
   }
}

O segundo conjunto é totalmente confiável e permite chamadores parcialmente confiável (representados por M1 na discussão 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();
     }
   }
}

O aplicativo de teste (representado por X na discussão anterior) é parcialmente confiável.

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

O exemplo produz a seguinte saída.

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

Regras relacionadas

Tipos APTCA só devem estender APTCA tipos base

Consulte também

Conceitos

Assemblies do .NET framework marcados com AllowPartiallyTrustedCallersAttribute

Usando bibliotecas de códigos parcialmente Confiável

Demandas de link

Outros recursos

Diretrizes para Codificação Segura

Dados do Access