Condividi tramite


I metodi Security transparent non possono contenere riferimenti a membri critici di sicurezza non pubblici

Aggiornamento: novembre 2007

TypeName

ImetodiSecuritytransparentnonpossonocontenereriferimentiamembricriticidisicurezzanonpubblici

CheckId

CA2129

Categoria

Microsoft.Security

Breaking Change

Breaking

Causa

I metodi contrassegnati con SecurityTransparentAttribute richiamano membri non pubblici, a loro volta contrassegnati con SecurityCritical. L’impostazione predefinita per i metodi è quella di SecurityTransparent.

Descrizione della regola

Con .NET Framework 2.0 è stata introdotta una funzionalità denominata trasparenza. I singoli metodi, campi, interfacce, classi e tipi possono essere o trasparenti o critici.

Il codice trasparente non ha accesso a privilegi di sicurezza avanzati. Pertanto, qualsiasi autorizzazione venga concessa o richiesta tramite tale codice viene automaticamente passata attraverso il codice al chiamante o all’AppDomain dell’ host. Esempi di privilegi avanzati sono l'accesso ad Asserzioni, LinkDemands, SuppressUnmanagedCode e codice unsafe.

Lo scopo della separazione fra codice trasparente e critico è quello di semplificare la sicurezza di controllo del processo. I controlli vengono in genere eseguiti su punti di ingresso pubblici, perché sussiste la possibilità di farne un uso dannoso e non affidabile. Contrassegnando come critiche le sezioni più piccole di un assembly, il controllo di sicurezza può essere ristretto ai punti di ingresso pubblici e alle sezioni critiche di sicurezza in grado di fornire privilegi avanzati. Ad ogni modo, per assicurarsi che il controllo sia accurato e completo, il confine tra codice trasparente e codice critico deve essere applicato nel modo più preciso possibile. L'alternativa sarebbe quella di consentire al codice trasparente di richiamare il codice critico della sicurezza interna, il quale a sua volta richiede un controllo più stretto sul codice trasparente.

In fase di Runtime, il compilatore JIT del Common Language Runtime verifica se il codice trasparente stia facendo riferimento o richiamando il codice critico della sicurezza non pubblica. Se un richiamo viene effettuato a partire da un codice trasparente verso un codice critico non pubblico, verrebbe generata un'eccezione come nell’esempio di MethodAccessException. La metodologia di gestione è in questo caso simile a quella utilizzata nel caso di una classe che tenta di accedere ai membri privati di un'altra classe.

Tale regola di analisi del codice analizza tutti i metodi e i caratteri in un assembly combinato trasparente/critico. Inoltre evidenzia qualsiasi richiamo effettuato da codice trasparente verso codice critico non pubblico che non sia contrassegnato come SecurityTreatAsSafe.

Correzione di violazioni

Per risolvere il problema, è possibile contrassegnare il codice che richiama quello SecurityCritical non pubblico come SecurityCritical; oppure contrassegnare il metodo di destinazione/carattere come SecurityTreatAsSafe. In questo modo il codice viene considerato sicuro e controllato efficacemente, in modo da essere protetto da intenti dannosi .

Soppressione degli avvisi

Non sopprimere un messaggio da questa regola.

Esempio

Il codice seguente darà un messaggio di errore perché SecondSecurityMethod è privato e SecurityCritical. Come esempio di un problema di sicurezza, l'asserzione in SecondSecurityMethod impedirà che richieste complete in azioni privilegiate e richiami esterni confluiscano in FirstSecurityMethod, limitatamente ai controlli di sicurezza eseguiti sul chiamante.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        // SecurityTransparent
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

Se il confine trasparente/critico non fosse applicato, FirstSecurityMethod sarebbe in grado di eseguire tutte le azioni di SecondSecurityMethod senza controlli di sicurezza.

Un'opzione consiste nella revisione del codice del metodo: se il metodo viene considerato tanto sicuro da poter accedere al livello più alto e al sicuro da attacchi, contrassegnarlo come SecurityTreatAsSafe:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        // SecurityTransparent
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityTreatAsSafe]
        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

Un'altra opzione consiste invece nel rendere il metodo 1 anche critico. In questo modo si espande il kernel critico dell'assembly e si aumenta la dimensione del controllo di sicurezza. In tal modo verranno garantiti un modello di minaccia e un’analisi di flusso del codice appropriati alla richiesta.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

Vedere anche

Riferimenti

SecurityTransparentAttribute

SecurityCriticalAttribute

SecurityTransparentAttribute

SecurityTreatAsSafeAttribute

System.Security