Sdílet prostřednictvím


CA2138: Transparentní metody nesmějí volat metody s atributem SuppressUnmanagedCodeSecurity

Název_typu

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Kategorie

Microsoft.Security

Změnit rozdělení

Rozdělení

Příčina

Metoda zabezpečení průhledných volá metodu, která je označena SuppressUnmanagedCodeSecurityAttribute atributu.

Popis pravidla

Toto pravidlo je transparentní metodu, která volá přímo do nativního kódu, například pomocí prostřednictvím P/Invoke (platforma vyvolat) volání.P/Invoke a COM interop metody, které jsou označeny SuppressUnmanagedCodeSecurityAttribute výsledek v LinkDemand proti volající metodu v atributu.Protože kód průhledné zabezpečení nemůže splnit LinkDemands, kód také nelze volat metody, které jsou označeny atributem SuppressUnmanagedCodeSecurity nebo metody třídy, která je označena atributem SuppressUnmanagedCodeSecurity.Metoda se nezdaří nebo poptávky budou převedeny na plné poptávky.

Porušení tohoto pravidla vést k MethodAccessException v modelu 2 úrovně zabezpečení průhlednosti a celou poptávku UnmanagedCode v modelu průhlednosti úrovně 1.

Jak opravit porušení

Porušení tohoto pravidla vyřešit, odeberte SuppressUnmanagedCodeSecurityAttribute atributu a označit metodu s SecurityCriticalAttribute nebo SecuritySafeCriticalAttribute atributu.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.

Příklad

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

}