considérations relatives à la sécurité : Windows Interface utilisateur

cette rubrique fournit des informations sur les considérations relatives à la sécurité dans l’Interface utilisateur Windows. Cette rubrique ne fournit pas tout ce que vous devez 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.

Avec l’augmentation de l’interconnexion des ordinateurs, les développeurs doivent maintenant se préoccuper de la sécurité des applications. Toutefois, la sécurité améliore également la sécurité et la robustesse des applications. C’est la raison pour laquelle le développeur peut fournir une bonne expérience utilisateur. les rubriques suivantes décrivent certains problèmes de sécurité potentiels liés à l’utilisation de l’Interface utilisateur Windows.

Considérations sur les chaînes

De nombreuses fonctions, messages et macros utilisent des chaînes dans leurs paramètres. Toutefois, il est fréquent que les chaînes ne soient pas vérifiées par null ou pour la longueur. Le calcul d’une longueur d’une chaîne ou d’une mémoire tampon est un problème connexe. Dans les deux cas, cela peut entraîner un dépassement de capacité de la mémoire tampon ou une troncation des données, ce qui peut nuire à votre application. Pour plus d’informations sur les dépassements de mémoire tampon et d’autres problèmes de sécurité, consultez écriture de code sécurisé par Michael Howard et David LeBlanc, Microsoft Press, 2002.

Pour gérer les chaînes de manière sûre, vous devez effectuer les opérations suivantes :

  • Vérifiez que les chaînes sont terminées par un null ou pour la longueur appropriée.
  • Veillez à déterminer la longueur d’une chaîne ou d’une mémoire tampon, en particulier lorsqu’elle contient des valeurs TCHAR .
  • Si vous créez une chaîne ou utilisez une chaîne qui a été utilisée précédemment, initialisez-la à zéro ou insérez un terminateur null, le cas échéant.

En outre, envisagez d’utiliser les fonctions StrSafe lors de la gestion de chaînes. Ces fonctions sont conçues pour gérer les chaînes en toute sécurité.

Entrée utilisateur

l’interface utilisateur Windows s’occupe de l’obtention et de la réponse aux informations des utilisateurs. Toutefois, les utilisateurs qui entrent des données incorrectes peuvent perturber votre application, qu’elles envisagent ou non de le faire. Ainsi, la règle de cardinalité est que toutes les entrées doivent être validées.

La préoccupation principale est la chaîne de données, qui est décrite dans considérations sur les chaînes. Toutefois, tous les types d’entrée doivent être validés avant d’être utilisés par votre application. Un autre problème est lié au moment où les données sont validées à un point mais qu’elles sont modifiées avant d’être utilisées, par exemple lors de la réception de messages qui donnent la longueur du texte. Par conséquent, si les données sont susceptibles de changer, vous devez vérifier les données juste avant de les utiliser.

Alertes de sécurité

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

