Compartir a través de


CA5122: Las declaraciones P/Invoke no deben ser críticas para la seguridad

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

Identificador de comprobación

CA5122

Categoría

Microsoft.Security

Cambio problemático

Problemático

Motivo

Una declaración P/Invoke se ha marcado con SecuritySafeCriticalAttribute:

[assembly: AllowPartiallyTrustedCallers]

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

En este ejemplo, C.Beep(...) se ha marcado como crítico para la seguridad y disponible desde código transparente.

Descripción de la regla

Los métodos se marcan como SecuritySafeCritical cuando realizan una operación que afecta a la seguridad pero también son seguros para su uso en código transparente.Una de las reglas fundamentales del modelo de transparencia de seguridad es que el código transparente nunca puede llamar directamente a código nativo con P/Invoke.Por consiguiente, aunque se marque P/Invoke como crítico para la seguridad y disponible desde código transparente no permitirá que se llame desde código transparente llamarlo, y es erróneo para los análisis de seguridad.

Cómo corregir infracciones

Para hacer que P/Invoke esté a disposición del código transparente, exponga para el mismo un método contenedor crítico para la seguridad y disponible desde código transparente:

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

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.