CA2118: Uso de SuppressUnmanagedCodeSecurityAttribute de revisão
TypeName |
ReviewSuppressUnmanagedCodeSecurityUsage |
CheckId |
CA2118 |
<strong>Categoria</strong> |
Microsoft.Security |
Alteração significativa |
Quebrando |
Causa
Um tipo de público ou protegido ou membro tem o System.Security.SuppressUnmanagedCodeSecurityAttribute atributo.
Descrição da regra
SuppressUnmanagedCodeSecurityAttributeAltera o comportamento do sistema de segurança padrão para membros que executar o código não gerenciado usando invocação de plataforma ou de interoperabilidade COM.Em geral, o sistema se torna um Dados e modelagem da.NET Framework permissão de código não gerenciado.Essa demanda ocorre em tempo de execução para cada invocação do membro e verifica cada chamador na pilha de chamadas para permissão.Quando o atributo estiver presente, o sistema faz uma Demandas de link para a permissão: as permissões do chamador imediato são verificadas quando o chamador é compilado em JIT.
Esse atributo é usado principalmente para aumentar o desempenho; No entanto, o desempenho ganha vêm com consideráveis riscos à segurança.Se você colocar o atributo em membros públicos que chamam métodos nativos, os chamadores na pilha de chamadas (que não seja o chamador imediato) não é necessário a permissão de código não gerenciado para executar o código não gerenciado.Dependendo do membro público ações e manipulação de entrada, ele pode permitir que chamadores não confiáveis para acessar funcionalidades normalmente restringidas ao código confiável.
O .NET Framework se baseia em verificações de segurança para impedir que os chamadores tenham acesso direto ao espaço de endereço do processo atual.Como esse atributo ignora normais de segurança, o seu código representa uma ameaça séria, se ele pode ser usado para ler ou gravar na memória do processo.Observe que o risco não é limitado a métodos que intencionalmente fornecem acesso para processar a memória; Ele também está presente em qualquer cenário em que código mal-intencionado pode obter acesso por qualquer meio, por exemplo, fornecendo entrada surpreendente, malformada ou inválida.
A diretiva de segurança padrão não concede a permissão de código não gerenciado para um assembly, a menos que ele está em execução no computador local ou um membro de um dos seguintes grupos:
Grupo de códigos de zona Meu computador
Grupo de códigos de nome de alta segurança Microsoft
Grupo de códigos de nome forte ECMA
Como corrigir violações
Leia com atenção o seu código para garantir que este atributo seja absolutamente necessário.Se você não estiver familiarizado com a segurança do código gerenciado ou não entende as implicações de segurança de usar esse atributo, remova-o em seu código.Se o atributo for necessário, você deve garantir que os chamadores não podem usar seu código de maneira mal-intencionada.Se seu código não tem permissão para executar o código não gerenciado, esse atributo não tem nenhum efeito e deve ser removido.
Quando suprimir avisos
Para suprimir com segurança um aviso da regra, você deve garantir que seu código não fornecer chamadores acesso a operações nativas ou recursos que podem ser usados de maneira destrutiva.
Exemplo
O exemplo a seguir viola a regra.
using System.Security;
// These two classes are identical
// except for the location of the attribute.
namespace SecurityRulesLibrary
{
public class MyBadMemberClass
{
[SuppressUnmanagedCodeSecurityAttribute()]
public void DoWork()
{
FormatHardDisk();
}
void FormatHardDisk()
{
// Code that calls unmanaged code.
}
}
[SuppressUnmanagedCodeSecurityAttribute()]
public class MyBadTypeClass
{
public void DoWork()
{
FormatHardDisk();
}
void FormatHardDisk()
{
// Code that calls unmanaged code.
}
}
}
No exemplo a seguir, o DoWork método fornece um caminho de código publicamente acessíveis para o método de invocação de plataforma FormatHardDisk.
using System.Security;
using System.Runtime.InteropServices;
namespace SecurityRulesLibrary
{
public class SuppressIsOnPlatformInvoke
{
// The DoWork method is public and provides unsecured access
// to the platform invoke method FormatHardDisk.
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("native.dll")]
private static extern void FormatHardDisk();
public void DoWork()
{
FormatHardDisk();
}
}
// Having the attribute on the type also violates the rule.
[SuppressUnmanagedCodeSecurityAttribute()]
public class SuppressIsOnType
{
[DllImport("native.dll")]
private static extern void FormatHardDisk();
public void DoWork()
{
FormatHardDisk();
}
}
}
No exemplo a seguir, o método público DoDangerousThing causa uma violação.Para resolver a violação, DoDangerousThing deve ser feita em particular e o acesso a ele deve ser por meio de um método público, protegido por uma demanda de segurança, como ilustrado pela DoWork método.
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace SecurityRulesLibrary
{
[SuppressUnmanagedCodeSecurityAttribute()]
public class BadTypeWithPublicPInvokeAndSuppress
{
[DllImport("native.dll")]
public static extern void DoDangerousThing();
public void DoWork()
{
// Note that because DoDangerousThing is public, this
// security check does not resolve the violation.
// This only checks callers that go through DoWork().
SecurityPermission secPerm = new SecurityPermission(
SecurityPermissionFlag.ControlPolicy |
SecurityPermissionFlag.ControlEvidence
);
secPerm.Demand();
DoDangerousThing();
}
}
}
Consulte também
Referência
System.Security.SuppressUnmanagedCodeSecurityAttribute