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


CA2139: прозрачные методы могут не использовать атрибут HandleProcessCorruptingExceptions

TypeName

TransparentMethodsMustNotHandleProcessCorruptingExceptions

CheckId

CA2139

Категория

Microsoft.Security

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

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

Причина

Прозрачный метод помечается атрибутом HandleProcessCorruptedStateExceptionsAttribute.

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

Это правило запускает любой прозрачный метод, который пытается обработать исключение повреждения процесса с помощью атрибута HandleProcessCorruptedStateExceptionsAttribute.Исключение повреждения процесса – это классификация версии 4.0 среды CLR таких исключений, как AccessViolationException.Атрибут HandleProcessCorruptedStateExceptionsAttribute может использоваться только критичными в плане безопасности методами и будет игнорироваться при применении для прозрачного метода.Для обработки исключений повреждения процесса этот метод должен быть критичным в плане безопасности или критически важным для безопасности.

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

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

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

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

Пример

В этом примере прозрачный метод помечен атрибутом HandleProcessCorruptedStateExceptionsAttribute, и происходит сбой правила.Метод также следует отметить атрибутом SecurityCriticalAttribute или SecuritySafeCriticalAttribute.

using System;
using System.Runtime.InteropServices;
using System.Runtime.ExceptionServices;
using System.Security;

namespace TransparencyWarningsDemo
{

    public class HandleProcessCorruptedStateExceptionClass
    {
        [DllImport("SomeModule.dll")]
        private static extern void NativeCode();

        // CA2139 violation - transparent method attempting to handle a process corrupting exception
        [HandleProcessCorruptedStateExceptions]
        public void HandleCorruptingExceptions()
        {
            try
            {
                NativeCode();
            }
            catch (AccessViolationException) { }
        }
    }

}