Partager via


Considérations relatives à la sécurité : Microsoft Windows Shell

Cette rubrique fournit des informations sur les considérations de sécurité liées à l’interpréteur de commandes Windows. Ce document ne peut pas fournir tout ce que vous avez besoin de savoir sur les problèmes de sécurité. Au lieu de cela, utilisez-le comme point de départ et référence pour ce domaine technologique spécifique.

L’interpréteur de commandes contrôle un certain nombre d’aspects importants du système, dont plusieurs qui présentent des risques de sécurité potentiels s’ils ne sont pas gérés correctement. Cette rubrique décrit certains des problèmes les plus courants et la façon de les résoudre dans vos applications. N’oubliez pas que la sécurité ne se limite pas aux exploits basés sur Internet. Sur les systèmes partagés, y compris les systèmes accessibles par le biais des services Terminal Server, vous devez également vous assurer que les utilisateurs ne peuvent pas faire quoi que ce soit qui pourrait nuire à d’autres personnes qui partagent le système.

Installation correcte de votre application

La majorité des problèmes de sécurité potentiels de Shell peuvent être atténués en installant correctement votre application.

  • Installez l’application sous le dossier Program Files.

    Système d’exploitation Emplacement
    Windows XP, Windows Server 2003 et versions antérieures CSIDL_PROGRAM_FILES
    Windows Vista et versions ultérieures FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 ou FOLDERID_ProgramFilesCommonX64. Pour plus d’informations, consultez KNOWNFOLDERID .

     

  • Ne stockez pas les données utilisateur dans le dossier Program Files.

    Utilisez le dossier de données approprié pour les données communes à tous les utilisateurs.

    Système d’exploitation Emplacement
    Windows XP, Windows Server 2003 et versions antérieures CSIDL_COMMON_APPDATA
    Windows Vista et versions ultérieures FOLDERID_ProgramData

     

    Utilisez le dossier de données utilisateur approprié pour les données qui appartiennent à un utilisateur particulier.

    Système d’exploitation Emplacement
    Windows XP, Windows Server 2003 et versions antérieures CSIDL_APPDATA, CSIDL_PERSONAL et autres.
    Windows Vista et versions ultérieures FOLDERID_RoamingAppData, FOLDERID_Documents et autres.

     

  • Si vous devez installer à un emplacement autre que le dossier Program Files, veillez à définir correctement les listes de contrôle d’accès (ACL) afin que les utilisateurs n’aient pas accès à des parties inappropriées du système de fichiers. Toutes les données spécifiques à un utilisateur particulier doivent avoir une liste de contrôle d’accès qui empêche tout autre utilisateur d’y accéder.

  • Lorsque vous configurez des associations de fichiers, veillez à spécifier correctement la ligne de commande. Utilisez un chemin d’accès complet et encapsulez tous les éléments qui contiennent des espaces blancs entre guillemets. Encapsulez les paramètres de commande entre guillemets distincts. Dans le cas contraire, la chaîne peut être analysée incorrectement et l’application ne se lancera pas correctement. Deux exemples de lignes de commande correctement formées sont présentés ici.

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

Notes

L’emplacement des dossiers d’installation standard peut varier d’un système à l’autre. Pour obtenir l’emplacement d’un dossier standard sur un système Windows Vista ou ultérieur particulier, appelez SHGetKnownFolderPath avec la valeur KNOWNFOLDERID appropriée. Dans Windows XP, Windows Server 2003 ou les systèmes antérieurs, appelez SHGetFolderLocation ou SHGetFolderPath avec la valeur CSIDL appropriée.

 

Shlwapi

L’API Shlwapi (Shell Lightweight API) inclut un certain nombre de fonctions de manipulation de chaîne. L’utilisation incorrecte de ces fonctions peut entraîner des chaînes tronquées de manière inattendue, sans notification de la troncation retournée. Dans les cas suivants, les fonctions Shlwapi ne doivent pas être utilisées. Les fonctions alternatives répertoriées, qui présentent moins de risques, devraient être utilisées à leur place.

Shlwapi, fonction Autre fonction
StrCat,StrNCat StringCchCat, StringCbCat et les fonctions associées
StrCpy, StrCpyN StringCchCopy, StringCbCopy et les fonctions associées
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf et les fonctions associées

 

Avec des fonctions telles que PathRelativePathTo qui retournent un chemin d’accès de fichier, définissez toujours la taille de la mémoire tampon sur MAX_PATH caractères. Cela garantit que la mémoire tampon est suffisamment grande pour contenir le plus grand chemin de fichier possible, ainsi qu’un caractère null de fin.

Pour plus d’informations sur les fonctions de chaîne alternatives, consultez À propos de Strsafe.h.

Autocomplétion

N’utilisez pas la fonctionnalité de saisie semi-automatique pour les mots de passe.

