Consideraciones de seguridad: Controles de Microsoft Windows
En este tema se proporciona información acerca de las consideraciones de seguridad relacionadas con los controles de Windows. La información de este tema no proporciona todo lo que necesita saber acerca de los problemas de seguridad, úselo como punto de partida y referencia para esta área tecnológica.
La interconectividad entre equipos es común; la preocupación principal de un desarrollador debe ser la seguridad de las aplicaciones. En las secciones siguientes se describen algunos posibles problemas de seguridad que se deben tener en cuenta al programar controles de Windows.
- Mensajes de control terminados en NULL
- Uso de cadenas
- Validación de entradas
- Uso de contraseñas
- alertas de seguridad
- Temas relacionados
Mensajes de control terminados en NULL
Muchos de los mensajes y macros de control tienen parámetros de cadena. Frecuentemente, estos mensajes no validan las cadenas de entrada, en particular, no comprueban si hay una terminación '\0'
. Cuando se llama a un mensaje que usa una cadena como parámetro, especifique explícitamente que la cadena está terminada en null.
Uso de cadenas
Al programar controles de Windows, es necesario manipular cadenas. Casi todos los controles requieren que se inserte texto. Por ejemplo, para rellenar un cuadro de lista, debe cargar cadenas en el control. Dado que el uso de cadenas a menudo provoca saturaciones de búfer, tome precauciones para evitar este riesgo de seguridad.
Para más información acerca de las saturaciones de búfer, consulte Escritura de código seguro por Michael Howard y David LeBlanc, Microsoft Press, 2002 y Procedimientos recomendados para las API de seguridad.
Validación de entrada
Los siguientes mensajes de control pueden presentar problemas de seguridad.
- CB_GETLBTEXT
- LVM_GETISEARCHSTRING
- SB_GETTEXT
- SB_GETTIPTEXT
- TB_GETBUTTONTEXT
- TTM_GETTEXT
- TVM_GETISEARCHSTRING
Si el texto cambia entre la llamada para obtener la longitud del texto y el tiempo en que se muestra o se usa el texto, se puede producir una saturación del búfer. Para evitar esto, debe validar la cadena antes de usarla. Además, los mensajes que recuperan texto, CB_GETLBTEXT, TB_GETBUTTONTEXT, y TTM_GETTEXT, no tienen ningún parámetro de tamaño de búfer que presente la posibilidad de que se supere un búfer.
Al usar CB_GETLBTEXT o SB_GETTEXT, primero debe llamar a CB_GETLBTEXTLEN o SB_GETTEXTLENGTH para obtener el tamaño del búfer. Algunos de estos mensajes, TB_GETBUTTONTEXT, LVM_GETISEARCHSTRINGy TVM_GETISEARCHSTRING, se pueden llamar con un valor de parámetro NULL para obtener la longitud de la cadena antes de invocar el mensaje para recuperar la cadena.
Un mensaje al que debe prestar especial atención es la barra de estado SB_GETTIPTEXT mensaje. Este mensaje no proporciona ninguna manera de consultar la longitud de la cadena que se va a recuperar.
Uso de contraseñas
Si usa controles de edición protegidos con contraseña (ES_PASSWORD estilo), el búfer que contiene el texto recuperado debe establecerse en cero lo antes posible para evitar exponer la contraseña del usuario en memoria.
Alertas de seguridad
En la tabla siguiente se enumeran las características que, si se usan incorrectamente, pueden poner en peligro la seguridad de las aplicaciones. Los mensajes enumerados aquí no proporcionan un parámetro que especifique el tamaño del búfer.
Característica | Mitigación |
---|---|
DlgDirListComboBox | Asegúrese de que el búfer usado por la función se puede escribir en y que está terminado en null. |
CB_GETLBTEXT | Llame a CB_GETLBTEXTLEN para obtener el tamaño del búfer y a continuación, llame aCB_GETLBTEXT para recuperar la cadena. |
LVM_GETISEARCHSTRING | Llame al mensaje con un valor de parámetro NULL para obtener el tamaño del búfer y a continuación, llame al mensaje una segunda vez para recuperar la cadena. |
SB_GETTEXT | Llame a SB_GETTEXTLENGTH para obtener el tamaño del búfer y a continuación, llame aSB_GETTEXT para recuperar la cadena. |
TB_GETBUTTONTEXT | Llame al mensaje con un valor de parámetro NULL para obtener el tamaño del búfer y a continuación, llame al mensaje una segunda vez para recuperar la cadena. |
TTM_GETTEXT | Este mensaje no proporciona una manera de saber o especificar el tamaño del búfer. |
TVM_GETISEARCHSTRING | Llame al mensaje pasando un valor de parámetro NULL para obtener el tamaño del búfer y a continuación, llame al mensaje una segunda vez para recuperar la cadena. |
Temas relacionados
-
Otros recursos