Considerações Sobre Segurança do Assembly

  • Quando você cria um assembly, você pode especificar um conjunto de permissões que o assembly requer para executar.Se determinadas permissões são concedidas ou não a um assembly isso é baseado nas evidências.

Há duas formas distintas de evidências que são usadas:

  • A evidência de entrada será mesclada com a evidência coletada pelo carregador para criar um conjunto final de evidências usadas para resolução de política.Os métodos que usam essa semântica incluem Assembly.Load, Assembly.LoadFrom e Activator.CreateInstance.

  • A evidência de entrada é usada inalterada como o conjunto final de evidências usado para resolução de política.Os métodos que usam essa semântica incluem AppDomain.DefineDynamicAssembly() e Assembly.Load(byte[]).

Permissões opcionais podem ser concedidas pelo conjunto de políticas de segurança no computador onde o assembly será executado.Se você desejar que seu código manipule todas as exceções de segurança potenciais, você pode seguir um desses procedimentos:

  • Inserir uma solicitação de permissão para todas as permissões que seu código deve ter, e tratar a falha em tempo de carga que ocorre se as permissões não são concedidas.

  • Não usar uma solicitação de permissão para obter permissões que seu código pode não precisar, mas estar preparado para manipular exceções de segurança se as permissões não são concedidas.

    Observação:

    Segurança é uma área complexa, e você tem várias opções para escolher.Para obter mais informações, consulte Principais conceitos de segurança.

Em tempo de carga, as evidências do assembly são usadas como entrada para políticas de segurança.A política de segurança é estabelecida pela empresa e pelo administrador do computador bem como por configurações de políticas de usuário e determina o conjunto de permissões que é concedido a todos os códigos gerenciados quando executados.Políticas de segurança podem ser estabelecidas para o publisher do assembly (se ele tiver uma assinatura gerada por uma ferramenta de assinatura), para o site e zona (em termos do Internet Explorer) de que o assembly foi baixado, ou para o nome forte do assembly.Por exemplo, um administrador pode estabelecer políticas de segurança que permitem que todo código baixado do site e assinado por uma determinada de empresa software acesse um banco de dados em um computador, mas não concede acesso para gravar no disco do computador.

Assemblies de nome forte e ferramentas de assinatura

Você pode assinar um assembly de duas maneiras diferentes mas complementares: com um nome forte ou usando qualquer um do Arquivo Autenticando ferramenta (Signcode.exe) no .NET estrutura versão 1.0 e 1.1 ou Ferramenta de entrada (SignTool.exe) em versões posteriores do .NET estrutura. Assinar um assembly com um nome forte adiciona uma criptografia de chave pública ao arquivo que contém o manifesto do assembly.Assinatura de nome forte ajuda a verificar exclusividade de nome, a evitar falsificação de nome, e a fornecer chamadores com alguma identidade quando uma referência é resolvida.

No entanto, nenhum nível de confiança está associado com um nome forte, o que torna o Arquivo Autenticando ferramenta (Signcode.exe) e o Ferramenta de entrada (SignTool.exe) importantes.As duas ferramentas de assinatura requerem um publisher para provar sua identidade para uma autoridade de terceiros e obter um certificado.Esse certificado é então incorporado no seu arquivo e pode ser usado por um administrador para decidir se confia na autenticidade do código.

Você pode fornecer tanto um nome forte quanto uma assinatura digital criada usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) a um assembly, ou você pode usar qualquer um sozinho.As duas ferramentas de assinatura podem assinar somente um arquivo por vez; para um assembly com vários arquivos, você assina o arquivo que contém o manifesto do assembly.Um nome forte é armazenado no arquivo que contém o manifesto do assembly, mas uma assinatura criada usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) é armazenada em um slot reservado no arquivo PE contendo a manifesto do assembly.A assinatura de um assembly usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) pode ser usada (com ou sem um nome forte) quando você já tem uma hierarquia de confiança que se baseia em assinaturas geradas por Arquivo Autenticando ferramenta (Signcode.exe) ou Ferramenta de entrada (SignTool.exe), ou quando a sua diretiva usa somente a parte da chave e não verifica uma cadeia de confiança.

Observação:

Ao usar um nome forte e uma assinatura gerada por uma ferramenta de assinatura em um assembly, o nome forte deve ser atribuído primeiro.

O Common Language Runtime também executa uma verificação de hash; o manifesto do assembly contém uma lista de todos os arquivos que compõem o assembly, incluindo um hash de cada arquivo como ele existia quando o manifesto foi criado.À medida que cada arquivo é carregado, seu conteúdo passa por aplicação de hash e é comparado com o valor de hash armazenado no manifesto. Se os dois hashes não coincidirem, o conjunto falha ao carregar.

Como nomeação forte e assinatura usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) garantem integridade, você pode basear a diretiva de segurança de acesso a códigos nessas duas formas de evidência de assembly.Nomeação forte e assinatura usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) garantem a integridade através de certificados e assinaturas digitais.Todas as tecnologias mencionadas — verificação de hash, nomeação forte e assinatura usando o Arquivo Autenticando ferramenta (Signcode.exe) ou o Ferramenta de entrada (SignTool.exe) — trabalham juntas para garantir que o assembly não foi alterado de nenhuma forma.

Consulte também

Conceitos

Assemblies de Nomes Fortes

Referência

Ferramenta de entrada (SignTool.exe)

Arquivo Autenticando ferramenta (Signcode.exe)

Outros recursos

Assemblies em Common Language Runtime