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 9 | 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