Consideraciones de seguridad: Interfaz de usuario de Windows
En este tema se proporciona información sobre las consideraciones de seguridad en la interfaz de usuario de Windows. Este tema no proporciona todo lo que necesita saber sobre los problemas de seguridad. En su lugar, úsela como punto de partida y referencia para esta área tecnológica.
Con el aumento de la interconectividad del equipo, los desarrolladores ahora deben preocuparse por la seguridad de las aplicaciones. Sin embargo, la seguridad también mejora la seguridad general de las aplicaciones y la solidez; por lo tanto, es otra manera de que el desarrollador pueda proporcionar una buena experiencia de usuario. En los temas siguientes se describen algunos posibles problemas de seguridad al usar la interfaz de usuario de Windows.
Consideraciones sobre cadenas
Muchas funciones, mensajes y macros usan cadenas en sus parámetros. Sin embargo, a menudo las cadenas no se comprueban para la terminación null o para la longitud. Una preocupación relacionada es calcular erróneamente la longitud de una cadena o un búfer. En cualquier caso, esto puede provocar un desbordamiento del búfer o un truncamiento de datos, lo que puede afectar negativamente a la aplicación. Para obtener más información sobre las saturaciones de búfer y otras cuestiones de seguridad, consulte Escritura de código seguro por Michael Howard y David Leblanc, Microsoft Press, 2002.
Para controlar las cadenas de forma segura, debe hacer lo siguiente:
- Compruebe las cadenas para la terminación null o la longitud adecuada, según corresponda.
- Tenga especial cuidado para determinar la longitud de una cadena o búfer, especialmente cuando contiene valores de TCHAR.
- Si crea una cadena o usa una cadena que se usó anteriormente, inicialícela en cero o inserte un terminador null, según corresponda.
Además, considere la posibilidad de usar las funciones de StrSafe al tratar con cadenas. Estas funciones están diseñadas para controlar cadenas de forma segura.
Entrada de usuario
La interfaz de usuario de Windows se preocupa por obtener y responder a la información de los usuarios. Sin embargo, los usuarios que escriben datos incorrectos pueden interrumpir la aplicación, independientemente de si piensan hacerlo o no. Por lo tanto, la regla cardinal es que se debe validar toda la entrada.
La principal preocupación es los datos de cadena, que se describen en Consideraciones de cadena. Sin embargo, la aplicación debe validar todos los tipos de entrada antes de usarlos. Otra preocupación es cuando los datos se validan en un punto, pero cambian antes de usarlos, por ejemplo, al recibir mensajes que proporcionan la longitud del texto. Por lo tanto, si hay alguna posibilidad de que los datos cambien, debe comprobar los datos justo antes de usarlos.
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.
Característica | Mitigación |
---|---|
GetAtomName | Tenga cuidado al especificar el tamaño del búfer. |
GlobalGetAtomName | Los átomos de cadena global son accesibles para cualquier aplicación. Sin embargo, si otra aplicación no tiene cuidado, podría desajustar sus recuentos de referencia y eliminarlos. En su lugar, debe considerar el uso de átomos enteros globales. |
impersonateDdeClientWindow | Si se produce un error en la función, las solicitudes de cliente posteriores se realizan en el contexto de seguridad del proceso de llamada. Esto puede ser un problema si el proceso de llamada se ejecuta como una cuenta con privilegios elevados. Por lo tanto, si se produce un error en la llamada o se produce un error, no continúe la ejecución de la solicitud de cliente. |
DdeImpersonateClient | Si se produce un error en la función, las solicitudes de cliente posteriores se realizan en el contexto de seguridad del proceso de llamada. Esto puede ser un problema si el proceso de llamada se ejecuta como una cuenta con privilegios elevados. Por lo tanto, si se produce un error en la llamada o se produce un error, no continúe la ejecución de la solicitud de cliente. |
GetClipboardFormatName | Calcular mal el tamaño adecuado del lpszFormatName buffer, especialmente cuando la aplicación se usa en versiones ANSI y Unicode, puede provocar un desbordamiento de búfer. Además, tenga en cuenta que la cadena se trunca si es mayor que el parámetro cchMaxCount, lo que puede provocar la pérdida de información. |
GetMenuString | El parámetro lpString es un búfer de TCHAR y nMaxCount es la longitud de la cadena de menú de TCHARs. Cambiar el tamaño de estos parámetros incorrectamente puede ser la longitud de la cadena de menú en caracteres. El ajuste de tamaño de estos parámetros incorrectamente puede provocar el truncamiento de la cadena, lo que provoca una posible pérdida de datos. |
GetStringTypeA, GetStringTypeEx, GetStringTypeW | Para evitar un desbordamiento de búfer, establezca el tamaño del lpCharType búfer correctamente. |
LoadLibrary | El uso de LoadLibrary incorrectamente puede poner en peligro la seguridad de la aplicación cargando el archivo DLL incorrecto. |
loadString | El uso incorrecto incluye especificar el tamaño incorrecto en el parámetro nBufferMax. Por ejemplo, sizeof(lpBuffer) proporciona el tamaño del búfer en bytes, lo que podría provocar un desbordamiento de búfer para la versión Unicode de la función. Las situaciones de desbordamiento del búfer son la causa de muchos problemas de seguridad en las aplicaciones. En este caso, el uso de sizeof(lpBuffer)/sizeof(TCHAR) proporciona el tamaño adecuado del búfer. |
lstrcat | Esta función usa el control de excepciones estructurado (SEH) para detectar infracciones de acceso y otros errores. Cuando esta función detecta errores de SEH, devuelve null sin terminar la cadena y sin NULL sin terminar la cadena sin que se termine con null y sin notificar al autor de la llamada del error. El autor de la llamada no es seguro suponer que el espacio insuficiente es la condición de error. El primer argumento, lpString1, debe ser lo suficientemente grande como para contener lpString2 y el cierre "\0", de lo contrario, puede producirse una saturación de búfer. Los desbordamientos de búfer pueden provocar un ataque por denegación de servicio contra la aplicación si se produce una infracción de acceso. En el peor de los casos, una saturación de búfer puede permitir que un atacante inserte código ejecutable en el proceso, especialmente si lpString1 es un búfer basado en pila. Considere la posibilidad de usar una de las siguientes alternativas. StringCbCat o StringCchCat. |
lstrcpy | Esta función usa el control de excepciones estructurado (SEH) para detectar infracciones de acceso y otros errores. Cuando esta función detecta errores de SEH, devuelve null sin terminar la cadena y sin NULL sin terminar la cadena sin que se termine con null y sin notificar al autor de la llamada del error. El autor de la llamada no es seguro suponer que el espacio insuficiente es la condición de error. El primer argumento, lpString1, debe ser lo suficientemente grande como para contener lpString2 y el cierre "\0", de lo contrario, puede producirse una saturación de búfer. Los desbordamientos de búfer pueden provocar un ataque por denegación de servicio contra la aplicación si se produce una infracción de acceso. En el peor de los casos, una saturación de búfer puede permitir que un atacante inserte código ejecutable en el proceso, especialmente si lpString1 es un búfer basado en pila. Considere la posibilidad de usarstringCchCopy deen su lugar. |
lstrcpyn | Esta función usa el control de excepciones estructurado (SEH) para detectar infracciones de acceso y otros errores. Cuando esta función detecta errores de SEH, devuelve null sin terminar la cadena y sin NULL sin terminar la cadena sin que se termine con null y sin notificar al autor de la llamada del error. El autor de la llamada no es seguro suponer que el espacio insuficiente es la condición de error. Si lpString1 no es lo suficientemente grande como para contener la cadena copiada, puede producirse una saturación del búfer. Además, al copiar una cadena completa, tenga en cuenta que sizeof devuelve el número de bytes en lugar de WCHAR, que sizeof devuelve el número de bytes en lugar de caracteres, que es incorrecto para la versión Unicode de esta función. Los desbordamientos de búfer pueden provocar un ataque de denegación de servicio contra la aplicación si se produce una infracción de acceso. En el peor de los casos, una saturación de búfer puede permitir que un atacante inserte código ejecutable en el proceso, especialmente si lpString1 es un búfer basado en pila. Considere la posibilidad de usarstringCchCopy deen su lugar. |
lstrlen | lstrlen supone que lpString es una cadena terminada en null. Si no es así, esto podría provocar una saturación del búfer o un ataque por denegación de servicio contra la aplicación. Considere la posibilidad de usar una de las siguientes alternativas. stringCbLength o StringCchLength. |
wsprintf | No se garantiza que la cadena devuelta en lpOut sea terminada en null. Además, evite el formato %s, lo que puede provocar una saturación del búfer. Si se produce una infracción de acceso, se produce una denegación de servicio en la aplicación. En el peor de los casos, un atacante puede insertar código ejecutable. Considere la posibilidad de usar una de las siguientes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfo StringCchVPrintfEx. |
wvsprintf | No se garantiza que la cadena devuelta en lpOutput esté terminada en null. Además, evite el uso del formato %s, lo que puede provocar una saturación del búfer. Esto puede provocar una denegación de servicio si se produce una infracción de acceso o un atacante puede insertar código ejecutable. Considere la posibilidad de usar una de las siguientes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfo StringCchVPrintfEx. |
Temas relacionados
-
procedimientos recomendados de para las API de seguridad