Condividi tramite


CA2141:I metodi Transparent non devono soddisfare i LinkDemand

TypeName

TransparentMethodsMustNotSatisfyLinkDemands

CheckId

CA2141

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Un metodo Security Transparent chiama un metodo in un assembly che non è contrassegnato dall'attributo AllowPartiallyTrustedCallersAttribute (APTCA) oppure un metodo Security Transparent soddisfa un SecurityAction().LinkDemand per un tipo o un metodo.

Descrizione della regola

Soddisfare un LinkDemand è un'operazione sensibile per la sicurezza che può provocare elevazione di privilegi non intenzionale. Il codice SecurityTransparent non deve soddisfare LinkDemands, perché non è soggetto agli stessi requisiti del controllo di sicurezza del codice SecurityCritical. I metodi trasparenti negli assembly del set di regole di sicurezza di livello 1 faranno in modo che tutti i LinkDemands che essi soddisfano vengano convertiti in richieste complete in fase di esecuzione, che può creare problemi di prestazione. Negli assembly del set di regole di sicurezza di livello 2, metodi trasparenti non riusciranno a compilare tramite il compilatore JIT (Just-in-time) se tentano di soddisfare un LinkDemand.

Negli assembly che utilizzano la sicurezza di Livello 2, i tentativi da parte di un metodo SecurityTransparent di soddisfare un LinkDemand o di chiamare un metodo in un assembly non-APTCA generano un MethodAccessException; negli assembly di Livello 1, LinkDemand diventa una Richiesta completa.

Come correggere le violazioni

Per correggere una violazione di questa regola, contrassegnare il metodo di accesso con l'attributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute o rimuovere LinkDemand dal metodo di accesso.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

In questo esempio, un metodo trasparente tenta di chiamare un metodo che dispone di un LinkDemand. Questa regola funzionerà su questo codice.

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();
        }
    }
}