CA2147: Los métodos transparentes no pueden usar aserciones de seguridad

Elemento Valor
RuleId CA2147
Category Microsoft.Security
Cambio importante Problemático

Causa

El código marcado como SecurityTransparentAttribute no tiene permisos suficientes para imponerse.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Esta regla analiza todos los métodos y tipos de un ensamblado que es 100% transparente o tiene una mezcla de transparente y crítico, y marca cualquier uso declarativo o imperativo de Assert.

En tiempo de ejecución, las llamadas a Assert desde código transparente harán que se produzca una excepción InvalidOperationException. Esto puede ocurrir en ambos ensamblados 100 % transparentes y también en ensamblados con una mezcla de transparente y crítico en los que un método o tipo se declara transparente, pero incluye una aserción declarativa o imperativa.

.NET Framework 2.0 presentó una característica denominada transparencia. Los métodos, campos, interfaces, clases y tipos individuales pueden ser transparentes o críticos.

No se permite que el código transparente eleve los privilegios de seguridad. Por lo tanto, los permisos concedidos o exigidos del mismo se pasan automáticamente a través del código al autor de llamada o dominio de la aplicación host. Algunos ejemplos de elevaciones son aserciones, LinkDemands, SuppressUnmanagedCode y código unsafe.

Cómo corregir infracciones

Para resolver el problema, marque el código que llama a la aserción con el atributo SecurityCriticalAttribute o quite la aserción.

Cuándo suprimir las advertencias

No suprima un mensaje de esta regla.

Ejemplo 1

Se producirá un error en este código si SecurityTestClass es transparente, cuando el método Assert produzca una excepción InvalidOperationException.

using System;
using System.Security;
using System.Security.Permissions;

namespace TransparencyWarningsDemo
{

    public class TransparentMethodsUseSecurityAssertsClass
    {
        // CA2147 violation - transparent code using a security assert declaratively.  This can be fixed by
        // any of:
        //   1. Make DeclarativeAssert critical
        //   2. Make DeclarativeAssert safe critical
        //   3. Remove the assert attribute
        [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
        public void DeclarativeAssert()
        {
        }

        public void ImperativeAssert()
        {
            // CA2147 violation - transparent code using a security assert imperatively.  This can be fixed by
            // any of:
            //   1. Make ImperativeAssert critical
            //   2. Make ImperativeAssert safe critical
            //   3. Remove the assert call
            new PermissionSet(PermissionState.Unrestricted).Assert();
        }
    }
}

Ejemplo 2

Una opción consiste en revisar el código del método SecurityTransparentMethod en el ejemplo siguiente y, si el método se considera seguro para la elevación, marque SecurityTransparentMethod con crítico para la seguridad. Esto requiere que se realice una auditoría de seguridad detallada, completa y sin errores en el método junto con las llamadas que se produzcan dentro del método en la aserción:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        void SecurityCriticalMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Otra opción es quitar la aserción del código y permitir que las peticiones de permiso de E/S de archivos posteriores fluyan más allá de SecurityTransparentMethod al autor de llamada. Esto habilita las comprobaciones de seguridad. En este caso, no se necesita ninguna auditoría de seguridad, ya que las peticiones de permiso fluirán al autor de llamada o al dominio de aplicación. Las peticiones de permiso se controlan estrechamente a través de la directiva de seguridad, el entorno de hospedaje y las concesiones de permisos de código fuente.

Consulte también

Advertencias de seguridad