Novos recursos de segurança no Visual Studio 2005

Visual Studio 2005

Por Brian Johnson

Resumo: o Visual Studio 2005 torna mais fácil para os desenvolvedores escreverem aplicativos seguros. Escreva código não gerenciado seguro ou obtenha ferramentas IDE que ajudem a criar e implantar aplicativos gerenciados que se beneficiam da Segurança de Acesso a Código. (11 páginas impressas).

Nesta página

Introdução Introdução
Aprimoramentos de segurança no código nativo Aprimoramentos de segurança no código nativo
Aprimoramentos de segurança no código gerenciado Aprimoramentos de segurança no código gerenciado
Outros aprimoramentos de segurança Outros aprimoramentos de segurança
Conclusão Conclusão

Introdução

Os desenvolvedores desejam criar aplicativos seguros, mas a maioria deles não quer despender um tempo excessivo aprendendo sobre a proteção de seus aplicativos. Eles preferem escrever o código e os algoritmos que solucionam o problema e lançar o produto, sem precisar se preocupar com segurança. Atualmente, no entanto, não podemos meramente escrever os aplicativos e esquecê-los. É preciso compreender as implicações de segurança nas decisões que tomamos. Com isso em mente, as ferramentas que usamos para criar e lançar aplicativos podem facilitar muito o fornecimento de aplicativos seguros. Neste documento, examinarei alguns recursos do Visual Studio 2005 que podem ajudá-lo a criar aplicativos seguros e robustos. A maioria das ferramentas e dos aprimoramentos do Visual Studio 2005 exige muito pouco trabalho extra e pode ter um tremendo impacto na segurança geral de seus aplicativos.

Aprimoramentos de segurança no código nativo

O Visual C++ é o único compilador do Visual Studio que oferece a opção de direcionar um processador diretamente (isto é, criar DLLs e executáveis nativos e não gerenciados).

Nesta seção, abordaremos os aprimoramentos de segurança no código nativo, tendo em mente que esse material se aplica ao Visual C++, salvo especificação em contrário.

A grande maioria dos problemas de segurança encontrados no código nativo está na categoria de saturação do buffer. As saturações do buffer ocorrem quando os dados que excedem o tamanho de um buffer são direcionados para uma parte da memória na qual o código pode ser executado. Isso torna-se um problema quando um invasor esperto descobre exatamente até que ponto ele precisa saturar o buffer para colocar uma instrução em uma parte da memória na qual possa seqüestrar a execução do programa.

Levando em consideração essa definição simplificada de saturação do buffer, quatro recursos do Visual Studio 2005 serão apresentados por terem sido criados para ajudar a identificar vulnerabilidades potenciais no código e impedir um invasor de se beneficiar de vulnerabilidades, caso alguma ocorra.

Code Analysis /analyze

Code Analysis é um recurso do Visual Studio 2005 Team Edition for Software Developers. Esse recurso teve origem de um utilitário, que antes era utilizado internamente na Microsoft, denominado PREfast. Ele foi lançado publicamente com o DDK (Device Driver Kit) da Microsoft. O recurso de análise de código funciona verificando o código-fonte em C e C++, percorrendo todos os caminhos possíveis de execução em cada função e simulando a execução para avaliar os problemas de cada caminho. A análise não executa o código e pode não encontrar todos os erros possíveis, mas pode encontrar erros que o compilador talvez ignore. A análise de código encontra problemas em áreas como tipos de dados e conversões, desempenho, segurança, expressões, loops, alocação de memória, seqüências de caracteres de formatação, valores de retorno e tratamento de exceções.

Com o Code Analysis habilitado no Visual Studio 2005 Enterprise Edition, os erros detectados são mostrados na janela Error List. É possível habilitar a análise de código usando a opção /analyze ou definindo a opção Enable code analysis for C/C++ como Yes(/analyze) na seção General do Code Analysis Node da caixa de diálogo Property Pages, como mostrado na Figura 1.


