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.