Consideraciones de seguridad: Microsoft Windows Shell

En este tema se proporciona información sobre las consideraciones de seguridad relacionadas con el Shell de Windows. Este documento no puede proporcionar todo lo que necesita saber sobre los problemas de seguridad; en su lugar, úselo como punto de partida y referencia para este área de tecnología específica.

Shell controla varios aspectos importantes del sistema, incluidos varios que presentan posibles riesgos de seguridad si no se controlan correctamente. En este tema se describen algunos de los problemas más comunes y cómo solucionarlos en las aplicaciones. Recuerde que la seguridad no se limita a las vulnerabilidades de seguridad basadas en Internet. En los sistemas compartidos, incluidos los sistemas a los que se puede acceder a través de Terminal Services, también debe asegurarse de que los usuarios no puedan hacer nada que pueda dañar a otros usuarios que comparten el sistema.

Instalación correcta de la aplicación

La mayoría de los posibles problemas de seguridad de Shell se pueden mitigar mediante la instalación correcta de la aplicación.

  • Instale la aplicación en la carpeta Archivos de programa.

    Sistema operativo Location
    Windows XP, Windows Server 2003 y versiones anteriores CSIDL_PROGRAM_FILES
    Windows Vista y versiones posteriores FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 o FOLDERID_ProgramFilesCommonX64. Consulte KNOWNFOLDERID para obtener información específica.

     

  • No almacene datos de usuario en la carpeta Archivos de programa.

    Use la carpeta de datos adecuada para los datos que son comunes a todos los usuarios.

    Sistema operativo Location
    Windows XP, Windows Server 2003 y versiones anteriores CSIDL_COMMON_APPDATA
    Windows Vista y versiones posteriores FOLDERID_ProgramData

     

    Use la carpeta de datos de usuario adecuada para los datos que pertenecen a un usuario determinado.

    Sistema operativo Location
    Windows XP, Windows Server 2003 y versiones anteriores CSIDL_APPDATA, CSIDL_PERSONAL y otros.
    Windows Vista y versiones posteriores FOLDERID_RoamingAppData, FOLDERID_Documents y otros.

     

  • Si debe instalar en una ubicación distinta de la carpeta Archivos de programa, asegúrese de establecer correctamente listas de control de acceso (ACL) para que los usuarios no tengan acceso a partes inapropiadas del sistema de archivos. Cualquier dato específico de un usuario determinado debe tener una ACL que impida que cualquier otro usuario acceda a él.

  • Al configurar asociaciones de archivos, asegúrese de especificar correctamente la línea de comandos. Use una ruta de acceso completa y ajuste los elementos que contienen espacios en blanco entre comillas. Ajuste los parámetros de comando entre comillas independientes. De lo contrario, la cadena podría analizarse incorrectamente y la aplicación no se iniciará correctamente. Aquí se muestran dos ejemplos de líneas de comandos formadas correctamente.

    "C:\Program Files\MyApp\MyApp.exe" "%1" "%2"
    C:\MyAppDir\MyApp\MyApp.exe "%1"
    

Nota

La ubicación de las carpetas de instalación estándar puede variar de sistema a sistema. Para obtener la ubicación de una carpeta estándar en un sistema de Windows Vista determinado o posterior, llame a SHGetKnownFolderPath con el valor KNOWNFOLDERID adecuado. En Windows XP, Windows Server 2003 o sistemas anteriores, llame a SHGetFolderLocation o SHGetFolderPath con el valor CSIDL adecuado.

 

Shlwapi

La API ligera de Shell (Shlwapi) incluye varias funciones de manipulación de cadenas. El uso incorrecto de estas funciones puede dar lugar a cadenas truncadas inesperadamente sin que se devuelva ninguna notificación del truncamiento. En los casos siguientes, no se deben usar las funciones Shlwapi. Las funciones alternativas enumeradas, que suponen menos riesgos, deben usarse en su lugar.

Función Shlwapi Función alternativa
StrCat,StrNCat StringCchCat, StringCbCat y funciones relacionadas
StrCpy, StrCpyN StringCchCopy, StringCbCopy y funciones relacionadas
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf y funciones relacionadas

 

Con funciones como PathRelativePathTo que devuelven una ruta de acceso de archivo, establezca siempre el tamaño del búfer en MAX_PATH caracteres. Esto garantiza que el búfer es lo suficientemente grande como para contener la ruta de acceso de archivo más grande posible, además de un carácter nulo de terminación.