Figura 1. As regras de segurança disponíveis pelo Code Analysis

Application Verifier

O Application Verifier foi lançado originalmente como parte do Application Compatibility Toolkit. O AppVerifier é um conjunto de testes de análise em tempo de execução que ajuda a detectar erros de execução em programas. Os erros detectados pelo Application Verifier referem-se principalmente a questões de segurança, estabilidade e compatibilidade de aplicativos e estão em uma destas três categorias: verificação de identificadores, verificação de bloqueios e verificação de heap. As configurações do AppVerifier estão no nó do Application Verifier, na caixa de diálogo Property Pages.

Para iniciar o Application Verifier, no menu Debug, clique em Start with Application Verifier. O Application Verifier usa interrupções para fornecer informações quando são encontrados erros nas diferentes camadas de verificação. Os desenvolvedores podem configurar o Application Verifier para executar ações específicas quando uma interrupção ocorre. Essas ações incluem interrupção e registro em log dos erros. A Figura 2 mostra as configurações do Application Verifier na caixa de diálogo Property Pages.


Figura 2. Opções de interrupção com o Application Verifier

Buffer Security Check /GS

A opção de compilador (/GS) Buffer Security Check do Visual C++ foi projetada para ajudar a impedir que um código mal-intencionado tire proveito de saturações do buffer em aplicativos. As saturações do buffer são responsáveis por um grande número de vulnerabilidades no código. A opção /GS funciona definindo um valor criptografado (algumas vezes chamado de delator) no final de um buffer. Esse valor é verificado durante a execução do código e, se tiver sido alterado, a execução do programa é suspensa e uma exceção de segurança é gerada.

A opção /GS não impede a saturação do buffer, mas protege contra o possível seqüestro do código, interrompendo a execução do programa.

Bibliotecas CRT seguras

As bibliotecas CRT seguras são uma revisão das bibliotecas C e C++ padrão. Elas foram projetadas para aumentar a segurança de aplicativos compilados com o Visual C++, pela adição de verificações apropriadas do buffer a funções reconhecidamente vulneráveis a ataques e que tornem vulnerável a função em tempo de execução.

Essas alterações afetam todas as principais bibliotecas de programação, o que inclui a CRT (C Runtime Library), a SCL (Standard C++ Library), a MFC (Microsoft Foundation Classes) e a ATL (Active Template Library). Como parte dessa revisão, a MFC e a ATL foram recriadas para usar as funções da Safe C Library e, assim, a recompilação de aplicativos MFC e ATL com o Visual C++ 2005 oferecerá automaticamente algumas das vantagens das bibliotecas CRT seguras.

Para obter informações sobre as bibliotecas CRT seguras, consulte o artigo da MSDN Magazine, Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries (em inglês), de Martyn Lovell (gerente de desenvolvimento do Microsoft Visual C++).

Aprimoramentos de segurança no código gerenciado

O código gerenciado traz um conjunto um pouco diferente de preocupações com segurança, mas devido à forma de manipulação da memória no CLR (Common Language Runtime), as tradicionais saturações do buffer são a parte menor do problema. Nesta seção, examinarei alguns dos recursos de segurança do Visual Studio 2005 mais importantes para os desenvolvedores que estão escrevendo aplicativos gerenciados.

FxCop

Durante anos, os desenvolvedores usaram a ferramenta autônoma FxCop para verificar os assemblies quanto à conformidade com as diretrizes de design do .NET Framework. Essa ferramenta agora está incorporada ao Visual Studio 2005.

A ferramenta FxCop executa sua verificação ao analisar o fluxo da instrução MSIL e o gráfico de chamada quanto a violações às regras especificadas pelo usuário, normalmente em conformidade com as diretrizes de design do .NET Framework. Essas diretrizes contêm regras de segurança, regras de design de bibliotecas e regras para globalização, interoperabilidade, capacidade de manutenção, nomenclatura, desempenho, confiabilidade, utilização e outras.

