Consideraciones de seguridad: Interfaz de usuario de Windows
En este tema se proporciona información acerca de las consideraciones de seguridad relacionadas con la interfaz de usuario de Windows. Este tema no proporciona todo lo que necesita saber sobre los problemas de seguridad. Sin embargo, puede usarla como punto de partida y referencia para esta área tecnológica.
Con el aumento de la interconexión en los equipos, los desarrolladores deben preocuparse por la seguridad de las aplicaciones. Además, la seguridad también mejora la protección 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 no se comprueban las terminaciones null o la longitud de las cadenas. 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 los datos, lo que puede afectar negativamente a la aplicación. Para más información acerca de las saturaciones del búfer y otras preocupaciones sobre la seguridad, consulte Escritura de código seguro de Michael Howard y David LeBlanc, Microsoft Press, 2002.
Para gestionar las cadenas de forma segura, debe hacer lo siguiente:
- Compruebe las cadenas para ver si hay terminaciones null o si tienen la longitud adecuada, según corresponda.
- Tenga especial cuidado para determinar la longitud de una cadena o búfer, especialmente cuando contiene valores 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 StrSafe al tratar con cadenas. Estas funciones están diseñadas para gestionar las cadenas de forma segura.
Entrada del usuario
La interfaz de usuario de Windows se encarga de obtener y responder a la información de los usuarios. Sin embargo, los usuarios que escriben datos incorrectos pueden interrumpir el funcionamiento de la aplicación, independientemente de si lo hacen deliberadamente o no. Por lo tanto, la regla cardinal es que se deben validar todos los datos que introducen.
La principal preocupación son los datos de cadena, que se describen en Consideraciones sobre cadenas. Sin embargo, la aplicación debe validar todos los tipos de datos antes de usarlos. Otra preocupación procede de 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, se deben 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 la opción de usar átomos enteros globales. |
ImpersonateDdeClientWindow | Si se produce un error en la función, las solicitudes de cliente posteriores se completan 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 cualquier otro 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 completan 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 cualquier otro error, no continúe la ejecución de la solicitud de cliente. |
GetClipboardFormatName | Calcular erróneamente el tamaño adecuado del búfer lpszFormatName, especialmente cuando la aplicación se usa en versiones ANSI y Unicode, puede provocar un desbordamiento del búfer. Además, tenga en cuenta que la cadena se trunca si es más larga que el parámetro cchMaxCount, lo que puede provocar la pérdida de información. |
GetMenuString | El parámetro lpString es un búfer TCHAR y nMaxCount es la longitud de la cadena de menú en TCHAR. Cambiar el tamaño de estos parámetros incorrectamente puede es 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 provocaría una posible pérdida de datos. |
GetStringTypeA, GetStringTypeEx, GetStringTypeW | Para evitar un desbordamiento del búfer, establezca el tamaño del búfer lpCharType correctamente. |
LoadLibrary | Usar LoadLibrary incorrectamente puede poner en peligro la seguridad de la aplicación al cargar el archivo DLL incorrecto. |
LoadString | Un uso incorrecto puede ser 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 del 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 en null y sin NULL sin terminar la cadena en null, y sin notificar al autor de la llamada del error. El autor de la llamada no debe suponer que la condición de error es que no hay espacio suficiente. El primer argumento, lpString1, debe ser lo suficientemente grande como para contener lpString2 y el cierre '\0'; de lo contrario, puede producirse un desbordamiento del búfer. Los desbordamientos del 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, un desbordamiento del 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 en null y sin NULL sin terminar la cadena en null, y sin notificar al autor de la llamada del error. El autor de la llamada no debe suponer que la condición de error es que no hay espacio suficiente. El primer argumento, lpString1, debe ser lo suficientemente grande como para contener lpString2 y el cierre '\0'; de lo contrario, puede producirse un desbordamiento del búfer. Los desbordamientos del 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, un desbordamiento del 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 StringCchCopy en 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 en null y sin NULL sin terminar la cadena en null, y sin notificar al autor de la llamada del error. El autor de la llamada no debe suponer que la condición de error es que no hay espacio suficiente. Si lpString1 no es lo suficientemente grande como para contener la cadena copiada, puede producirse un desbordamiento 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. sizeof devuelve el número de bytes en lugar de caracteres, lo cual es incorrecto para la versión Unicode de esta función. Los desbordamientos del 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, un desbordamiento del 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 StringCchCopy en su lugar. |
lstrlen | lstrlen supone que lpString es una cadena terminada en null. Si no es así, esto podría provocar un desbordamiento 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 podría provocar un desbordamiento 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, StringCchVPrintf, or StringCchVPrintfEx. |
wvsprintf | No se garantiza que la cadena devuelta en lpOutput sea terminada en null. Además, evite usar el formato %s, lo que podría provocar un desbordamiento del búfer. Esto puede provocar una denegación de servicio si se produce una infracción de acceso. Además, un atacante podría insertar código ejecutable. Considere la posibilidad de usar una de las siguientes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, or StringCchVPrintfEx. |
Temas relacionados