Compartilhar via


Considerações de segurança: Interface do Usuário do Windows

Este tópico fornece informações sobre considerações de segurança na Interface do Usuário do Windows. Este tópico não fornece 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.

Com o aumento da interconectividade do computador, os desenvolvedores agora devem se preocupar com a segurança do aplicativo. No entanto, a segurança também aprimora a segurança geral do aplicativo e a robustez; portanto, é outra maneira que o desenvolvedor pode fornecer uma boa experiência do usuário. Os tópicos a seguir discutem algumas possíveis preocupações de segurança ao usar a Interface do Usuário do Windows.

  • Considerações sobre cadeia de caracteres
  • de Entrada do Usuário
  • alertas de segurança
  • tópicos relacionados

Considerações de cadeia de caracteres

Muitas funções, mensagens e macros usam cadeias de caracteres em seus parâmetros. No entanto, muitas vezes as cadeias de caracteres não são verificadas quanto à terminação nula ou ao comprimento. Uma preocupação relacionada é calcular mal o comprimento de uma cadeia de caracteres ou buffer. Em ambos os casos, isso pode levar a estouro de buffer ou truncamento de dados, o que pode afetar seu aplicativo negativamente. Para obter mais informações sobre sobrecargas de buffer e outras preocupações de segurança, consulte Escrevendo de Código Seguro por Michael Howard e David Leblanc, Microsoft Press, 2002.

Para lidar com cadeias de caracteres de maneira segura, faça o seguinte:

  • Verifique as cadeias de caracteres para terminação nula ou para o comprimento adequado, conforme apropriado.
  • Tome cuidado especial para determinar o comprimento de uma cadeia de caracteres ou buffer, especialmente quando ele contém valores de TCHAR.
  • Se você criar uma cadeia de caracteres ou usar uma cadeia de caracteres usada anteriormente, inicialize-a como zero ou insira um terminador nulo, conforme apropriado.

Além disso, considere usar as funções StrSafe ao lidar com cadeias de caracteres. Essas funções são projetadas para manipular cadeias de caracteres com segurança.

Entrada do usuário

A interface do usuário do Windows está preocupada em obter e responder às informações dos usuários. No entanto, os usuários que inserem dados incorretos podem interromper seu aplicativo, quer pretendam ou não fazê-lo. Portanto, a regra principal é que toda a entrada deve ser validada.

A principal preocupação são os dados de cadeia de caracteres, que são discutidos em considerações de cadeia de caracteres. No entanto, todos os tipos de entrada devem ser validados antes de serem usados pelo aplicativo. Outra preocupação é quando os dados são validados em um ponto, mas são alterados antes de serem usados, por exemplo, ao receber mensagens que dão o comprimento do texto. Portanto, se houver uma chance de os dados serem alterados, você deverá verificar os dados antes de usá-los

Alertas de segurança

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

