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 tem 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, como, por exemplo, o código executado de uma intranet ou da 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 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 isso 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 pelo 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 módulos (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 aos 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
.NET Framework Assemblies podem ser chamados pelo código parcialmente confiável
Usando bibliotecas de código parcialmente confiáveis