Condividi tramite


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

}