Impossibile asserire codice Security Transparent
Aggiornamento: novembre 2007
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2128 |
Categoria |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Al codice contrassegnato come SecurityTransparentAttribute non sono concesse autorizzazioni sufficienti per l'asserzione.
Descrizione della regola
Questa regola analizza tutti i metodi e i tipi in un assembly interamente Security Transparent o una combinazione di Security Transparent e Security Critical e contrassegna l'utilizzo dichiarativo o imperativo di Assert.
In fase di esecuzione, qualsiasi chiamata a Assert da codice Security Transparent causerà la generazione di un'eccezione SecurityException. Tale situazione può verificarsi sia negli assembly interamente Security Transparent sia negli assembly che sono una combinazione di Security Transparent e Security Critical in cui un metodo o un tipo è dichiarato trasparente, ma include un'asserzione dichiarativa o imperativa.
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 al dominio dell'applicazione host. Sono esempi di possibili elevazioni le asserzioni, le pretese LinkDemand, l'attributo SuppressUnmanagedCode e il codice unsafe.
Correzione di violazioni
Per risolvere il problema, contrassegnare il codice che chiama l'asserzione come Security Critical o rimuovere l'asserzione.
Esclusione di avvisi
Non sopprimere un messaggio da questa regola.
Esempio
Il codice non verrà eseguito correttamente se SecurityTestClass è trasparente, quando il metodo Assert genera una SecurityException.
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
// SecurityTransparent
void SecurityTransparentMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Un'opzione consiste nel rivedere il codice del metodo [SecurityTransparentMethod] e, se [SecurityTransparentMethod] è considerato sicuro per l'elevazione, contrassegnarlo come [SecurityCritical]. Tale operazione richiede un controllo di sicurezza dettagliato, completo e privo di errori su [SecurityTransparentMethod] e sui callout in questo inclusi sotto l'asserzione:
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
[System.Security.SecurityCritical]
void SecurityCriticalMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Un'altra opzione consiste nel rimuovere l'asserzione dal codice e lasciare che le richieste di autorizzazione di I/O del file successive vengano passate da [SecurityTransparentMethod] al chiamante, consentendo l'esecuzione dei controlli di sicurezza. In genere, in questi casi non è necessario alcun controllo di sicurezza, poiché le richieste di autorizzazione passeranno al chiamante e/o al dominio dell'applicazione. Le richieste di autorizzazione sono controllate rigorosamente tramite la concessione di autorizzazioni relative ai criteri di sicurezza, all'ambiente host e al codice sorgente.