Considerações de segurança: controles do Microsoft Windows

Este tópico fornece informações sobre considerações de segurança relacionadas aos controles do Windows. As informações neste tópico não fornecem tudo o que você precisa saber sobre problemas de segurança — use-as como ponto de partida e referência para essa área de tecnologia.

A interconectividade entre computadores é comum; A principal preocupação de um desenvolvedor deve ser a segurança do aplicativo. As seções a seguir discutem alguns possíveis problemas de segurança a serem considerados ao programar controles do Windows.

Mensagens de controle terminadas em nulo

Muitas mensagens de controle e macros têm parâmetros de cadeia de caracteres. Muitas vezes, essas mensagens não validam as cadeias de caracteres de entrada. Em particular, elas não verificam se há um '\0' de terminação. Quando você chama uma mensagem que usa uma cadeia de caracteres como parâmetro, especifique explicitamente que a cadeia de caracteres é terminada em nulo.

Uso de cadeia de caracteres

Quando você programa controles do Windows, é necessário manipular cadeias de caracteres. Quase todos os controles exigem que o texto seja inserido. Por exemplo, para preencher uma caixa de listagem, você deve carregar cadeias de caracteres no controle. Como o uso incorreto de cadeias de caracteres geralmente causa estouros de buffer, tome precauções para evitar esse risco de segurança.

Para obter mais informações sobre estouros de buffer, consulte Como Gravar Código de Segurança por Michael Howard e David LeBlanc, Microsoft Press, 2002 e Práticas Recomendadas para as APIs de Segurança.

Validação da entrada

As mensagens de controle a seguir podem apresentar problemas de segurança.

Se o texto for alterado entre a chamada para obter o comprimento do texto e a hora em que o texto é exibido ou usado, pode ocorrer um estouro de buffer. Para evitar isso, você deve validar a cadeia de caracteres antes de usá-la. Além disso, as mensagens que recuperam texto, CB_GETLBTEXT, TB_GETBUTTONTEXT e TTM_GETTEXT não têm nenhum parâmetro de tamanho de buffer que apresente o potencial para um estouro de buffer.

Ao usar CB_GETLBTEXT ou SB_GETTEXT, você deve primeiro chamar CB_GETLBTEXTLEN ou SB_GETTEXTLENGTH para obter o tamanho do buffer. Algumas dessas mensagens, TB_GETBUTTONTEXT, LVM_GETISEARCHSTRING e TVM_GETISEARCHSTRING podem ser chamadas com um valor de parâmetro NULL para obter o comprimento da cadeia de caracteres antes de invocar a mensagem para recuperar a cadeia de caracteres.

Uma mensagem à qual você deve prestar atenção especial é a mensagem SB_GETTIPTEXT da barra de status. Essa mensagem não fornece nenhuma maneira de consultar o comprimento da cadeia de caracteres que deve ser recuperada.

Uso de Senha

Se você usar controles de edição protegidos por senha (estilo ES_PASSWORD), o buffer que contém o texto recuperado deverá ser definido como zero o mais rápido possível para evitar a exposição da senha do usuário na memória.

Alertas de segurança

A tabela a seguir lista recursos que, se usados incorretamente, podem comprometer a segurança de seus aplicativos. As mensagens listadas aqui não fornecem um parâmetro que especifique o tamanho do buffer.

Recurso Mitigação
DlgDirListComboBox Verifique se o buffer usado pela função pode ser gravado e é terminado em nulo.
CB_GETLBTEXT Chame CB_GETLBTEXTLEN para obter o tamanho do buffer e, em seguida, chame CB_GETLBTEXT para recuperar a cadeia de caracteres.
LVM_GETISEARCHSTRING Chame a mensagem com um valor de parâmetro NULL para obter o tamanho do buffer e, em seguida, chame a mensagem uma segunda vez para recuperar a cadeia de caracteres.
SB_GETTEXT Chame SB_GETTEXTLENGTH para obter o tamanho do buffer e, em seguida, chame SB_GETTEXT para recuperar a cadeia de caracteres.
TB_GETBUTTONTEXT Chame a mensagem com um valor de parâmetro NULL para obter o tamanho do buffer e, em seguida, chame a mensagem uma segunda vez para recuperar a cadeia de caracteres.
TTM_GETTEXT Essa mensagem não fornece uma maneira de você saber ou especificar o tamanho do buffer.
TVM_GETISEARCHSTRING Chame a mensagem passando um valor de parâmetro NULL para obter o tamanho do buffer e, em seguida, chame a mensagem uma segunda vez para recuperar a cadeia de caracteres.

 

Outros recursos

Microsoft Security

Segurança

Microsoft Security Response Center

Práticas Recomendadas para as APIs de Segurança