CA2151: campos com tipos críticos devem ser críticos para segurança
TypeName |
|
CheckId |
CA2151 |
Categoria |
Microsoft.Security |
Alteração Significativa |
Quebra |
Causa
Um campo transparente de segurança ou um campo de segurança crítica é declarado.O tipo é especificado como de segurança crítica.Por exemplo:
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
Type1 m_field; // CA2151, transparent field of critical type
}
Neste exemplo, m_field é um campo transparente de segurança de um tipo de segurança crítica.
Descrição da Regra
Para usar tipos de segurança crítica, o código que faz referência ao tipo deve ser de segurança crítica ou de segurança crítica segura.Isso será verdadeiro mesmo que a referência seja indireta.Por exemplo, ao fazer referência a um campo transparente de tipo crítico, o código deve ser de segurança crítica ou de segurança.Por isso, ter um campo de segurança transparente ou de segurança crítica é enganoso porque o código transparente continuará incapaz de acessar o campo.
Como Corrigir Violações
Para corrigir uma violação dessa regra, marque o campo com o atributo SecurityCriticalAttribute ou crie o tipo referenciado pela segurança transparente ou crítica do campo.
// Fix 1: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
// Fix 2: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
class Type1 { } // Type1 is now transparent
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
Quando Suprimir Avisos
Não suprima um aviso nessa regra.
Código
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class SafeNativeMethods
{
// CA2145 violation - transparent method marked SuppressUnmanagedCodeSecurity. This should be fixed by
// marking this method SecurityCritical.
[DllImport("kernel32.dll", SetLastError = true)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool Beep(uint dwFreq, uint dwDuration);
}
}