CA2147: Il codice Transparent non può utilizzare asserzioni di sicurezza
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2147 |
Category |
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 InvalidOperationException. 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.
Come correggere le violazioni
Per risolvere il problema, contrassegnare il codice che chiama l'asserzione con SecurityCriticalAttribute 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 InvalidOperationException.
using System;
using System.Security;
using System.Security.Permissions;
namespace TransparencyWarningsDemo
{
public class TransparentMethodsUseSecurityAssertsClass
{
// CA2147 violation - transparent code using a security assert declaratively. This can be fixed by
// any of:
// 1. Make DeclarativeAssert critical
// 2. Make DeclarativeAssert safe critical
// 3. Remove the assert attribute
[PermissionSet(SecurityAction.Assert, Unrestricted = true)]
public void DeclarativeAssert()
{
}
public void ImperativeAssert()
{
// CA2147 violation - transparent code using a security assert imperatively. This can be fixed by
// any of:
// 1. Make ImperativeAssert critical
// 2. Make ImperativeAssert safe critical
// 3. Remove the assert call
new PermissionSet(PermissionState.Unrestricted).Assert();
}
}
}
Nell'esempio riportato di seguito, un'opzione consiste nel rivedere il codice del metodo SecurityTransparentMethod e se il metodo è considerato sicuro per l'elevazione, contrassegnare SecurityTransparentMethod come critico per la sicurezza. Ciò richiede che un controllo di sicurezza, senza errori, completo e dettagliato venga eseguito sul metodo insieme a qualsiasi callout che si verifica all'interno del metodo 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. Abilita i 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.