Partilhar 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 esta área de tecnologia.

Com o aumento da interconectividade dos computadores, os desenvolvedores agora devem se preocupar com a segurança dos aplicativos. No entanto, a segurança também aumenta a segurança e a robustez das aplicações gerais; 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

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 para terminação nula ou para comprimento. Uma preocupação relacionada é calcular incorretamente o comprimento de uma cadeia de caracteres ou buffer. Em ambos os casos, isso pode levar ao estouro de buffer ou truncamento de dados, o que pode afetar negativamente seu aplicativo. Para obter mais informações sobre saturações de buffer e outras preocupações de segurança, consulte Writing Secure Code de Michael Howard e David Leblanc, Microsoft Press, 2002.

Para manipular cadeias de caracteres de maneira segura, você deve fazer o seguinte:

  • Verifique as cadeias de caracteres para terminação nula ou para o comprimento adequado, conforme apropriado.
  • Tome especial cuidado para determinar o comprimento de uma cadeia de caracteres ou buffer, especialmente quando ela contém valores de TCHAR.
  • Se você criar uma cadeia de caracteres ou usar uma cadeia de caracteres que foi 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 strings. Essas funções são projetadas para lidar com 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, independentemente de pretenderem ou não fazê-lo. Assim, a regra cardinal é que todas as entradas devem ser validadas.

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 seu aplicativo. Outra preocupação é quando os dados são validados em determinado momento, mas mudam antes de serem usados, por exemplo, ao receber mensagens que dão o tamanho do texto. Portanto, se houver uma chance de os dados mudarem, você deve 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.

Funcionalidade Atenuação
GetAtomName Tenha cuidado ao especificar o tamanho do buffer.
GlobalGetAtomName Os átomos de cadeia global são acessíveis a qualquer aplicação. No entanto, se outro aplicativo for descuidado, ele pode manipular incorretamente suas contagens de referência e excluí-los. Em vez disso, você deve considerar o uso de átomos inteiros globais.
ImpersonateDdeClientWindow Se a função falhar, as solicitações subsequentes do cliente serão feitas no contexto de segurança do processo de chamada. Isso pode ser um problema se o processo de chamada estiver sendo executado 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 subsequentes do cliente serão feitas no contexto de segurança do processo de chamada. Isso pode ser um problema se o processo de chamada estiver sendo executado 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 de 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 é truncada se for maior do 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 TCHARs. O dimensionamento incorreto desses parâmetros pode ser o comprimento da cadeia de caracteres do menu em caracteres. O dimensionamento incorreto desses parâmetros 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 lpCharType buffer corretamente.
LoadLibrary Usar LoadLibrary incorretamente pode comprometer a segurança do seu aplicativo carregando a DLL errada.
LoadString O uso incorreto inclui a especificação do tamanho errado no parâmetro nBufferMax. 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. Neste caso, usando sizeof(lpBuffer)/sizeof(TCHAR) dá o tamanho adequado do buffer.
lstrcat Esta função usa o tratamento estruturado de exceções (SEH) para detetar violações de acesso e outros erros. Quando esta função deteta erros SEH, ela retorna NULL sem terminar nulo a cadeia de caracteres e sem NULL sem terminar nulo a cadeia de caracteres 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 saturação de buffer. Saturações 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 saturação de buffer pode permitir que um invasor injete código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Considere o uso de uma das seguintes alternativas. StringCbCat ou StringCchCat.
lstrcpy Esta função usa o tratamento estruturado de exceções (SEH) para detetar violações de acesso e outros erros. Quando esta função deteta erros SEH, ela retorna NULL sem terminar nulo a cadeia de caracteres e sem NULL sem terminar nulo a cadeia de caracteres 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 saturação de buffer. Saturações 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 saturação de buffer pode permitir que um invasor injete código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Em vez disso, considere usar StringCchCopy.
lstrcpyn Esta função usa o tratamento estruturado de exceções (SEH) para detetar violações de acesso e outros erros. Quando esta função deteta erros SEH, ela retorna NULL sem terminar nulo a cadeia de caracteres e sem NULL sem terminar nulo a cadeia de caracteres 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, pode ocorrer uma saturação de buffer. Além disso, ao copiar uma cadeia de caracteres inteira, observe que sizeof retorna o número de bytes em vez de WCHAR, que sizeof retorna o número de bytes em vez de caracteres, o que é incorreto para a versão Unicode dessa função. Saturações 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 saturação de buffer pode permitir que um invasor injete código executável em seu processo, especialmente se lpString1 for um buffer baseado em pilha. Em vez disso, considere usar StringCchCopy.
lstrlen lstrlen assume que lpString é uma cadeia de caracteres terminada em nulo. Se não for, isso pode levar a uma saturação de buffer ou um ataque de negação de serviço contra seu aplicativo. Considere o uso de uma das seguintes alternativas. StringCbLength ou StringCchLength.
wsprintf Não é garantido que a cadeia de caracteres retornada em lpOut seja terminada em nulo. Além disso, evite o formato %s, que pode levar a uma saturação de buffer. Se ocorrer uma violação de acesso, ela causará uma negação de serviço contra seu aplicativo. No pior dos casos, um invasor pode injetar código executável. Considere o uso de uma das seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.
wvsprintf Não é garantido que a cadeia de caracteres retornada em lpOutput seja terminada em nulo. Além disso, evite o uso do formato %s, que pode levar a uma saturação 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 o uso de uma das seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.

 

de Segurança da Microsoft

Segurança e de Identidade

Security How Tos Index

do Microsoft Security Response Center

práticas recomendadas para as APIs de segurança