Considerações sobre segurança: Microsoft Windows Shell

Este tópico fornece informações sobre considerações de segurança relacionadas ao Shell do Windows. Este documento não pode fornecer tudo o que você precisa saber sobre problemas de segurança. Em vez disso, use-o como ponto de partida e referência para essa área de tecnologia específica.

O Shell controla vários aspectos importantes do sistema, incluindo vários que apresentam possíveis riscos de segurança se eles não forem tratados corretamente. Este tópico descreve alguns dos problemas mais comuns e como resolvê-los em seus aplicativos. Lembre-se de que a segurança não está limitada a explorações baseadas na Internet. Em sistemas compartilhados, incluindo sistemas acessíveis por meio dos Serviços de Terminal, você também deve garantir que os usuários não possam fazer nada que possa prejudicar outras pessoas que compartilham o sistema.

Instalando seu aplicativo corretamente

A maioria dos possíveis problemas de segurança do Shell pode ser atenuada instalando corretamente seu aplicativo.

  • Instale o aplicativo na pasta Arquivos de Programas.

    Sistema operacional Local
    Windows XP, Windows Server 2003 e anterior CSIDL_PROGRAM_FILES
    Windows Vista e posterior FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 ou FOLDERID_ProgramFilesCommonX64. Consulte KNOWNFOLDERID para obter detalhes.

     

  • Não armazene dados do usuário na pasta Arquivos de Programas.

    Use a pasta de dados apropriada para dados comuns a todos os usuários.

    Sistema operacional Local
    Windows XP, Windows Server 2003 e anterior CSIDL_COMMON_APPDATA
    Windows Vista e posterior FOLDERID_ProgramData

     

    Use a pasta de dados de usuário apropriada para dados que pertencem a um usuário específico.

    Sistema operacional Local
    Windows XP, Windows Server 2003 e anterior CSIDL_APPDATA, CSIDL_PERSONAL e outros.
    Windows Vista e posterior FOLDERID_RoamingAppData, FOLDERID_Documents e outros.

     

  • Se você precisar instalar em um local diferente da pasta Arquivos de Programas, defina as ACLs (listas de controle de acesso) corretamente para que os usuários não tenham acesso a partes inadequadas do sistema de arquivos. Todos os dados específicos de um usuário específico devem ter uma ACL que impeça qualquer outro usuário de acessá-los.

  • Ao configurar associações de arquivo, especifique corretamente a linha de comando. Use um caminho totalmente qualificado e encapsule todos os elementos que contenham espaço em branco entre aspas. Encapsular parâmetros de comando em aspas separadas. Caso contrário, a cadeia de caracteres poderá ser analisada incorretamente e o aplicativo não será iniciado corretamente. Dois exemplos de linhas de comando formadas corretamente são mostrados aqui.

    "C:\Program Files\MyApp\MyApp.exe" "%1" "%2"
    C:\MyAppDir\MyApp\MyApp.exe "%1"
    

Observação

O local das pastas de instalação padrão pode variar de sistema para sistema. Para obter o local de uma pasta padrão em um sistema específico do Windows Vista ou posterior, chame SHGetKnownFolderPath com o valor KNOWNFOLDERID apropriado. No Windows XP, Windows Server 2003 ou sistemas anteriores, chame SHGetFolderLocation ou SHGetFolderPath com o valor CSIDL apropriado.

 

Shlwapi

A API Leve do Shell (Shlwapi) inclui várias funções de manipulação de cadeia de caracteres. Usar essas funções incorretamente pode levar a cadeias de caracteres truncadas inesperadamente sem notificação do truncamento que está sendo retornado. Nos casos a seguir, as funções Shlwapi não devem ser usadas. As funções alternativas listadas, que representam menos riscos, devem ser usadas em seu lugar.

Função Shlwapi Função alternativa
StrCat,StrNCat StringCchCat, StringCbCat e funções relacionadas
StrCpy, StrCpyN StringCchCopy, StringCbCopy e funções relacionadas
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf e funções relacionadas

 

Com funções como PathRelativePathTo que retornam um caminho de arquivo, sempre defina o tamanho do buffer como MAX_PATH caracteres. Isso garante que o buffer seja grande o suficiente para manter o maior caminho de arquivo possível, além de um caractere nulo de terminação.

