Considerações de segurança: Shell do Microsoft Windows
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 uma série de aspetos importantes do sistema, incluindo vários que apresentam riscos potenciais de segurança se não forem manuseados 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 se limita 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.
- instalar seu aplicativo corretamente
- Shlwapi
- de preenchimento automático
- ShellExecute, ShellExecuteEx e funções relacionadas
- Movendo e copiando arquivos
- Escrevendo 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.
Não armazene dados do usuário na pasta Arquivos de Programas.
Use a pasta de dados apropriada para dados que são comuns a todos os usuários.
Sistema Operativo Localização Windows XP, Windows Server 2003 e versões anteriores CSIDL_COMMON_APPDATA Windows Vista e posterior FOLDERID_ProgramData Use a pasta de dados do usuário apropriada para dados que pertencem a um usuário específico.
Sistema Operativo Localização Windows XP, Windows Server 2003 e versões anteriores 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, certifique-se de definir listas de controle de acesso (ACLs) corretamente para que os usuários não tenham acesso a partes inadequadas do sistema de arquivos. Todos os dados específicos de um determinado usuário devem ter uma ACL que impeça qualquer outro usuário de acessá-los.
Ao configurar associações de arquivo, certifique-se de especificar corretamente a linha de comando. Use um caminho totalmente qualificado e envolva todos os elementos que contenham espaço em branco entre aspas. Envolver parâmetros de comando entre aspas separadas. Caso contrário, a cadeia de caracteres pode ser analisada incorretamente e o aplicativo não será iniciado corretamente. Dois exemplos de linhas de comando devidamente formadas são mostrados aqui.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Observação
A localização das pastas de instalação padrão pode variar de sistema para sistema. Para obter o local de uma pasta padrão em um determinado sistema Windows Vista ou posterior, chame SHGetKnownFolderPath com o valorapropriadoKNOWNFOLDERID. No Windows XP, Windows Server 2003 ou sistemas anteriores, chame SHGetFolderLocation ou SHGetFolderPath com o valor deCSIDLapropriado.
Shlwapi
O Shell Lightweight API (Shlwapi) inclui várias funções de manipulação de cadeia de caracteres. O uso incorreto dessas funções pode levar a cadeias de caracteres inesperadamente truncadas sem nenhuma notificação do truncamento que está sendo retornado. Nos seguintes casos, as funções Shlwapi não devem ser usadas. As funções alternativas enumeradas, que apresentam menos riscos, devem ser utilizadas 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 PathRelativePathPathTo que retornam um caminho de arquivo, sempre defina o tamanho do buffer para MAX_PATH caracteres. Isso garante que o buffer seja grande o suficiente para conter o maior caminho de arquivo possível, além de um caractere nulo de encerramento.
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, WinExece 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, envolva 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. Também pode usar ficheiros encriptados. Certifique-se de que, ao mover ou copiar ficheiros, lhes seja atribuída a ACL correta e que não tenham sido desencriptados 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 versões anteriores). Não use MoveFile, que pode não definir a ACL esperada para o arquivo de destino.
Escrevendo 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 podem causar falha do sistema se não forem escritos corretamente. Alguns pontos-chave a ter em mente:
- Não assuma que dados como imagens estão formatados corretamente.
- Não assuma que MAX_PATH é 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.
Funcionalidade | Atenuação |
---|---|
ShellExecuteShellExecuteEx | Pesquisas que dependem da verificação de uma série de locais padrão para encontrar 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, pode ocorrer uma saturação de buffer. Em vez disso, use uma das seguintes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, ou StringCchCatNEx. |
StrCatBuff | Não é garantido que a cadeia de caracteres final seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, ou StringCchCatNEx. |
StrCatChainW | Não é garantido que a cadeia de caracteres final seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbCatEx, StringCbCatNEx, StringCchCatExou StringCchCatNEx. |
StrCpy | O primeiro argumento, psz1, deve ser grande o suficiente para manter psz2 e o fechamento '\0', caso contrário, pode ocorrer uma saturação de buffer. Em vez disso, use uma das seguintes alternativas. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNou StringCchCopyNEx. |
StrCpyN | Não é garantido que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup | StrDup assume que lpsz é uma cadeia de caracteres terminada em nulo. Além disso, não é garantido que a cadeia de caracteres retornada seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNou StringCchCopyNEx. |
StrNCat | O primeiro argumento, pszFront, deve ser grande o suficiente para manter pszBack e o fechamento '\0', caso contrário, pode ocorrer uma saturação de buffer. Esteja ciente 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 seguintes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, ou StringCchCatNEx. |
wnsprintf | Não é garantido que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
wvnsprintf | Não é garantido que a cadeia de caracteres copiada seja terminada em nulo. Em vez disso, use uma das seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
Tópicos relacionados
-
do Security Developer Center