Linee guida per la creazione di codice sicuro applicabili al codice non gestitoSecure Coding Guidelines for Unmanaged Code

Alcuni codici di libreria devono chiamare codice non gestito (ad esempio, le API del codice nativo, come Win32).Some library code needs to call into unmanaged code (for example, native code APIs, such as Win32). Poiché questo comporta il superamento del perimetro di sicurezza per il codice gestito, è necessaria la dovuta attenzione.Because this means going outside the security perimeter for managed code, due caution is required. Se il codice è indipendente dalla sicurezza, sia il proprio codice sia il codice da cui viene chiamato devono avere l'autorizzazione per codice non gestito (SecurityPermission con il flag UnmanagedCode specificato).If your code is security-neutral, both your code and any code that calls it must have unmanaged code permission (SecurityPermission with the UnmanagedCode flag specified).

Tuttavia, è spesso sconsigliabile fornire al chiamante autorizzazioni di questo tipo.However, it is often unreasonable for your caller to have such powerful permissions. In questi casi, il codice attendibile può essere intermediario, simile al wrapper gestito o al codice di libreria descritto in Protezione del codice wrapper.In such cases, your trusted code can be the go-between, similar to the managed wrapper or library code described in Securing Wrapper Code. Se la funzionalità di codice non gestito sottostante è totalmente sicura, può essere esposta direttamente; in caso contrario, è richiesto prima un controllo di autorizzazione appropriato (domanda).If the underlying unmanaged code functionality is totally safe, it can be directly exposed; otherwise, a suitable permission check (demand) is required first.

Quando il codice chiama codice non gestito, ma non si vuole che i chiamanti siano autorizzati ad accedere al codice non gestito, è necessario dichiarare tale diritto.When your code calls into unmanaged code but you do not want to require your callers to have permission to access unmanaged code, you must assert that right. Un'asserzione blocca il percorso stack in corrispondenza del frame.An assertion blocks the stack walk at your frame. È necessario assicurarsi di non creare un problema di sicurezza in questo processo.You must be careful that you do not create a security hole in this process. In genere, ciò significa che è necessario richiedere un'autorizzazione dei chiamanti appropriata e quindi usare il codice non gestito per eseguire solo operazioni consentite dall'autorizzazione e nient'altro.Usually, this means that you must demand a suitable permission of your callers and then use unmanaged code to perform only what that permission allows and no more. In alcuni casi (ad esempio, una funzione GET time-of-day), il codice non gestito può essere esposto direttamente ai chiamanti senza controlli di sicurezza.In some cases (for example, a get time-of-day function), unmanaged code can be directly exposed to callers without any security checks. Il codice in cui viene eseguita l'asserzione deve consentire in ogni caso la gestione della sicurezza.In any case, any code that asserts must take responsibility for security.

