Compartilhar via


CA5122: declarações P/Invoke não devem ser críticas para segurança

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

CheckId

CA5122

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Uma declaração P/Invoke foi marcada com SecuritySafeCriticalAttribute:

[assembly: AllowPartiallyTrustedCallers]

// ...
public class C
{
    [SecuritySafeCritical]
    [DllImport("kernel32.dll")]
    public static extern bool Beep(int frequency, int duration); // CA5122 – safe critical p/invoke
   }

Neste exemplo, C.Beep(...) foi marcado como um método crítico de segurança.

Descrição da Regra

Os métodos são marcados como SecuritySafeCritical quando executam uma operação confidencial de segurança, mas também são seguros para serem usados pelo código transparente.Uma das regras básicas do modelo de transparência de segurança é que o código transparente nunca pode chamar diretamente o código nativo por P/Invoke.Por isso, a marcação de um P/Invoke como crítico de segurança não permitirá que o código transparente o chame, e é enganosa na análise de segurança.

Como Corrigir Violações

Para tornar P/Invoke disponível para o código transparente, exponha um método wrapper crítico de segurança para ele:

[assembly: AllowPartiallyTrustedCallers

class C
{
   [SecurityCritical]
   [DllImport(“kernel32.dll”, EntryPoint=”Beep”)]
   private static extern bool BeepPinvoke(int frequency, int duration); // Security Critical P/Invoke

   [SecuritySafeCritical]
   public static bool Beep(int frequency, int duration)
   {
      return BeepPInvoke(frequency, duration);
   }
}

Quando Suprimir Avisos

Não suprima um aviso nessa regra.