Compartir a través de


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

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

Identificador de comprobación

CA2122

Categoría

Microsoft.Security

Cambio problemático

No

Motivo

Un miembro público o protegido tiene un Peticiones de vínculos y es llamado por un miembro que no realiza ninguna comprobación de seguridad.

Descripción de la regla

Una solicitud de vínculo sólo comprueba los permisos del llamador inmediato.Si un miembro X no realiza ninguna solicitud de seguridad de sus llamadores y llama al código protegido mediante una solicitud de vínculo, un llamador sin el permiso necesario puede utilizar X para obtener acceso al miembro protegido.

Cómo corregir infracciones

Agregue una solicitud de seguridad Datos y modelado en .NET Framework o de vínculo al miembro de modo que no proporcione más acceso no seguro al miembro protegido por solicitud de vínculo.

Cuándo suprimir advertencias

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

Ejemplo

Los ejemplos siguientes muestran una biblioteca que infringe la regla y una aplicación que muestra la debilidad de la biblioteca.La biblioteca de ejemplos proporciona dos métodos que juntos infringen la regla.Una solicitud de vínculo protege al método EnvironmentSetting de un acceso no restringido a las variables de entorno.El método DomainInformation no realiza ninguna solicitud de seguridad de 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);
      }
   }
}

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

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:

  

Vea también

Conceptos

Peticiones de vínculos

Otros recursos

Instrucciones de codificación segura

Datos y modelado en .NET Framework