Compartilhar via


CA2139: os métodos transparentes talvez não usem o atributo HandleProcessCorruptingExceptions

TypeName

TransparentMethodsMustNotHandleProcessCorruptingExceptions

CheckId

CA2139

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Um método transparente é marcado com o atributo de HandleProcessCorruptedStateExceptionsAttribute .

Descrição da Regra

Esta regra é disparada qualquer método que é transparente e tenta controlar um processo que compromete a exceção usando o atributo de HandleProcessCorruptedStateExceptionsAttribute .Um processo que compromete a exceção é uma classificação da exceção de versão 4,0 do CLR de exceções por AccessViolationException.O atributo de HandleProcessCorruptedStateExceptionsAttribute pode ser usado apenas por métodos importantes de segurança, e será ignorado se for aplicado a um método transparente.Para controlar o processo que compromete exceções, esse método deve se tornar crítico segurança ou segurança seguro- crítico.

Como Corrigir Violações

Para corrigir uma violação desta regra, remova o atributo de HandleProcessCorruptedStateExceptionsAttribute , ou marcar o método com SecurityCriticalAttribute ou atributo de SecuritySafeCriticalAttribute .

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

Neste exemplo, um método transparente é marcado com o atributo de HandleProcessCorruptedStateExceptionsAttribute e falhará a regra.O método também deve ser marcado com SecurityCriticalAttribute ou atributo de 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) { }
        }
    }

}