Partilhar via


CA2116: os métodos APTCA só devem chamar métodos APTCA

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Um método de um assembly com o atributo de AllowPartiallyTrustedCallersAttribute chama um método em um assembly que não tenha o atributo.

Descrição da Regra

Por padrão, o utilitário ou métodos protegidos em assemblies com nomes fortes são protegidos implicitamente por Demandas de link para o modo confiança total; somente os chamadores totalmente confiável podem acessar um assembly com nome forte.Os assemblies de nome forte marcados com o atributo de AllowPartiallyTrustedCallersAttribute (APTCA) não têm essa proteção.O atributo desabilita a procura de link, fazendo com que o assembly acessível aos visitantes que não tem a confiança total, como o código executado de uma intranet ou da Internet.

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

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

  • M1 chama um método M2 fora do assembly de M1 .

  • o assembly deM2 não tenha um atributo de APTCA e, consequentemente, não deve ser executado no ou em nome dos chamadores parcialmente confiáveis.

Um chamador parcialmente confiável X pode chamar o método M1, fazendo com que M1 chama M2.Como M2 não tenha um atributo de APTCA, o chamador imediato (M1) deve satisfazer uma procura de link para o modo confiança total; M1 tem a confiança total e os como consequência essa verificação.O risco de segurança é porque participa de X não atender à procura de link que protege M2 chamadores não confiáveis.Consequentemente, os métodos com o atributo de APTCA não devem chamar os métodos que não têm o atributo.

Como Corrigir Violações

Se o atributo de APCTA é necessário, use uma procurar para proteger o método que chama no assembly de confiança total.As permissões que você precisar exatas dependem da funcionalidade exposta pelo método.Se for possível, proteja o método com uma demanda para que o modo confiança total verifique se a funcionalidade subjacente não seja exposto a chamadores parcialmente confiáveis.Se isso não for possível, selecione um conjunto de permissões que protege efetivamente a funcionalidade exposta.Para obter mais informações sobre as demandas, consulte Demandas.

Quando Suprimir Alertas

Para suprimir com segurança um aviso desta regra, você deve assegurar que a funcionalidade exposta por seu método não permita direta ou indiretamente quais os chamadores acessem informações confidenciais, as operações, ou recursos que podem ser usados em uma forma destrutiva.

Exemplo

O exemplo a seguir usa dois assemblies e um aplicativo de teste para ilustrar a vulnerabilidade de segurança detectada por esta regra.O primeiro assembly não tenha um atributo de APTCA e não deve ser acessível aos chamadores parcialmente confiáveis (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 assembly está totalmente confiável e permite que os chamadores parcialmente confiáveis (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 testClass = new ClassRequiringFullTrust();
          testClass.Access();
      }
   }
}

O exemplo produz a seguinte saída.

  

Regras Relacionadas

CA2117: os tipos APTCA só devem estender tipos base APTCA

Consulte também

Conceitos

Assemblies do .NET Framework que podem ser chamados por código parcialmente confiável

Usando bibliotecas de código parcialmente confiável

Demandas

Demandas de link

Outros recursos

Diretrizes de codificação segura

Dados e modelagem no .NET Framework