Compartilhar via


CA2122: Não expõem indiretamente métodos com as demandas de link

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Não separável

Causa

Um membro público ou protegido tem um Demandas de link e é chamado por um membro que não executa quaisquer verificações de segurança.

Descrição da regra

Uma demanda de link verifica as permissões do chamador imediato.Se um membro X faz com que não há demandas de segurança de seus chamadores e chamadas de código protegido por uma demanda de link, um chamador sem a permissão necessária pode usar X para acessar o membro protegido.

Como corrigir violações

Adicionar uma segurança Dados e modelagem da.NET Framework ou vincular a demanda para o membro, de modo que ele não fornece mais acesso desprotegido para o membro protegido de demanda de link.

Quando suprimir avisos

Para suprimir com segurança um aviso da regra, você deve verificar que seu código não concede seus chamadores acesso aos recursos que podem ser usados de maneira destrutiva ou operações.

Exemplo

Os exemplos a seguir mostram uma biblioteca que viola a regra e um aplicativo que demonstra a fraqueza da biblioteca.A biblioteca de amostra fornece dois métodos que juntos violam a regra.O EnvironmentSetting método é protegido por uma demanda de link para acesso irrestrito a variáveis de ambiente.O DomainInformation método não faz nenhuma demanda de segurança dos chamadores antes de chamar 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);
      }
   }
}

O seguinte aplicativo chama o membro da biblioteca não segura.

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

O exemplo produz a seguinte saída.

  

Consulte também

Conceitos

Demandas de link

Outros recursos

Diretrizes para codificação segura

Dados e modelagem da.NET Framework