CA2138: I metodi Transparent non devono chiamare i metodi con l'attributo SuppressUnmanagedCodeSecurity
TypeName |
TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods |
CheckId |
CA2138 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Un metodo SecurityTransparent chiama un metodo contrassegnato dall'attributo SuppressUnmanagedCodeSecurityAttribute.
Descrizione della regola
Questa regola funziona su qualsiasi metodo trasparente che chiama direttamente in codice nativo, ad esempio tramite chiamata P/Invoke (platform invoke).P/Invoke e metodi di interoperabilità COM contrassegnati dall'attributo SuppressUnmanagedCodeSecurityAttribute risultano in un LinkDemand eseguito sul metodo chiamante.Poiché il codice SecurityTransparent non può soddisfare LinkDemands, il codice non può chiamare inoltre metodi contrassegnati dall'attributo SuppressUnmanagedCodeSecurity o metodi di classe contrassegnati dall'attributo SuppressUnmanagedCodeSecurity.Il metodo non riuscirà o la richiesta sarà convertita in una richiesta completa.
Violazioni di questa regola conducono a MethodAccessException nel modello SecurityTransparent di Livello 2 e ad una richiesta completa per UnmanagedCode nel modello della trasparenza di livello 1.
Come correggere le violazioni
Per correggere una violazione di questa regola, rimuovere l'attributo SuppressUnmanagedCodeSecurityAttribute e contrassegnare il metodo con l'attributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class CallSuppressUnmanagedCodeSecurityClass
{
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool Beep(uint dwFreq, uint dwDuration);
public void CallNativeMethod()
{
// CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
// (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
Beep(10000, 1);
}
}
}