Partilhar via


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);
    }
}