Para obtener más información sobre las funciones de cadena alternativas, vea Acerca de Strsafe.h.

Autocompletar

No use la característica Autocompletar para contraseñas.

Hay varias funciones de Shell que puede usar para iniciar aplicaciones: ShellExecute, ShellExecuteEx, WinExec y SHCreateProcessAsUserW. Asegúrese de proporcionar una definición inequívoca de la aplicación que se va a ejecutar.

  • Al proporcionar la ruta de acceso del archivo ejecutable, proporcione la ruta de acceso completa. No dependa del Shell para buscar el archivo.
  • Si proporciona una cadena de línea de comandos que contiene espacios en blanco, ajuste la cadena entre comillas. De lo contrario, el analizador podría interpretar un único elemento que contiene espacios como varios elementos.

Mover y copiar archivos

Una clave para la seguridad del sistema es asignar correctamente ACL. También puede usar archivos cifrados. Asegúrese de que, al mover o copiar archivos, se les asigna la ACL correcta y que no se han descifrado accidentalmente. Esto incluye mover archivos a la Papelera de reciclaje, así como dentro del sistema de archivos. Usa IFileOperation (Windows Vista o posterior) o SHFileOperation (Windows XP y versiones anteriores). No use MoveFile, que podría no establecer la ACL esperada para el archivo de destino.

Escribir extensiones de espacio de nombres seguro

Las extensiones de espacio de nombres de Shell son una manera eficaz y flexible de presentar datos al usuario. Sin embargo, pueden provocar un error del sistema si no se escriben correctamente. Algunos puntos clave que se deben tener en cuenta:

  • No suponga que los datos como las imágenes tienen el formato correcto.
  • No suponga que MAX_PATH es equivalente al número de bytes de una cadena. Es el número de caracteres.

Alertas de seguridad

En la tabla siguiente se enumeran algunas características que, si se usan incorrectamente, ponen en peligro la seguridad de las aplicaciones.

Característica Mitigación
ShellExecute, ShellExecuteEx Las búsquedas que dependen de comprobar una serie de ubicaciones predeterminadas para buscar un archivo específico se pueden usar en un ataque de suplantación de identidad. Use una ruta de acceso completa para asegurarse de que tiene acceso al archivo deseado.
StrCat El primer argumento, psz1, debe ser lo suficientemente grande como para contener psz2 y el cierre '\0', de lo contrario, podría producirse una saturación del búfer. En su lugar, use una de las siguientes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN o StringCchCatNEx.
StrCatBuff No se garantiza que la cadena final termine en null. En su lugar, use una de las siguientes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN o StringCchCatNEx.
StrCatChainW No se garantiza que la cadena final termine en null. En su lugar, use una de las siguientes alternativas. StringCbCatEx, StringCbCatNEx, StringCchCatEx o StringCchCatNEx.
Strcpy El primer argumento, psz1, debe ser lo suficientemente grande como para contener psz2 y el cierre '\0', de lo contrario, podría producirse una saturación del búfer. En su lugar, use una de las siguientes alternativas. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN o StringCchCopyNEx.
StrCpyN No se garantiza que la cadena copiada esté terminada en null. En su lugar, use una de las siguientes alternativas. StringCbCopy, StringCbCopyEx, StringCbCopyn, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
StrDup StrDup supone que lpsz es una cadena terminada en null. Además, no se garantiza que la cadena devuelta esté terminada en null. En su lugar, use una de las siguientes alternativas. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN o StringCchCopyNEx.
StrNCat El primer argumento, pszFront, debe ser lo suficientemente grande como para contener pszBack y el cierre '\0', de lo contrario, podría producirse una saturación del búfer. Tenga en cuenta que el último argumento, cchMax, es el número de caracteres que se van a copiar en pszFront, no necesariamente el tamaño de pszFront en bytes. En su lugar, use una de las siguientes alternativas. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN o StringCchCatNEx.
wnsprintf No se garantiza que la cadena copiada esté terminada en null. En su lugar, use una de las siguientes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx.
wvnsprintf No se garantiza que la cadena copiada esté terminada en null. En su lugar, use una de las siguientes alternativas. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx.

 

Seguridad de Microsoft

Centro para desarrolladores de seguridad

Microsoft Solution Accelerators

TechCenter de seguridad

Acerca de Strsafe.h