Compartilhar via


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

Item Valor
RuleId CA2141
Categoria Microsoft.Security
Alteração da falha Quebra

Causa

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

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Atender a um LinkDemand é uma operação confidencial para a segurança que pode causar elevação de privilégio não intencional. O código transparente de segurança não deve atender ao LinkDemands, pois não está sujeito aos mesmos requisitos de auditoria de segurança que o código crítico de segurança. Métodos transparentes em assemblies de nível 1 do conjunto de regras de segurança farão com que todos os LinkDemands que atendem sejam convertidos em demandas completas em tempo de execução, o que pode causar problemas de desempenho. Em assemblies de nível 2 do conjunto de regras de segurança, os métodos transparentes não serão compilados no compilador Just-In-Time (JIT) se tentarem atender a um LinkDemand.

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

Como corrigir violações

Para corrigir uma violação dessa regra, marque o método de acesso com o atributo SecurityCriticalAttribute ou SecuritySafeCriticalAttribute ou remova o LinkDemand do mecanismo acessado.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

Nesse exemplo, um método transparente tenta chamar um método que tem um LinkDemand. Essa regra será acionada nesse 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();
        }
    }
}