Característica Mitigação
GetAtomName Tenha cuidado ao especificar o tamanho do buffer.
GlobalGetAtomName Os átomos de cadeia de caracteres globais são acessíveis a qualquer aplicativo. No entanto, se outro aplicativo for descuidado, ele poderá manipular mal suas contagens de referência e excluí-las. Em vez disso, você deve considerar o uso de átomos inteiros globais.
ImpersonateDdeClientWindow Se a função falhar, as solicitações de cliente subsequentes serão feitas no contexto de segurança do processo de chamada. Isso pode ser um problema se o processo de chamada estiver em execução como uma conta altamente privilegiada. Portanto, se a chamada falhar ou gerar um erro, não continue a execução da solicitação do cliente.
DdeImpersonateClient Se a função falhar, as solicitações de cliente subsequentes serão feitas no contexto de segurança do processo de chamada. Isso pode ser um problema se o processo de chamada estiver em execução como uma conta altamente privilegiada. Portanto, se a chamada falhar ou gerar um erro, não continue a execução da solicitação do cliente.
GetClipboardFormatName Calcular incorretamente o tamanho adequado do buffer lpszFormatName, especialmente quando o aplicativo é usado nas versões ANSI e Unicode, pode causar um estouro de buffer. Além disso, observe que a cadeia de caracteres será truncada se for maior que o parâmetro cchMaxCount, o que pode levar à perda de informações.
GetMenuString O parâmetro lpString é um buffer de TCHAR e nMaxCount é o comprimento da cadeia de caracteres de menu em TCHAR. Dimensionar esses parâmetros incorretamente pode ser o comprimento da cadeia de caracteres de menu em caracteres. Dimensionar esses parâmetros incorretamente pode causar truncamento da cadeia de caracteres, levando a uma possível perda de dados.
GetStringTypeA, GetStringTypeEx, GetStringTypeW Para evitar um estouro de buffer, defina o tamanho do buffer lpCharType corretamente.
LoadLibrary Usar LoadLibrary incorretamente pode comprometer a segurança do aplicativo carregando a DLL errada.
LoadString O uso incorreto inclui especificar o tamanho incorreto no parâmetro nBufferMax do. Por exemplo, sizeof(lpBuffer) fornece o tamanho do buffer em bytes, o que pode levar a um estouro de buffer para a versão Unicode da função. Situações de estouro de buffer são a causa de muitos problemas de segurança em aplicativos. Nesse caso, o uso de sizeof(lpBuffer)/sizeof(TCHAR) fornece o tamanho adequado do buffer.
lstrcat Essa função usa o SEH (tratamento de exceção estruturado) para capturar violações de acesso e outros erros. Quando essa função captura erros SEH, ela retorna NULL sem encerrar nulo a cadeia de caracteres e sem NULL sem encerrar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não é seguro para assumir que espaço insuficiente é a condição de erro. O primeiro argumento, lpString1, deve ser grande o suficiente para manter lpString2 e o fechamento '\0', caso contrário, pode ocorrer uma sobrecarga de buffer. Os excessos de buffer podem levar a um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. Na pior das hipóteses, uma sobrecarga de buffer pode permitir que um invasor insira código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Considere usar uma das alternativas a seguir. StringCbCat ouStringCchCat.
lstrcpy Essa função usa o SEH (tratamento de exceção estruturado) para capturar violações de acesso e outros erros. Quando essa função captura erros SEH, ela retorna NULL sem encerrar nulo a cadeia de caracteres e sem NULL sem encerrar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não é seguro para assumir que espaço insuficiente é a condição de erro. O primeiro argumento, lpString1, deve ser grande o suficiente para manter lpString2 e o fechamento '\0', caso contrário, pode ocorrer uma sobrecarga de buffer. Os excessos de buffer podem levar a um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. Na pior das hipóteses, uma sobrecarga de buffer pode permitir que um invasor insira código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Considere usar StringCchCopy.
lstrcpyn Essa função usa o SEH (tratamento de exceção estruturado) para capturar violações de acesso e outros erros. Quando essa função captura erros SEH, ela retorna NULL sem encerrar nulo a cadeia de caracteres e sem NULL sem encerrar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não é seguro para assumir que espaço insuficiente é a condição de erro. Se lpString1 não for grande o suficiente para conter a cadeia de caracteres copiada, poderá ocorrer uma sobrecarga de buffer. Além disso, ao copiar uma cadeia de caracteres inteira, observe que tamanho de retorna o número de bytes em vez de WCHAR, que tamanhos de retorna o número de bytes em vez de caracteres, o que está incorreto para a versão Unicode dessa função. Os excessos de buffer podem causar um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. Na pior das hipóteses, uma sobrecarga de buffer pode permitir que um invasor insira código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Considere usar StringCchCopy.
lstrlen lstrlen pressupõe que lpString é uma cadeia de caracteres terminada em nulo. Se não estiver, isso poderá levar a um estouro de buffer ou a um ataque de negação de serviço contra seu aplicativo. Considere usar uma das alternativas a seguir. StringCbLength ou StringCchLength.
wsprintf A cadeia de caracteres retornada em lpOut não tem garantia de ser terminada em nulo. Além disso, evite o formato %s, o que pode levar a uma sobrecarga de buffer. Se ocorrer uma violação de acesso, isso causará uma negação de serviço contra seu aplicativo. Em pior caso, um invasor pode injetar código executável. Considere usar uma das alternativas a seguir. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.
wvsprintf A cadeia de caracteres retornada em lpOutput não tem garantia de ser terminada em nulo. Além disso, evite o uso do formato %s, o que pode levar a uma sobrecarga de buffer. Isso pode levar a uma negação de serviço se resultar em uma violação de acesso ou um invasor pode injetar código executável. Considere usar uma das alternativas a seguir. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.

 

de Segurança da Microsoft

segurança e identidade

de índice de instruções de segurança

do Centro de Resposta de Segurança da Microsoft

práticas recomendadas para as APIs de segurança