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