Poiché il codice gestito in cui viene fornito un percorso di codice all'interno del codice nativo rappresenta un obiettivo potenziale del codice dannoso, è necessaria estrema attenzione per determinare quale parte di codice non gestito può essere usata con sicurezza e come usarla.Because any managed code that provides a code path into native code is a potential target for malicious code, determining which unmanaged code can be safely used and how it must be used requires extreme care. In genere, il codice non gestito non deve essere mai esposto direttamente a chiamanti parzialmente attendibili.Generally, unmanaged code should never be directly exposed to partially trusted callers. Nella valutazione della sicurezza del codice non gestito nelle librerie che è possibile chiamare da codice parzialmente attendibile, sono necessarie due considerazioni principali:There are two primary considerations in evaluating the safety of unmanaged code use in libraries that are callable by partially trusted code:

  • FunzionalitàFunctionality. Considerare se nel codice API non gestito sia fornita una funzionalità che non consenta ai chiamanti di eseguire operazioni potenzialmente dannoseDoes the unmanaged API provide functionality that does not allow callers to perform potentially dangerous operations? La sicurezza dall'accesso di codice impiega le autorizzazioni per applicare l'accesso alle risorse; considerare quindi se l'API consente di usare file, un'interfaccia utente o il threading oppure di esporre informazioni protette.Code access security uses permissions to enforce access to resources, so consider whether the API uses files, a user interface, or threading, or whether it exposes protected information. In questo caso, dal codice gestito che funge da wrapper devono essere pretese le autorizzazioni necessarie prima di consentirne l'accesso.If it does, the managed code wrapping it must demand the necessary permissions before allowing it to be entered. Inoltre, quando non è protetta da un'autorizzazione, è necessario che l'accesso alla memoria sia limitato alla rigida indipendenza dei tipi.Additionally, while not protected by a permission, memory access must be confined to strict type safety.

  • Controllo dei caratteriParameter checking. In un attacco di tipo comune vengono passati parametri imprevisti a metodi API di codice non gestito esposto nel tentativo di determinarne il funzionamento al di fuori delle specifiche.A common attack passes unexpected parameters to exposed unmanaged code API methods in an attempt to cause them to operate out of specification. I sovraccarichi del buffer tramite indici non compresi nell'intervallo o valori di offset costituiscono un esempio comune di questo tipo di attacco, allo stesso modo di altri parametri che possono sfruttare bug nel codice sottostante.Buffer overruns using out-of-range index or offset values are one common example of this type of attack, as are any parameters that might exploit a bug in the underlying code. Di conseguenza, anche se l'API del codice non gestito è protetta dal punto di vista funzionale, implementando cioè le esigenze di autorizzazioni che si reputano necessarie, per i chiamanti parzialmente attendibili deve essere eseguito anche il controllo completo della validità dei parametri, per evitare l'esecuzione di chiamate impreviste da parte di codice dannoso tramite il livello del wrapper del codice gestito.Thus, even if the unmanaged code API is functionally safe (after necessary demands) for partially trusted callers, managed code must also check parameter validity exhaustively to ensure that no unintended calls are possible from malicious code using the managed code wrapper layer.

Uso di SuppressUnmanagedCodeSecurityAttributeUsing SuppressUnmanagedCodeSecurityAttribute

Un aspetto delle prestazioni è quello relativo all'asserzione e alla chiamata di codice non gestito.There is a performance aspect to asserting and then calling unmanaged code. Per ciascuna chiamata di questo tipo, il sistema di sicurezza esige automaticamente l'autorizzazione per codice non gestito, provocando di conseguenza un percorso stack per ciascuna occorrenza.For every such call, the security system automatically demands unmanaged code permission, resulting in a stack walk each time. Se viene eseguita l'asserzione e viene chiamato immediatamente codice non gestito, il percorso stack può essere inutile, in quanto consiste nell'asserzione e nella chiamata al codice non gestito.If you assert and immediately call unmanaged code, the stack walk can be meaningless: it consists of your assert and your unmanaged code call.

Un attributo personalizzato denominato SuppressUnmanagedCodeSecurityAttribute può essere applicato ai punti di ingresso del codice non gestito per disabilitare il normale controllo di sicurezza per cui si richiede l'oggetto SecurityPermission con l'autorizzazione UnmanagedCode specificata.A custom attribute called SuppressUnmanagedCodeSecurityAttribute can be applied to unmanaged code entry points to disable the normal security check that demands SecurityPermission with the UnmanagedCode permission specified. Prestare sempre estrema attenzione durante l'esecuzione di questa operazione, poiché determina un punto di libero accesso al codice non gestito senza alcun controllo di sicurezza in fase di esecuzione.Extreme caution must always be taken when doing this, because this action creates an open door into unmanaged code with no runtime security checks. Anche se si applica l'attributo SuppressUnmanagedCodeSecurityAttribute , con la compilazione JIT viene eseguito, seppure una sola volta, un controllo di sicurezza per garantire che il chiamante immediato disponga dell'autorizzazione per chiamare codice non gestito.It should be noted that even with SuppressUnmanagedCodeSecurityAttribute applied, there is a one-time security check that happens at just-in-time (JIT) compilation to ensure that the immediate caller has permission to call unmanaged code.

