Condividi tramite


CA2101: Specificare il marshalling per gli argomenti di stringa P/Invoke

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Category

Microsoft.Globalization

Breaking Change

Non sostanziale

Causa

Un membro di platform invoke consente i chiamanti parzialmente attendibili, presenta un parametro di stringa e non esegue il marshalling della stringa.

Descrizione della regola

Quando si esegue la conversione da Unicode ad ANSI, è possibile che non tutti i caratteri Unicode possano essere rappresentati in una tabella codici ANSI specifica. Tramite il mapping più appropriato si tenta di risolvere il problema sostituendo un carattere con il carattere che non può essere rappresentato. L'utilizzo di questa funzionalità può causare una potenziale vulnerabilità della sicurezza poiché non è possibile controllare il carattere scelto. Ad esempio, è possibile che tramite codice dannoso venga creata intenzionalmente una stringa Unicode contenente caratteri non trovati in una determinata tabella codici che vengono convertiti in caratteri speciali del file system come ".." o "/". Si noti inoltre che i controlli di sicurezza per caratteri speciali vengono frequentemente eseguiti prima che la stringa sia convertita in ANSI.

Il mapping più appropriato rappresenta l'impostazione predefinita per la conversione non gestita da WChar a MByte. A meno che il mapping più appropriato non venga disabilitato in modo esplicito, il codice potrebbe contenere una vulnerabilità della sicurezza causata da questo problema.

Come correggere le violazioni

Per correggere una violazione di questa regola, eseguire esplicitamente il marshalling dei dati di tipo stringa.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un metodo che viola questa regola e viene spiegato come correggere la violazione.

using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace SecurityLibrary
{
    class NativeMethods
    {
        // Violates rule: SpecifyMarshalingForPInvokeStringArguments.
        [DllImport("advapi32.dll", CharSet=CharSet.Auto)]
        internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);

        // Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
        [DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
        internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
    }
}