CA2118: Verificare la sintassi di SuppressUnmanagedCodeSecurityAttribute
TypeName |
ReviewSuppressUnmanagedCodeSecurityUsage |
CheckId |
CA2118 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Un membro o un tipo pubblico o protetto presenta l'attributo System.Security.SuppressUnmanagedCodeSecurityAttribute.
Descrizione della regola
L'oggetto SuppressUnmanagedCodeSecurityAttribute modifica il comportamento del sistema di sicurezza predefinito per i membri che eseguono codice non gestito mediante interoperabilità COM o chiamata al sistema operativo. In genere, il sistema esegue un Accesso ai dati e modellazione per l'autorizzazione al codice non gestito. Questa richiesta viene effettuata in fase di esecuzione per ogni chiamata al membro e verifica l'autorizzazione di ogni chiamante nello stack di chiamate. Quando l'attributo è presente, il sistema effettua una Richieste di collegamento per l'autorizzazione: le autorizzazioni del chiamante immediato vengono controllate quando il chiamante viene compilato tramite JIT.
Questo attributo viene principalmente utilizzato per aumentare le prestazioni. L'aumento delle prestazioni, tuttavia, comporta notevoli rischi in termini di sicurezza. Se si inserisce l'attributo su membri pubblici che chiamano metodi nativi, i chiamanti nello stack di chiamate diversi dal chiamante immediato non necessitano dell'autorizzazione al codice non gestito per eseguire tale codice. A seconda delle azioni del membro pubblico e della gestione dell'input, è possibile che venga consentito a chiamanti non attendibili di accedere a funzionalità normalmente limitate al codice attendibile.
.NET Framework si basa sui controlli di sicurezza per impedire ai chiamanti di ottenere l'accesso diretto allo spazio degli indirizzi del processo corrente. Poiché questo attributo ignora la sicurezza normale, il codice comporta una grave minaccia se può essere utilizzato per leggere o scrivere nella memoria del processo. Si noti che il rischio non è limitato ai metodi che forniscono intenzionalmente accesso alla memoria del processo, ma è presente in qualsiasi scenario in cui codice dannoso possa ottenere l'accesso in qualsiasi modo, ad esempio fornendo input improvviso, non corretto o non valido.
I criteri di sicurezza predefiniti non concedono l'autorizzazione al codice non gestito a un assembly, a meno che non venga eseguito dal computer locale o sia membro di uno dei gruppi riportati di seguito:
Gruppo di codice dell'area Risorse del Computer
Gruppo di codice Nome sicuro Microsoft
Gruppo di codice Nome sicuro ECMA
Come correggere le violazioni
Rivedere attentamente il codice per assicurarsi che questo attributo sia assolutamente necessario. Se non si ha familiarità con la sicurezza del codice non gestito o non si comprendono le implicazioni di sicurezza derivanti dall'utilizzo di questo attributo, rimuoverlo dal codice. Se l'attributo è necessario, è necessario assicurarsi che i chiamanti non utilizzino il codice in modo dannoso. Se il codice non ha autorizzazione a eseguire codice non gestito, questo attributo non ha effetto e deve essere rimosso.
Esclusione di avvisi
Per escludere un avviso da questa regola in modo sicuro, è necessario assicurarsi che il codice non fornisca ai chiamanti accesso a operazioni native o risorse che possano essere utilizzate in modo distruttivo.
Esempio
Nell'esempio riportato di seguito viene violato il codice.
using System.Security;
// These two classes are identical
// except for the location of the attribute.
namespace SecurityRulesLibrary
{
public class MyBadMemberClass
{
[SuppressUnmanagedCodeSecurityAttribute()]
public void DoWork()
{
FormatHardDisk();
}
void FormatHardDisk()
{
// Code that calls unmanaged code.
}
}
[SuppressUnmanagedCodeSecurityAttribute()]
public class MyBadTypeClass
{
public void DoWork()
{
FormatHardDisk();
}
void FormatHardDisk()
{
// Code that calls unmanaged code.
}
}
}
Nell'esempio riportato di seguito, il metodo DoWork fornisce un percorso del codice accessibile pubblicamente al metodo di chiamata al sistema operativo FormatHardDisk.
using System.Security;
using System.Runtime.InteropServices;
namespace SecurityRulesLibrary
{
public class SuppressIsOnPlatformInvoke
{
// The DoWork method is public and provides unsecured access
// to the platform invoke method FormatHardDisk.
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("native.dll")]
private static extern void FormatHardDisk();
public void DoWork()
{
FormatHardDisk();
}
}
// Having the attribute on the type also violates the rule.
[SuppressUnmanagedCodeSecurityAttribute()]
public class SuppressIsOnType
{
[DllImport("native.dll")]
private static extern void FormatHardDisk();
public void DoWork()
{
FormatHardDisk();
}
}
}
Nell'esempio riportato di seguito, il metodo pubblico DoDangerousThing causa una violazione. Per risolvere la violazione, DoDangerousThing deve essere reso privato e l'accesso a esso deve essere effettuato tramite un metodo pubblico protetto da una richiesta di sicurezza, come illustrato dal metodo DoWork.
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace SecurityRulesLibrary
{
[SuppressUnmanagedCodeSecurityAttribute()]
public class BadTypeWithPublicPInvokeAndSuppress
{
[DllImport("native.dll")]
public static extern void DoDangerousThing();
public void DoWork()
{
// Note that because DoDangerousThing is public, this
// security check does not resolve the violation.
// This only checks callers that go through DoWork().
SecurityPermission secPerm = new SecurityPermission(
SecurityPermissionFlag.ControlPolicy |
SecurityPermissionFlag.ControlEvidence
);
secPerm.Demand();
DoDangerousThing();
}
}
}
Vedere anche
Riferimenti
System.Security.SuppressUnmanagedCodeSecurityAttribute
Concetti
Linee guida per la generazione di codice sicuro
Ottimizzazioni della sicurezza