Considérations relatives à la sécurité : Microsoft Windows Shell
Cette rubrique fournit des informations sur les considérations de sécurité relatives à Windows Shell. Ce document ne peut pas fournir toutes les informations nécessaires pour connaître les problèmes de sécurité. Utilisez-le plutôt 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, y compris 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 explique comment les résoudre dans vos applications. N’oubliez pas que la sécurité n’est pas limitée aux attaques basées sur Internet. Sur les systèmes partagés, y compris les systèmes accessibles via les services Terminal, vous devez également vous assurer que les utilisateurs ne peuvent rien faire qui pourrait nuire à d’autres personnes qui partagent le système.
- installer correctement votre application
- Shlwapi
- de saisie semi-automatique
- ShellExecute, ShellExecuteEx et les fonctions associées
- déplacement et copie de fichiers
- écriture d’extensions d’espace de noms sécurisés
- alertes de sécurité
- rubriques connexes
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.
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 appartenant à un utilisateur particulier.
Système d’exploitation Emplacement Windows XP, Windows Server 2003 et versions antérieures CSIDL_APPDATA, CSIDL_PERSONAL et d’autres. Windows Vista et versions ultérieures FOLDERID_RoamingAppData, FOLDERID_Documents et d’autres. Si vous devez installer à un emplacement autre que le dossier Program Files, vérifiez que vous définissez 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 complet et encapsulez tous les éléments qui contiennent des espaces blancs entre guillemets. Habillage des paramètres de commande entre guillemets distincts. Sinon, la chaîne peut être analysée de manière incorrecte 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"
Note
L’emplacement des dossiers d’installation standard peut varier du système au système. 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 valeurCSIDL appropriée.
Shlwapi
L’API légère Shell (Shlwapi) 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 inattendues 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, doivent être utilisées à leur place.
Shlwapi, fonction | Alternative, fonction |
---|---|
StrCat ,strNCat | StringCchCat, StringCbCat et les fonctions associées |
StrCpy , strCpyN | StringCchCopy, StringCbCopy et fonctions associées |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf et 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 chemin d’accès au fichier le plus grand possible, ainsi qu’un caractère null de fin.
Pour plus d’informations sur les autres fonctions de chaîne, consultez À propos de Strsafe.h.
Saisie semi-automatique
N’utilisez pas la fonctionnalité de saisie semi-automatique pour les mots de passe.
ShellExecute, ShellExecuteEx et fonctions associées
Il existe plusieurs fonctions Shell que vous pouvez utiliser pour lancer des applications : ShellExecute, ShellExecuteEx, WinExecet 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, fournissez 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 de l’espace blanc, habillage de 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é pour la sécurité système consiste à attribuer correctement 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 reçoivent 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, ce 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és
Les extensions d’espace de noms Shell sont un moyen puissant et flexible de présenter des données à l’utilisateur. Toutefois, ils peuvent provoquer une défaillance système s’ils ne sont pas correctement écrits. Quelques points clés à garder à l’esprit :
- Ne supposez pas que les données telles que les images sont correctement mises en forme.
- Ne supposez pas que MAX_PATH équivaut au nombre d’octets dans 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 incorrectement, compromettre la sécurité de vos applications.
Caractéristique | Atténuation |
---|---|
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, StringCchCatNou StringCchCatNEx. |
StrCatBuff | La chaîne finale n’est pas garantie d’être terminée par null. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNou StringCchCatNEx. |
strCatChainW | La chaîne finale n’est pas garantie d’être terminée par null. Utilisez l’une des alternatives suivantes à la place. StringCbCatEx, StringCbCatNEx , StringCchCatExou 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, StringCchCopyNou StringCchCopyNEx. |
strCpyN | La chaîne copiée n’est pas garantie d’être terminée par 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, la chaîne retournée n’est pas garantie d’être terminée par null. Utilisez l’une des alternatives suivantes à la place. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNou 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, StringCchCatNou StringCchCatNEx. |
wnsprintf | La chaîne copiée n’est pas garantie d’être terminée par null. Utilisez l’une des alternatives suivantes à la place. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
wvnsprintf | La chaîne copiée n’est pas garantie d’être terminée par null. Utilisez l’une des alternatives suivantes à la place. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
Rubriques connexes