CA2118: Verificare la sintassi di SuppressUnmanagedCodeSecurityAttribute
Articolo | Valore |
---|---|
ID regola | CA2118 |
Category | Microsoft.Security |
Modifica | Interruzione |
Causa
Un tipo o un membro pubblico o protetto ha l'attributo System.Security.SuppressUnmanagedCodeSecurityAttribute .
Nota
Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.
Descrizione regola
SuppressUnmanagedCodeSecurityAttribute modifica il comportamento predefinito del sistema di sicurezza per i membri che eseguono codice non gestito usando l'interoperabilità COM o la chiamata della piattaforma. In genere, il sistema effettua un'autorizzazione data e modellazione per il codice non gestito. Questa richiesta viene eseguita in fase di esecuzione per ogni chiamata del membro e controlla ogni chiamante nello stack di chiamate per l'autorizzazione. Quando l'attributo è presente, il sistema effettua richieste di collegamento per l'autorizzazione: le autorizzazioni del chiamante immediato vengono controllate quando il chiamante è compilato con JIT.
Questo attributo viene principalmente usato 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 (diverso dal chiamante immediato) non necessitano dell'autorizzazione di codice non gestito per eseguire codice non gestito. A seconda delle azioni e della gestione degli input del membro pubblico, potrebbe consentire ai chiamanti non attendibili di accedere alle funzionalità normalmente limitate al codice attendibile.
.NET si basa sui controlli di sicurezza per impedire ai chiamanti di ottenere l'accesso diretto allo spazio indirizzi del processo corrente. Poiché questo attributo ignora la normale sicurezza, il codice rappresenta una grave minaccia se può essere usato per leggere o scrivere nella memoria del processo. Si noti che il rischio non è limitato ai metodi che forniscono intenzionalmente l'accesso alla memoria di elaborazione; è presente anche in qualsiasi scenario in cui il codice dannoso può ottenere l'accesso con qualsiasi mezzo, ad esempio fornendo input sorprendente, in formato non valido o non valido.
I criteri di sicurezza predefiniti non concedono l'autorizzazione di codice non gestito a un assembly a meno che non sia in esecuzione dal computer locale o sia membro di uno dei gruppi seguenti:
Gruppo di codici dell'area computer
Gruppo di codice con nome sicuro Di Microsoft
Gruppo di codice ECMA con nome sicuro
Come correggere le violazioni
Esaminare attentamente il codice per assicurarsi che questo attributo sia assolutamente necessario. Se non si ha familiarità con la sicurezza del codice gestito o non si conoscono le implicazioni di sicurezza dell'uso di questo attributo, rimuoverlo dal codice. Se l'attributo è obbligatorio, è necessario assicurarsi che i chiamanti non possano usare il codice in modo dannoso. Se il codice non dispone dell'autorizzazione per eseguire codice non gestito, questo attributo non ha alcun effetto e deve essere rimosso.
Quando eliminare gli avvisi
Per eliminare in modo sicuro un avviso da questa regola, è necessario assicurarsi che il codice non fornisca ai chiamanti l'accesso alle operazioni native o alle risorse che possono essere usate in modo distruttivo.
Esempio 1
Nell'esempio seguente viene violata la regola.
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.
}
}
}
Esempio 2
Nell'esempio seguente il DoWork
metodo fornisce un percorso di codice accessibile pubblicamente al metodo FormatHardDisk
di chiamata della piattaforma .
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();
}
}
}
Esempio 3
Nell'esempio seguente il metodo DoDangerousThing
pubblico causa una violazione. Per risolvere la violazione, DoDangerousThing
deve essere reso privato e l'accesso deve essere tramite un metodo pubblico protetto da una richiesta di sicurezza, come illustrato dal DoWork
metodo .
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();
}
}
}
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per