CA2101: Especificación de la serialización en argumentos de cadena de P/Invoke

Propiedad Value
Identificador de la regla CA2101
Título Especificación de la serialización en argumentos de cadena de P/Invoke
Categoría Globalización
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un miembro de invocación de plataforma permite autores de llamada de confianza parcial y no serializa explícitamente la cadena.

Descripción de la regla

Al convertir de Unicode a ANSI, es posible que no todos los caracteres Unicode puedan representarse en una página de códigos ANSI específica. La asignación de coincidencia óptima intenta resolver este problema sustituyendo un carácter por el carácter que no se puede representar. El uso de esta característica puede causar una posible vulnerabilidad de seguridad porque no se puede controlar el carácter elegido. Por ejemplo, el código malintencionado podría crear intencionadamente una cadena Unicode que contenga caracteres que no se encuentran en una página de códigos determinada y que se convierten en caracteres especiales del sistema de archivos, como ".." o "/". Tenga en cuenta también que las comprobaciones de seguridad para los caracteres especiales se suelen producir antes de que la cadena se convierta a ANSI.

La asignación de coincidencia óptima es el valor predeterminado para la conversión no administrada, de WChar a MByte. A menos que se deshabilite explícitamente la asignación de coincidencia óptima, el código podría contener una vulnerabilidad de seguridad aprovechable debido a este problema.

Precaución

La seguridad de acceso del código (CAS) no debe considerarse un límite de seguridad.

Cómo corregir infracciones

Para corregir una infracción de esta regla, debe serializar explícitamente los tipos de datos de cadena.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo

En el ejemplo siguiente se muestra un método que infringe esta regla y, después, se muestra cómo corregir la infracción.

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);
}
Friend Class NativeMethods
    ' Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Auto)>
    Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function

    ' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)>
    Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function
End Class