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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de