Partilhar via


CA2116: Métodos APTCA só deverá chamar métodos APTCA

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

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 de públicos ou protegidos em assemblys com nomes fortes implicitamente são protegidos por um Demandas de link de confiança total; apenas chamadores totalmente confiáveis podem acessar um assembly de nome forte. Assemblies de nomes fortes são marcados com o AllowPartiallyTrustedCallersAttribute atributo (APTCA) não possuem proteção. O atributo desativa a demanda de link, fazendo com que o assembly acessível aos chamadores que não têm confiança total, como, por exemplo, o código executado a partir de uma intranet ou Internet.

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

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

  • M1chama 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áveis.

Um chamador parcialmente confiável X pode chamar o método M1, causando M1 para chamar M2. Porque M2 não tem o atributo APTCA, seu chamador imediato (M1) deve satisfazer uma demanda de link de confiança total; M1tem a 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 uma demanda para proteger o método que chama o assembly de confiança total. As permissões exatas demanda você dependerá da funcionalidade exposto pelo seu método. Se for possível, proteja o método com uma demanda de confiança total garantir que a funcionalidade subjacente não seja exposta a chamadores parcialmente confiáveis. Se não for possível, selecione um conjunto de permissões que protege com eficiência a funcionalidade exposta. Para obter mais informações sobre as demandas, consulte Demandas.

Quando suprimir avisos

Para suprimir com segurança um aviso da regra, você deve garantir que a funcionalidade exposta por seu método não direta ou indiretamente permite chamadores 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 esta regra. O primeiro conjunto não tem o atributo APTCA e não deve ser acessível a chamadores parcialmente confiáveis (representado 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 que os chamadores parcialmente confiáveis (representado 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: Tipos APTCA só devem estender tipos básicos de APTCA

Consulte também

Conceitos

Diretrizes para Codificação Segura

.NET Framework Assemblies podem ser chamados pelo código parcialmente confiável

Usando bibliotecas de código parcialmente confiáveis

Demandas

Demandas de link

Outros recursos

Modelagem e acesso a dados