No Visual Studio 2005, é possível acessar a funcionalidade da ferramenta FxCop na guia Code Analysis, na página Project Properties do aplicativo gerenciado. A Figura 3 mostra algumas das regras de segurança que podem ser examinadas como parte da análise.


Figura 3. Acesso às regras de Code Analysis no Visual Studio 2005.

Habilite o Code Analysis marcando a caixa Enable Code Analysis na página de propriedades de análise de código do projeto gerenciado. Isso gerará avisos adicionais na janela Error List do Visual Studio 2005. É possível reduzir o número de itens da lista optando por analisar apenas os conjuntos de regras de seu interesse, por exemplo, Security Rules (Regras de Segurança) e Reliability Rules (Regras de Confiabilidade).

Segurança de acesso a código/privilégio mínimo

Os aplicativos do .NET Framework são executados sob um modelo de segurança denominado Segurança de acesso a código. Esse é um modelo com base em evidências, no qual o privilégio de segurança é concedido com base em fatores como a localização e a assinatura do assembly. Esses fatores são comparados com uma diretiva definida no nível de usuário, máquina ou domínio. As diretivas associadas a esses diferentes fatores permitem que os aplicativos sejam executados com permissões muito específicas. Esse conceito é descrito como confiança parcial.

Uma das dificuldades de implantar aplicativos de confiança parcial está nos testes dos aplicativos enquanto eles estão sendo desenvolvidos. Geralmente, o desenvolvedor teria permissão total para executar um aplicativo que estivesse criando, mas, para ver como o aplicativo se comportaria em uma intranet ou na Internet, precisaria movê-lo para esses locais a fim de testá-lo nessas condições. Nesse aspecto, o Visual Studio 2005 ajuda, fornecendo uma série de ferramentas e recursos que os desenvolvedores podem usar para testar e depurar seus aplicativos a partir do IDE, para ter certeza de que, quando implantados, eles funcionarão adequadamente sob o nível de confiança concedido a eles pela diretiva.

Implantação do ClickOnce

O ClickOnce é uma tecnologia incorporada ao Visual Studio 2005 que facilita aos desenvolvedores criarem aplicativos que serão implantados para usuários que executarão esses aplicativos em contas com permissões limitadas. Esses aplicativos podem ser executados localmente ou a partir de um compartilhamento de intranet, ou ainda de um link http em uma página da Web. Os aplicativos executados a partir de locais de rede são armazenados em cache e executados localmente, mas fazem isso com as permissões concedidas apenas para o local em que residem de fato. Quando o desenvolvedor implanta em um local de rede uma nova versão de um aplicativo, primeiramente o local é verificado quando o usuário inicia o aplicativo e o cache é atualizado.

O Visual Studio 2005 possibilita que os desenvolvedores testem a execução desses aplicativos de confiança parcial a partir de um IDE. Isso pode poupar muito tempo e esforço na criação e na implantação de aplicativos com CAS.

Debug in Zone

Para se beneficiar do ClickOnce, é importante que os desenvolvedores possam testar facilmente seus aplicativos com o mesmo conjunto de permissões que será concedido ao aplicativo após a implantação. O recurso Debug in Zone permite que os desenvolvedores especifiquem o grau de confiança de que o aplicativo necessitará durante o design e a depuração, possibilitando testá-lo quando implantado em um local de rede com vários níveis de confiança. Essa funcionalidade é acessada pela guia Security nas páginas Project Properties de um aplicativo gerenciado.

Para usar esse recurso, abra a guia Security do projeto e especifique que esse é um aplicativo de confiança parcial. A partir desse ponto, você pode escolher a zona sob a qual deseja instalar o aplicativo e especificar quais serão as permissões exigidas pelo aplicativo quando ele for implantado. Veja essas configurações na Figura 4.