Vous pouvez utiliser plusieurs fonctions Shell pour lancer des applications : ShellExecute, ShellExecuteEx, WinExec et SHCreateProcessAsUserW. Veillez à fournir une définition non ambiguë de l’application à exécuter.

  • Lorsque vous fournissez le chemin d’accès du fichier exécutable, indiquez le chemin complet. Ne dépendez pas de l’interpréteur de commandes pour localiser le fichier.
  • Si vous fournissez une chaîne de ligne de commande qui contient des espaces blancs, encapsulez la chaîne entre guillemets. Sinon, l’analyseur peut interpréter un seul élément qui contient des espaces comme plusieurs éléments.

Déplacement et copie de fichiers

Une clé de la sécurité du système est l’attribution correcte des listes de contrôle d’accès. Vous pouvez également utiliser des fichiers chiffrés. Assurez-vous que lorsque vous déplacez ou copiez des fichiers, qu’ils se voient attribuer la liste de contrôle d’accès correcte et qu’ils n’ont pas été déchiffrés accidentellement. Cela inclut le déplacement de fichiers vers la Corbeille, ainsi que dans le système de fichiers. Utilisez IFileOperation (Windows Vista ou version ultérieure) ou SHFileOperation (Windows XP et versions antérieures). N’utilisez pas MoveFile, qui peut ne pas définir la liste de contrôle d’accès attendue pour le fichier de destination.

Écriture d’extensions d’espace de noms sécurisées

Les extensions d’espace de noms shell sont un moyen puissant et flexible de présenter des données à l’utilisateur. Toutefois, elles peuvent provoquer une défaillance du système si elles ne sont pas correctement écrites. Quelques points clés à garder à l’esprit :

  • Ne supposez pas que les données telles que les images sont correctement mises en forme.
  • Ne partez pas du principe que MAX_PATH équivaut au nombre d’octets d’une chaîne. Il s’agit du nombre de caractères.

Alertes de sécurité

Le tableau suivant répertorie certaines fonctionnalités qui peuvent, si elles sont utilisées de manière incorrecte, compromettre la sécurité de vos applications.

Fonctionnalité Limitation des risques
ShellExecute, ShellExecuteEx Les recherches qui dépendent de la vérification d’une série d’emplacements par défaut pour rechercher un fichier spécifique peuvent être utilisées dans une attaque d’usurpation d’identité. Utilisez un chemin complet pour vous assurer d’accéder au fichier souhaité.
StrCat Le premier argument, psz1, doit être suffisamment grand pour contenir psz2 et la fermeture « \0 », sinon un dépassement de mémoire tampon peut se produire. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatnEx, StringCchCat,StringCchCatEx, StringCchCatN ou StringCchCatNEx.
StrCatBuff Il n’est pas garanti que la chaîne finale se termine par un caractère Null. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatnEx, StringCchCat,StringCchCatEx, StringCchCatN ou StringCchCatNEx.
StrCatChainW Il n’est pas garanti que la chaîne finale se termine par un caractère Null. Utilisez l’une des alternatives suivantes à la place. StringCbCatEx, StringCbCatNEx, StringCchCatEx ou StringCchCatNEx.
Strcpy Le premier argument, psz1, doit être suffisamment grand pour contenir psz2 et la fermeture « \0 », sinon un dépassement de mémoire tampon peut se produire. Utilisez l’une des alternatives suivantes à la place. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN ou StringCchCopyNEx.
StrCpyN Il n’est pas garanti que la chaîne copiée se termine par un caractère Null. Utilisez l’une des alternatives suivantes à la place. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
StrDup StrDup suppose que lpsz est une chaîne terminée par null. En outre, il n’est pas garanti que la chaîne retournée se termine par une valeur Null. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopynEx, StringCchCopy, StringCchCopyEx, StringCchCopyN ou StringCchCopyNEx.
StrNCat Le premier argument, pszFront, doit être suffisamment grand pour contenir pszBack et la fermeture « \0 », sinon un dépassement de mémoire tampon peut se produire. N’oubliez pas que le dernier argument, cchMax, est le nombre de caractères à copier dans pszFront, pas nécessairement la taille du pszFront en octets. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatnEx, StringCchCat,StringCchCatEx, StringCchCatN ou StringCchCatNEx.
wnsprintf Il n’est pas garanti que la chaîne copiée se termine par un caractère Null. Utilisez l’une des alternatives suivantes à la place. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintff, StringCchPrintfEx, StringCchVPrintf ou StringCchVPrintfEx.
wvnsprintf Il n’est pas garanti que la chaîne copiée se termine par un caractère Null. Utilisez l’une des alternatives suivantes à la place. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintff, StringCchPrintfEx, StringCchVPrintf ou StringCchVPrintfEx.

 

Sécurité Microsoft

Centre de développement Sécurité

Microsoft Solution Accelerators

Centre de Sécurité TechNet

À propos de Strsafe.h