Fonctionnalité Limitation des risques
GetAtomName Soyez prudent lorsque vous spécifiez la taille de la mémoire tampon.
GlobalGetAtomName Les atomes de chaînes globaux sont accessibles à n’importe quelle application. Toutefois, si une autre application est inversée, elle risque de ne pas gérer leurs décomptes de références et de les supprimer. Vous devez envisager d’utiliser des atomes d’entiers globaux à la place.
ImpersonateDdeClientWindow Si la fonction échoue, les demandes des clients suivantes sont effectuées dans le contexte de sécurité du processus appelant. Cela peut être un problème si le processus appelant s’exécute en tant que compte à privilèges élevés. Par conséquent, si l’appel échoue ou génère une erreur, ne poursuivez pas l’exécution de la requête du client.
DdeImpersonateClient Si la fonction échoue, les demandes des clients suivantes sont effectuées dans le contexte de sécurité du processus appelant. Cela peut être un problème si le processus appelant s’exécute en tant que compte à privilèges élevés. Par conséquent, si l’appel échoue ou génère une erreur, ne poursuivez pas l’exécution de la requête du client.
GetClipboardFormatName Un calcul incorrect de la taille appropriée de la mémoire tampon lpszFormatName , en particulier lorsque l’application est utilisée à la fois dans les versions ANSI et Unicode, peut provoquer un dépassement de capacité de la mémoire tampon. Notez également que la chaîne est tronquée si elle est plus longue que le paramètre cchMaxCount , ce qui peut entraîner une perte d’informations.
GetMenuString Le paramètre lpString est une mémoire tampon TCHAR , tandis que nMaxCount est la longueur de la chaîne de menu dans TCHAR s. La taille incorrecte de ces paramètres peut être la longueur de la chaîne de menu en caractères. Le dimensionnement de ces paramètres peut provoquer une troncation de la chaîne, entraînant ainsi une perte de données.
GetStringTypeA, GetStringTypeEx, GetStringTypeW Pour éviter un dépassement de mémoire tampon, définissez la taille de la mémoire tampon lpCharType correctement.
LoadLibrary L’utilisation incorrecte de LoadLibrary peut compromettre la sécurité de votre application en chargeant la dll incorrecte.
LoadString Une utilisation incorrecte comprend la spécification d’une taille incorrecte dans le paramètre nBufferMax . Par exemple, sizeof (lpBuffer) donne la taille de la mémoire tampon en octets, ce qui peut entraîner un dépassement de capacité de la mémoire tampon pour la version Unicode de la fonction. Les situations de dépassement de mémoire tampon sont la cause de nombreux problèmes de sécurité dans les applications. Dans ce cas, l’utilisation sizeof(lpBuffer)/sizeof(TCHAR) de donne la taille appropriée de la mémoire tampon.
lstrcat Cette fonction utilise la gestion structurée des exceptions (SEH) pour intercepter les violations d’accès et d’autres erreurs. Lorsque cette fonction intercepte des erreurs SEH, elle retourne la valeur null sans terminer par null la chaîne et sans null sans null qui termine la chaîne et sans notifier l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace est insuffisant pour la condition d’erreur. Le premier argument, lpString1, doit être suffisamment grand pour contenir lpString2 et le' \ 0 'fermant, sinon, un dépassement de mémoire tampon peut se produire. Les dépassements de mémoire tampon peuvent entraîner une attaque par déni de service contre l’application si une violation d’accès se produit. Dans le pire des cas, un dépassement de mémoire tampon peut permettre à une personne malveillante d’injecter du code exécutable dans votre processus, en particulier si lpString1 est une mémoire tampon basée sur la pile. Envisagez d’utiliser l’une des alternatives suivantes. StringCbCat ou StringCchCat.
lstrcpy Cette fonction utilise la gestion structurée des exceptions (SEH) pour intercepter les violations d’accès et d’autres erreurs. Lorsque cette fonction intercepte des erreurs SEH, elle retourne la valeur null sans terminer par null la chaîne et sans null sans null qui termine la chaîne et sans notifier l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace est insuffisant pour la condition d’erreur. Le premier argument, lpString1, doit être suffisamment grand pour contenir lpString2 et le' \ 0 'fermant, sinon, un dépassement de mémoire tampon peut se produire. Les dépassements de mémoire tampon peuvent entraîner une attaque par déni de service contre l’application si une violation d’accès se produit. Dans le pire des cas, un dépassement de mémoire tampon peut permettre à une personne malveillante d’injecter du code exécutable dans votre processus, en particulier si lpString1 est une mémoire tampon basée sur la pile. Utilisez StringCchCopy à la place.
lstrcpyn Cette fonction utilise la gestion structurée des exceptions (SEH) pour intercepter les violations d’accès et d’autres erreurs. Lorsque cette fonction intercepte des erreurs SEH, elle retourne la valeur null sans terminer par null la chaîne et sans null sans null qui termine la chaîne et sans notifier l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace est insuffisant pour la condition d’erreur. Si lpString1 n’est pas suffisamment grand pour contenir la chaîne copiée, un dépassement de mémoire tampon peut se produire. En outre, lors de la copie d’une chaîne entière, Notez que sizeof retourne le nombre d’octets plutôt que WCHAR, alors que sizeof retourne le nombre d’octets plutôt que des caractères, ce qui est incorrect pour la version Unicode de cette fonction. Les dépassements de mémoire tampon peuvent provoquer une attaque par déni de service contre l’application si une violation d’accès se produit. Dans le pire des cas, un dépassement de mémoire tampon peut permettre à une personne malveillante d’injecter du code exécutable dans votre processus, en particulier si lpString1 est une mémoire tampon basée sur la pile. Utilisez StringCchCopy à la place.
lstrlen lstrlen suppose que lpString est une chaîne terminée par le caractère null. Si ce n’est pas le cas, cela peut entraîner un dépassement de mémoire tampon ou une attaque par déni de service contre votre application. Envisagez d’utiliser l’une des alternatives suivantes. StringCbLength ou StringCchLength.
wsprintf Il n’est pas garanti que la chaîne retournée dans lpOut se termine par un caractère null. Évitez également le format% s, ce qui peut entraîner un dépassement de mémoire tampon. Si une violation d’accès se produit, cela entraîne un déni de service par rapport à votre application. Dans le pire des cas, une personne malveillante peut injecter du code exécutable. Envisagez d’utiliser l’une des alternatives suivantes. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.
wvsprintf Il n’est pas garanti que la chaîne retournée dans lpOutput se termine par un caractère null. Évitez également d’utiliser le format% s, qui peut entraîner un dépassement de mémoire tampon. Cela peut entraîner un déni de service si une violation d’accès se produit, ou une personne malveillante peut injecter du code exécutable. Envisagez d’utiliser l’une des alternatives suivantes. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx.

Sécurité Microsoft

Sécurité et identité

Index des procédures de sécurité

Ressources de sécurité TechNet

Meilleures pratiques pour les API de sécurité