Figura 4. Especifique as permissões de segurança para seu aplicativo na guia Security do projeto.

Exceções de segurança aperfeiçoadas durante a depuração

Assim que você tiver definido sua zona, a execução do aplicativo gerará exceções de segurança para essa zona enquanto o aplicativo for executado. A nova caixa de diálogo de exceções de segurança mostrada na Figura 5 dá uma idéia do que se pode esperar quando exceções de segurança forem geradas durante a depuração dos aplicativos.


Figura 5. Exceções de segurança no Visual Studio 2005

A janela Security Exception faz muito mais do que apenas apresentar uma notificação. Ela lista conselhos e etapas que você pode seguir para alterar o aplicativo e fazer com que ele funcione em um cenário de confiança parcial. Por exemplo, FileIOPermission não é permitida na zona em que o programa da Figura 4 estava sendo executado. Uma das sugestões para solucionar esse problema é usar o armazenamento isolado para esse aplicativo.

IntelliSense in Zone (recurso do Visual Basic)

IntelliSense in Zone é um recurso de segurança específico do Visual Basic. A segurança na zona reduz as opções oferecidas pelo IntelliSense apenas às APIs permitidas para uma zona específica. As funções não disponíveis na zona atual são exibidas em cinza. Isso ajuda os desenvolvedores a criar aplicativos de confiança parcial para selecionar apenas as APIs que são reconhecidamente admissíveis por uma zona específica.

PermCalc

PermCalc é um aplicativo autônomo utilizado pelos desenvolvedores do .NET para analisar as permissões necessárias para executar com êxito um aplicativo gerenciado. Agora, essa funcionalidade foi adicionada ao Visual Studio 2005, e basta um clique para acessá-la na guia Security da janela Project Properties de um aplicativo gerenciado.

Para usar o PermCalc no IDE, defina a zona de instalação de seu aplicativo e clique no botão Calculate Permissions. Se o seu aplicativo exigir mais permissões do que as disponíveis para a zona, você verá a palavra "Include" na coluna Settings da tabela de permissões da página, como mostrado na Figura 6. Esses itens serão marcados com um símbolo de cuidado para indicar que, por padrão, a permissão exigida não está disponível na zona selecionada. Se o utilitário PermCalc determinar que o aplicativo requer confiança total para ser executado corretamente, você verá uma caixa de mensagem informando o fato.


Figura 6. O botão Calculate Permissions determina quais as permissões necessárias para um aplicativo ser executado corretamente.

Outros aprimoramentos de segurança

No Visual Studio 2005, há uma série de aprimoramentos de segurança úteis para projetos tanto nativos quanto gerenciados. A seguir, examinaremos o desenvolvimento com o privilégio mínimo e os testes em relação à segurança.

Desenvolver e depurar como privilégio mínimo

Uma das formas que os usuários de computadores usam para impedir que programas mal-intencionados afetem seus sistemas é reduzir o nível de privilégios sob os quais os programas são executados. Um programa mal-intencionado que seja executado por um usuário com privilégios administrativos tem acesso a qualquer parte da máquina. Analisando sob a perspectiva de segurança geral, a execução como administrador deve ser evitada.

Além disso, os desenvolvedores conectados como administradores não vêem os problemas que os usuários com menos privilégios vêem quando executam o aplicativo. Por exemplo, um aplicativo que grave nas pastas Arquivos de Programas ou System funcionará transparentemente para um usuário com privilégios administrativos. O acesso a essas pastas para gravação é limitado para as contas executadas como Usuário; por isso, ocorrerá falha nas tentativas de o aplicativo salvar dados nesses locais.

Nas versões anteriores do Visual Studio, era difícil criar e depurar aplicativos usando contas com privilégios reduzidos, porque o próprio Visual Studio é melhor executado sob contas com alto privilégio. Com o Visual Studio 2005, essa situação mudou. O Visual Studio 2005 é executado perfeitamente sob uma conta de Usuário, e você pode desenvolver e depurar aplicativos dessa forma, tão facilmente quanto fazia antes como Administrador ou Usuário Depurador.

