Compartilhar via


CA2122: não expor indiretamente métodos com demandas de link

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Categoria

Microsoft.Security

Alteração Significativa

Sem Quebra

Causa

Um público ou um membro protegido têm Demandas de link e são chamados por um membro que não executa nenhum verificações de segurança.

Descrição da Regra

Uma procura de link verifica as permissões do chamador imediatamente somente.Se um membro X não faz nenhuma procura de segurança dos chamadores, e de código de chamadas protegido por uma procura 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 no .NET Framework ou vincular a procurar um membro de modo que ela não fornece acesso inseguro para o membro procura- link protegido.

Quando Suprimir Alertas

Para suprimir com segurança um aviso desta regra, você deve garantir que seu código não concede aos chamadores acesso a operações ou para recursos que podem ser usados em uma forma destrutiva.

Exemplo

Os exemplos a seguir mostram uma biblioteca que viola a regra e, um aplicativo que demonstra a fraqueza de biblioteca.A biblioteca de exemplo fornece dois métodos que violam junto a regra.O método de EnvironmentSetting é protegida por uma procura de link para acesso irrestrito a variáveis de ambiente.O método de DomainInformation não faz nenhuma procura 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 de biblioteca desprotegido.

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 de codificação segura

Dados e modelagem no .NET Framework