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 todas as informações necessárias 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 de 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 geral do aplicativo; Portanto, é mais uma forma do desenvolvedor proporcionar uma boa experiência ao usuário. Os tópicos a seguir abordam 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 a terminação nula ou comprimento das cadeias de caracteres não são verificados. Uma preocupação relacionada o cálculo incorreto do comprimento de uma cadeia de caracteres ou buffer. Em ambos os casos, isso pode causar o estouro de buffer ou truncamento de dados, o que pode afetar seu aplicativo negativamente. Para obter mais informações sobre estouros de buffer e outras questões de segurança, consulte Como Gravar Código de Segurança por Michael Howard e David Leblanc, Microsoft Press, 2002.

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

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

Além disso, considere o uso das funções StrSafe ao lidar com cadeias de caracteres. 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 se preocupa 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 um ponto, mas mudam antes de serem usados, por exemplo, ao receber mensagens que dão o comprimento do texto. Então, se houver uma chance dos dados mudarem, você deve verificá-los antes do uso

Alertas de segurança

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

Recurso Mitigação
GetAtomName Tenha cuidado ao especificar o tamanho do buffer.
GlobalGetAtomName Os átomos de cadeia de caracteres globais podem ser acessados por qualquer aplicativo. No entanto, se outro aplicativo for descuidado, ele pode manipular incorretamente 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 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 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 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 O cálculo incorreto do 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 é truncada se for maior que o parâmetro cchMaxCount, o que pode causar perda de informações.
GetMenuString O parâmetro lpString é um buffer 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, causando 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. Por exemplo, sizeof(lpBuffer) fornece o tamanho do buffer em bytes, o que pode gerar um estouro de buffer para a versão Unicode da função. As 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 tratamento de exceções estruturado (SEH) para detectar violações de acesso e outros erros. Quando essa função detecta erros SEH, ela retorna NULL sem terminar a cadeia de caracteres em nulo e sem NULL sem terminar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não deve presumir que a condição de erro é espaço insuficiente. O primeiro argumento, lpString1, deve ser grande o suficiente para reter lpString2 e o fechamento '\0', caso contrário, pode ocorrer um estouro de buffer. Os estouros de buffer podem causar um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. No pior cenário, um estouro 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 usar uma das seguintes alternativas. StringCbCat ou StringCchCat.
lstrcpy Essa função usa o tratamento de exceções estruturado (SEH) para detectar violações de acesso e outros erros. Quando essa função detecta erros SEH, ela retorna NULL sem terminar a cadeia de caracteres em nulo e sem NULL sem terminar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não deve presumir que a condição de erro é espaço insuficiente. O primeiro argumento, lpString1, deve ser grande o suficiente para reter lpString2 e o fechamento '\0', caso contrário, pode ocorrer um estouro de buffer. Os estouros de buffer podem causar um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. No pior cenário, um estouro 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 o uso de StringCchCopy.
lstrcpyn Essa função usa o tratamento de exceções estruturado (SEH) para detectar violações de acesso e outros erros. Quando essa função detecta erros SEH, ela retorna NULL sem terminar a cadeia de caracteres em nulo e sem NULL sem terminar a cadeia de caracteres em nulo e sem notificar o chamador do erro. O chamador não deve presumir que a condição de erro é espaço insuficiente. Se lpString1 não for grande o suficiente para conter a cadeia de caracteres copiada, poderá ocorrer um estouro 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. Os estouros de buffer podem causar um ataque de negação de serviço contra o aplicativo se ocorrer uma violação de acesso. No pior cenário, um estouro 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 o uso de StringCchCopy.
lstrlen lstrlen pressupõe que lpString seja uma cadeia de caracteres terminada em nulo. Se não for, isso pode causar uma saturação de buffer ou um ataque de negação de serviço contra o aplicativo. Considere usar 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 causar um estouro de buffer. Se ocorrer uma violação de acesso, ela causará uma negação de serviço contra seu aplicativo. Na pior hipótese, um invasor pode injetar código executável. Considere usar uma das seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, or StringCchVPrintfEx.
wvsprintf Não é garantido que a cadeia de caracteres retornada em lpOutput seja terminada em nulo. Além disso, evite usar o formato %s, que pode causar um estouro de buffer. Isso pode causar 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 seguintes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, or StringCchVPrintfEx.

 

Microsoft Security

Segurança e identidade

Índice explicativo sobre segurança

Microsoft Security Response Center

Práticas Recomendadas para as APIs de Segurança