Share via


CA2122: No exponer indirectamente métodos con peticiones de vínculos

Elemento Valor
RuleId CA2122
Category Microsoft.Security
Cambio importante Poco problemático

Causa

Un miembro público o protegido tiene Link Demands y lo llama un miembro que no realiza comprobaciones de seguridad.

Nota

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

Descripción de la regla

Una solicitud de vínculo sólo comprueba los permisos del llamador inmediato. Si un miembro X no exige ninguna demanda de seguridad a los autores de las llamadas y llama al código protegido por una demanda de vínculo, un autor de llamada sin el permiso necesario puede usar X para acceder al miembro protegido.

Cómo corregir infracciones

Agregue datos y modelado de seguridad o una demanda de vínculo al miembro para que no vuelva a proporcionar acceso no seguro al miembro protegido mediante la demanda del vínculo.

Cuándo suprimir las advertencias

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

Ejemplo 1

En los ejemplos siguientes se muestra una biblioteca que infringe la regla y una aplicación que muestra la debilidad de la biblioteca. La biblioteca de ejemplo proporciona dos métodos que infringen la regla. El método EnvironmentSetting está protegido por una demanda de vínculo para el acceso sin restricciones a las variables de entorno. El DomainInformation método no realiza ninguna demanda de seguridad a sus llamadores antes de llamar a EnvironmentSetting.

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

namespace SecurityRulesLibrary
{
   public class DoNotIndirectlyExposeMethodsWithLinkDemands
   {
      // Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
      public static string DomainInformation()
      {
         return EnvironmentSetting("USERDNSDOMAIN");
      }

      // Library method with link demand.
      // This method holds its immediate callers responsible for securing the information.
      // Because a caller must have unrestricted permission, the method asserts read permission
      // in case some caller in the stack does not have this permission. 

      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
      public static string EnvironmentSetting(string environmentVariable)
      {
         EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
         envPermission.Assert();
  
         return Environment.GetEnvironmentVariable(environmentVariable);
      }
   }
}

Ejemplo 2

La siguiente aplicación llama al miembro de biblioteca no protegido.

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

// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
   SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
   class TestUnsecured
   {
      [STAThread]
      static void Main(string[] args)
      {
         string value = null;
         try 
         {
            value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
         }
         catch (SecurityException e) 
         {
            Console.WriteLine(
               "Call to unsecured member was stopped by code access security! {0}",
               e.Message);
            throw;
         }
         if (value != null) 
         {
            Console.WriteLine("Value from unsecured member: {0}", value);
         }
      }
   }
}

Este ejemplo produce el siguiente resultado:

*Value from unsecured member: seattle.corp.contoso.com

Consulte también