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

Товар Значение
Идентификатор правила CA2138
Категория Microsoft.Security
Критическое изменение Критическое

Причина

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

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

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

Это правило запускает любой прозрачный метод, который вызывает непосредственно в машинный код, например с помощью вызова P/Invoke (вызова платформы). Методы взаимодействия P/Invoke и COM, помеченные SuppressUnmanagedCodeSecurityAttribute атрибутом, приводят к тому, что LinkDemand выполняется для вызывающего метода. Так как прозрачный код безопасности не может удовлетворить LinkDemands, код также не может вызывать методы, помеченные атрибутом 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);
        }
    }

}