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
- Uso de Cadeia de Caracteres
- Validação da entrada
- Uso de Senha
- Alertas de Segurança
- Tópicos relacionados
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.
- CB_GETLBTEXT
- LVM_GETISEARCHSTRING
- SB_GETTEXT
- SB_GETTIPTEXT
- TB_GETBUTTONTEXT
- TTM_GETTEXT
- TVM_GETISEARCHSTRING
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. |
Tópicos relacionados
-
Outros recursos