Se si usa l'attributo SuppressUnmanagedCodeSecurityAttribute, verificare i seguenti punti:If you use the SuppressUnmanagedCodeSecurityAttribute, check the following points:

  • Rendere interno il punto di ingresso del codice non gestito o, in alternativa, renderlo inaccessibile dall'esterno del codice.Make the unmanaged code entry point internal or otherwise inaccessible outside your code.

  • Ogni chiamata nel codice non gestito rappresenta una potenziale vulnerabilità nella sicurezza.Any call into unmanaged code is a potential security hole. Accertarsi che il codice non rappresenti un punto di ingresso per le chiamate indirette da parte di codice dannoso al codice non gestito e non consenta di aggirare il controllo di sicurezza.Make sure your code is not a portal for malicious code to indirectly call into unmanaged code and avoid a security check. Esigere autorizzazioni, se necessario.Demand permissions, if appropriate.

  • Usare una convenzione di denominazione per identificare in modo esplicito la creazione di un percorso pericoloso nel codice non gestito, come descritto nella sezione seguente.Use a naming convention to explicitly identify when you are creating a dangerous path into unmanaged code, as described in the section below..

Convenzione di denominazione per i metodi di codice non gestitoNaming convention for unmanaged code methods

Per denominare metodi di codice non gestito è stata stabilita una convenzione utile, di cui si consiglia l'impiego.A useful and highly recommended convention has been established for naming unmanaged code methods. I metodi di codice non gestito sono suddivisi in tre categorie: safe, nativee unsafe.All unmanaged code methods are separated into three categories: safe, native, and unsafe. Queste parole chiave possono essere usate come nomi di classi all'interno delle quali sono definiti i vari tipi di punti di ingresso del codice non gestito.These keywords can be used as class names within which the various kinds of unmanaged code entry points are defined. Nel codice sorgente, le parole chiave devono essere aggiunte al nome della classe, come in Safe.GetTimeOfDay, Native.Xyzo Unsafe.DangerousAPI.In source code, these keywords should be added to the class name, as in Safe.GetTimeOfDay, Native.Xyz, or Unsafe.DangerousAPI, for example. Ognuna delle seguenti parole chiave fornisce informazioni sulla sicurezza utili per gli sviluppatori che usano la classe relativa, come descritto nella seguente tabella.Each of these keywords provides useful security information for developers using that class, as described in the following table.

Parola chiaveKeyword Considerazioni sulla sicurezzaSecurity considerations
safesafe Sicurezza completa dalle chiamate da parte del codice, anche di quello dannoso.Completely harmless for any code, even malicious code, to call. L'uso è analogo a quello del normale codice gestito.Can be used just like other managed code. Una funzione che ottiene l'ora del giorno, ad esempio, è in genere sicura.For example, a function that gets the time of day is typically safe.
nativenative Indipendente dalla sicurezza; in altre parole, codice non gestito per cui è richiesta l'autorizzazione alla chiamata di codice non gestito.Security-neutral; that is, unmanaged code that requires unmanaged code permission to call. Viene eseguito il controllo di sicurezza, che blocca le chiamate non autorizzate.Security is checked, which stops an unauthorized caller.
unsafeunsafe Presenza di un punto di ingresso per codice non gestito pericoloso con annullamento della sicurezza.Potentially dangerous unmanaged code entry point with security suppressed. Gli sviluppatori dovranno usare la massima attenzione nell'uso di codice non gestito di questo tipo, accertandosi che siano attivi altri tipi di sicurezza per evitare vulnerabilità di sicurezza.Developers should use the greatest caution when using such unmanaged code, making sure that other protections are in place to prevent a security vulnerability. Questa parola chiave consente l'override del sistema di sicurezza.Developers must be responsible, as this keyword overrides the security system.

Vedere ancheSee Also

Linee guida per la generazione di codice sicuroSecure Coding Guidelines