Lembre-se de que, mesmo no Visual Studio 2005, você pode ter problemas com suplementos projetados para funcionar com contas de privilégio mais alto. Quando você passar por uma situação como essa, informe os fornecedores que os suplementos estão exigindo mais privilégios do que é provavelmente necessário. Na maioria dos casos, o redirecionamento das solicitações do Registro ou do armazenamento para o local adequado permitirá que o suplemento seja executado corretamente.

Recursos de teste

O teste de questões de segurança é uma parte extremamente importante da criação do aplicativo para uso em um ambiente conectado. O Visual Studio 2005 Team System apresenta uma série de ferramentas de teste que o ajudarão a produzir aplicativos mais seguros.

Testes de unidade

Um dos motivos de usar os testes de unidade é para assegurar que o valor de retorno de um método seja o esperado, considerando-se os valores passados para o método. Ao processar dados do usuário, é importante assegurar que esses dados sejam o que você espera que sejam. Isso inclui o tipo e o tamanho dos dados, dois fatores que devem ser verificados antes de processar os dados. Pode-se usar testes de unidade para enviar dados aleatórios a uma função e assegurar que o aplicativo está manuseando esses dados da forma adequada e está se comportando apropriadamente.

Além disso, a cobertura de código pode ser habilitada em seus testes de unidade. A cobertura de código ajuda a garantir que o código do aplicativo seja testado. Isso ajuda a impedir que um código pouco utilizado, como um manipulador de exceções, passe despercebido. Um código que não faça parte do fluxo normal de um aplicativo ainda pode ser vulnerável a ataques. Há numerosos casos de invasores tirando proveito de código projetado para ser executado quando o fluxo normal é interrompido.

O Visual Studio 2005 apresenta uma série de ferramentas de teste que permitem criar testes de unidade. É possível criar manualmente um teste de unidade no Visual C++, Visual C# ou Visual Basic, a partir da caixa de diálogo Add New Test, mostrada na Figura 7.


Figura 7. Criação de um novo teste de unidade a partir da caixa de diálogo Add New Test do Visual Studio 2005

Além de criar testes de unidade manualmente, é possível criar testes usando o Unit Test Wizard. Isso poderá ajudá-lo a saber como esses tipos de testes funcionam e lhe dará um ponto de partida para seus próprios testes.

Teste de carga (estresse)

O teste de carga é importante porque ajuda a depurar cenários, como possíveis ataques de negação de serviço, que possam ser lançados contra seus aplicativos Web. O modelo de teste de carga na caixa de diálogo Add New Test invoca o New Load Test Wizard mostrado na Figura 8. Além de executar o teste de carga para saber o que se pode esperar do seu aplicativo, você pode usar essa ferramenta para testar cenários anormais. Faça isso enviando um grande número de solicitações contra seu aplicativo, para ver como ele suporta a carga. Observando seu aplicativo com atenção, você pode começar a reconhecer um ataque e, se necessário, pode planejar a reação a um desses tipos de ataques.


Figura 8. Preparação de um teste de carga no Visual Studio 2005

Conclusão

Este documento fornece uma breve visão geral de alguns recursos de segurança que tornam o Visual Studio 2005 uma nova ferramenta tão importante para os desenvolvedores. Seja na criação de um pequeno utilitário ou de um grande sistema de missão crítica, a segurança das máquinas de seu cliente e dos aplicativos que você cria deve ter prioridade máxima. Com as novas ferramentas incorporadas ao Visual Studio 2005, nunca foi tão fácil criar, testar e implantar aplicativos seguros.

Brian Johnson é Gerente de programas no MSDN. Ele é responsável, no MSDN, pelo conteúdo dos Developer Centers do Visual Studio, do Visual C++, de segurança e do .NET Framework.

Mostrar: