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
- Shlwapi
- Preenchimento automático
- ShellExecute, ShellExecuteEx e funções relacionadas
- Movendo e copiando arquivos
- Gravando extensões de namespace seguro
- Alertas de Segurança
- Tópicos relacionados
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.
ShellExecute, ShellExecuteEx e funções relacionadas
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. |
Tópicos relacionados