Para obter mais informações sobre as funções de cadeia de caracteres alternativas, consulte Sobre Strsafe.h.

Preenchimento automático

Não use o recurso preenchimento automático para senhas.

Há várias funções do Shell que você pode usar para iniciar aplicativos: ShellExecute, ShellExecuteEx, WinExec e SHCreateProcessAsUserW. Certifique-se de fornecer uma definição inequívoca do aplicativo que deve ser executado.

  • Ao fornecer o caminho do arquivo executável, forneça o caminho totalmente qualificado. Não dependa do Shell para localizar o arquivo.
  • Se você fornecer uma cadeia de caracteres de linha de comando que contenha espaço em branco, encapsule a cadeia de caracteres entre aspas. Caso contrário, o analisador pode interpretar um único elemento que contém espaços como vários elementos.

Movendo e copiando arquivos

Uma chave para a segurança do sistema é atribuir corretamente ACLs. Você também pode usar arquivos criptografados. Certifique-se de que, ao mover ou copiar arquivos, eles sejam atribuídos à ACL correta e que eles não tenham sido descriptografados acidentalmente. Isso inclui mover arquivos para a Lixeira, bem como dentro do sistema de arquivos. Use IFileOperation (Windows Vista ou posterior) ou SHFileOperation (Windows XP e anterior). Não use MoveFile, que pode não definir a ACL esperada para o arquivo de destino.

Gravando extensões de namespace seguro

As extensões de namespace do Shell são uma maneira poderosa e flexível de apresentar dados ao usuário. No entanto, eles poderão causar falha no sistema se não forem gravados corretamente. Alguns pontos importantes a serem considerados:

  • Não suponha que dados como imagens sejam formatados corretamente.
  • Não suponha que MAX_PATH seja equivalente ao número de bytes em uma cadeia de caracteres. É o número de caracteres.

Alertas de segurança

A tabela a seguir lista alguns recursos que podem, se usados incorretamente, comprometer a segurança de seus aplicativos.

Recurso Atenuação
ShellExecute, ShellExecuteEx Pesquisas que dependem da verificação de uma série de locais padrão para localizar um arquivo específico podem ser usadas em um ataque de falsificação. Use um caminho totalmente qualificado para garantir que você acesse o arquivo desejado.
Strcat O primeiro argumento, psz1, deve ser grande o suficiente para manter psz2 e o fechamento '\0', caso contrário, um estouro de buffer pode ocorrer. Em vez disso, use uma das alternativas a seguir. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN ou StringCchCatNEx.
StrCatBuff Não há garantia de que a cadeia de caracteres final seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN ou StringCchCatNEx.
StrCatChainW Não há garantia de que a cadeia de caracteres final seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbCatEx, StringCbCatNEx, StringCchCatEx ou StringCchCatNEx.
Strcpy O primeiro argumento, psz1, deve ser grande o suficiente para manter psz2 e o fechamento '\0', caso contrário, um estouro de buffer pode ocorrer. Em vez disso, use uma das alternativas a seguir. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN ou StringCchCopyNEx.
StrCpyN Não há garantia de que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
Strdup StrDup pressupõe que lpsz é uma cadeia de caracteres terminada em nulo. Além disso, não há garantia de que a cadeia de caracteres retornada seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN ou StringCchCopyNEx.
Strncat O primeiro argumento, pszFront, deve ser grande o suficiente para manter pszBack e o fechamento '\0', caso contrário, um estouro de buffer pode ocorrer. Lembre-se de que o último argumento, cchMax, é o número de caracteres a serem copiados para pszFront, não necessariamente o tamanho do pszFront em bytes. Em vez disso, use uma das alternativas a seguir. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN ou StringCchCatNEx.
wnsprintf Não há garantia de que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf ou StringCchVPrintfEx.
wvnsprintf Não há garantia de que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das alternativas a seguir. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf ou StringCchVPrintfEx.

 

Microsoft Security

Centro de desenvolvedores de segurança

Microsoft Solution Accelerators

TechCenter de segurança

Informações sobre Strsafe.h