Поделиться через


CA2138: прозрачные методы не должны вызывать методы с атрибутом SuppressUnmanagedCodeSecurity

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Категория

Microsoft.Security

Критическое изменение

Критическое изменение

Причина

Прозрачный метод безопасности вызывает метод, помеченный атрибутом SuppressUnmanagedCodeSecurityAttribute.

Описание правила

Это правило срабатывает для любого прозрачного метода, который вызывается непосредственно в машинном коде, например, с помощью P/Invoke (неуправляемого) вызова.Методы P/Invoke и COM-взаимодействия, которые помечены с помощью атрибута SuppressUnmanagedCodeSecurityAttribute, приводят к выполнению LinkDemand относительно вызывающего метода.Поскольку прозрачный код безопасности не может удовлетворить требования LinkDemand, код также не может вызывать методы, помеченные атрибутом SuppressUnmanagedCodeSecurity, или методы класса, помеченного атрибутом SuppressUnmanagedCodeSecurity.Метод выдаст ошибку, или требования будут преобразованы в полные требования.

Нарушения этого правила могут вызвать исключение MethodAccessException на модели прозрачности безопасности 2 уровня и применение полных требований для UnmanagedCode в модели прозрачности 1 уровня.

Устранение нарушений

Чтобы устранить нарушение данного правила, удалите атрибут SuppressUnmanagedCodeSecurityAttribute и отметьте метод атрибутом SecurityCriticalAttribute или SecuritySafeCriticalAttribute.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

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

}