Compartir a través de


CA2118: Revisar el uso de SuppressUnmanagedCodeSecurityAttribute

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

Identificador de comprobación

CA2118

Categoría

Microsoft.Security

Cambio problemático

Problemático

Motivo

Un tipo público, protegido ó miembro tiene el atributo SuppressUnmanagedCodeSecurityAttribute.

Descripción de la regla

SuppressUnmanagedCodeSecurityAttribute cambia el comportamiento del sistema de seguridad predeterminado por miembros que ejecutan código no administrado utilizando la interoperabilidad COM o la invocación de plataforma.Generalmente, el sistema realiza Datos y modelado en .NET Framework para el permiso del código no administrado.Esta solicitud se produce en tiempo de ejecución para cada invocación del miembro y comprueba los permisos de cada llamador de la pila de llamadas.Cuando el atributo está presente, el sistema realiza un Peticiones de vínculos para el permiso: los permisos del llamador inmediato se comprueban cuando el llamador está compilado como JIT.

Este atributo se utiliza principalmente para aumentar el rendimiento; sin embargo, las mejoras de rendimiento suponen riesgos de seguridad importantes.Si coloca el atributo en los miembros públicos que llaman a los métodos nativos, los llamadores de la pila de llamadas (que no sean inmediatos) no necesitan permiso del código no administrado para ejecutarlo.Dependiendo de las acciones del miembro público y el control de entrada, podría permitir a los llamadores poco fiables tener acceso a la funcionalidad restringida al código de confianza de forma normal.

.NET Framework confía en las comprobaciones de seguridad para evitar que los llamadores obtengan acceso directo al espacio de direcciones del proceso actual.Puesto que este atributo omite la seguridad habitual, el código supone una seria amenaza si se puede utilizar para leer o escribir en la memoria del proceso.Tenga en cuenta que el riesgo no está limitado a los métodos que deliberadamente proporcionan acceso a la memoria del proceso; también está presente en cualquier escenario donde el código malintencionado puede obtener acceso de cualquier forma, por ejemplo proporcionando una entrada de datos no válida, por sorpresa y mal formada.

La directiva de seguridad predeterminada no concede el permiso para el código no administrado para un ensamblado a menos que se ejecute desde un equipo local o sea un miembro de uno de los siguientes grupos:

  • Grupo de código de zona de Mi PC

  • Grupo de código de nombre seguro de Microsoft

  • Grupo de código de nombre seguro de ECMA

Cómo corregir infracciones

Revise su código cuidadosamente para garantizar que este atributo es absolutamente necesario.Si no está familiarizado con la seguridad del código administrado o no entiende las implicaciones de seguridad del uso de este atributo, quítelo del código.Si el atributo no es necesario, debe garantizar que los llamadores no pueden utilizar su código malintencionadamente.Si su código no tiene el permiso para ejecutar el código no administrado, este atributo no tiene ningún efecto y se debería quitar.

Cuándo suprimir advertencias

Para suprimir de forma segura una advertencia de esta regla, debe asegurarse de que el código no proporcione a sus llamadores acceso a las operaciones o recursos nativos que se puedan usar de forma destructiva.

Ejemplo

El ejemplo siguiente infringe la regla.

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.
      }
   }
}

En el ejemplo siguiente, el método DoWork proporciona una ruta de acceso a código públicamente accesible al método FormatHardDisk de invocación de plataforma.

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();
      }
   }
}

En el ejemplo siguiente, el método DoDangerousThing público provoca una infracción.Para corregir esta infracción, DoDangerousThing debe ser privado y se debe obtener acceso a él a través de un método público protegido por una solicitud de seguridad tal como muestra el método DoWork.

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();
      }
   }
}

Vea también

Referencia

SuppressUnmanagedCodeSecurityAttribute

Conceptos

Optimizaciones de seguridad

Peticiones de vínculos

Otros recursos

Instrucciones de codificación segura

Datos y modelado en .NET Framework