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.