Partilhar via


CA2141: métodos transparentes não devem atender a LinkDemands

TypeName

TransparentMethodsMustNotSatisfyLinkDemands

CheckId

CA2141

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

Um método de segurança transparente chama um método em um assembly que não está marcado com o AllowPartiallyTrustedCallersAttribute atributo (APTCA) ou um método de segurança transparente satisfaz uma SecurityAction().LinkDemand para um tipo ou método.

Descrição da regra

Satisfazer um LinkDemand é uma operação sensível de segurança que pode causar a não-intencional de elevação de privilégio. Código de segurança transparente não deve satisfazer a LinkDemands, porque não está sujeito a requisitos de auditoria de segurança como o código de segurança crítica. Métodos transparentes em assemblies de nível 1 do conjunto de regra de segurança fará com que todas as LinkDemands atendem a ser convertido para as demandas completas em tempo de execução, o que pode causar problemas de desempenho. Assemblies de nível 2 de conjunto de regra de segurança, os métodos transparentes não compilar no compilador just-in-time (JIT), se tentar satisfazer um LinkDemand.

Em assemblies que usee a segurança de nível 2, tentativas de um método de segurança transparente para satisfazer um LinkDemand ou chamar um método em um assembly não-APTCA gera um MethodAccessException; assemblies de nível 1 a LinkDemand torna-se uma demanda completa.

Como corrigir violações

Para corrigir uma violação desta regra, marcar o método de acesso com o SecurityCriticalAttribute ou SecuritySafeCriticalAttribute de atributo, ou remover o LinkDemand do método acessados.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

Neste exemplo, um método transparente tenta chamar um método que possui um LinkDemand. Esta regra será acionado neste código.

using System;
using System.Security.Permissions;


namespace TransparencyWarningsDemo
{

    public class TransparentMethodSatisfiesLinkDemandsClass
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        public void LinkDemandMethod() { }


        public void TransparentMethod()
        {
            // CA2141 violation - transparent method calling a method protected with a link demand.  Any of the
            // following fixes will work here:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Remove the LinkDemand from LinkDemandMethod  (In this case, that would be recommended anyway
            //     since it's level 2 -- however you could imagine it in a level 1 assembly)
            LinkDemandMethod();
        }
    }
}