Considérations relatives à la sécurité : Interface utilisateur Windows
Cette rubrique fournit des informations sur les considérations de sécurité dans l’interface utilisateur Windows. Cette rubrique ne fournit pas tout ce dont vous avez besoin 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.
Avec l’augmentation de l’interconnexion des ordinateurs, les développeurs doivent désormais s’inquiéter de la sécurité des applications. Toutefois, la sécurité améliore également la sécurité générale des applications et la robustesse ; il s’agit donc d’une autre façon que le développeur puisse offrir une bonne expérience utilisateur. Les rubriques suivantes décrivent certains problèmes de sécurité potentiels lors de l’utilisation de l’interface utilisateur Windows.
Considérations relatives aux chaînes
De nombreuses fonctions, messages et macros utilisent des chaînes dans leurs paramètres. Toutefois, souvent, les chaînes ne sont pas vérifiées pour l’arrêt null ou la longueur. Une préoccupation liée consiste à mal calculer la longueur d’une chaîne ou d’une mémoire tampon. Dans les deux cas, cela peut entraîner un dépassement de mémoire tampon ou une troncation des données, ce qui peut affecter votre application de manière défavorable. 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écurisée, vous devez effectuer les opérations suivantes :
- Vérifiez les chaînes pour l’arrêt null ou pour la longueur appropriée, le cas échéant.
- Veillez à déterminer la longueur d’une chaîne ou d’une mémoire tampon, en particulier lorsqu’elle contient valeurs de TCHAR.
- Si vous créez une chaîne ou utilisez une chaîne qui a été utilisée précédemment, initialisez-la sur zéro ou insérez une marque de fin null, le cas échéant.
En outre, envisagez d’utiliser les fonctions StrSafe lors de la gestion des chaînes. Ces fonctions sont conçues pour gérer les chaînes en toute sécurité.
Entrée utilisateur
L’interface utilisateur Windows concerne l’obtention et la réponse aux informations des utilisateurs. Toutefois, les utilisateurs qui entrent des données incorrectes peuvent perturber votre application, qu’ils le fassent ou non. Ainsi, la règle cardinale est que toutes les entrées doivent être validées.
La principale préoccupation concerne les données de chaîne, qui sont décrites dans considérations relatives aux chaînes. Toutefois, tous les types d’entrée doivent être validés avant d’être utilisés par votre application. Une autre préoccupation est que les données sont validées à un moment donné, mais qu’elles changent avant d’être utilisées, par exemple lors de la réception de messages qui donnent la longueur du texte. Par conséquent, s’il est possible que les données changent, 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 incorrectement, peuvent compromettre la sécurité de vos applications.
Caractéristique | Atténuation |
---|---|
GetAtomName | Veillez à spécifier la taille de la mémoire tampon. |
GlobalGetAtomName | Les atomes de chaîne globale sont accessibles à n’importe quelle application. Toutefois, si une autre application est insouciant, elle peut mal prendre en charge leur nombre de références et les supprimer. Vous devez envisager d’utiliser à la place des atomes entiers globaux. |
ImpersonateDdeClientWindow | Si la fonction échoue, les demandes clientes suivantes sont effectuées dans le contexte de sécurité du processus appelant. Il peut s’agir d’un problème si le processus appelant s’exécute en tant que compte hautement privilégié. Par conséquent, si l’appel échoue ou déclenche une erreur ne continue pas l’exécution de la demande cliente. |
DdeImpersonateClient | Si la fonction échoue, les demandes clientes suivantes sont effectuées dans le contexte de sécurité du processus appelant. Il peut s’agir d’un problème si le processus appelant s’exécute en tant que compte hautement privilégié. Par conséquent, si l’appel échoue ou déclenche une erreur ne continue pas l’exécution de la demande cliente. |
GetClipboardFormatName | Le calcul incorrect de la taille appropriée de la mémoire tampon lpszFormatName, en particulier lorsque l’application est utilisée dans les versions ANSI et Unicode, peut entraîner un dépassement de capacité de 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 et nMaxCount est la longueur de la chaîne de menu dans TCHAR. Le dimensionnement incorrect de ces paramètres peut être la longueur de la chaîne de menu en caractères. Le dimensionnement incorrect de ces paramètres peut entraîner une troncation de la chaîne, ce qui entraîne une perte possible de données. |
GetStringTypeA, GetStringTypeEx, GetStringTypeW | Pour éviter un dépassement de mémoire tampon, définissez correctement la taille de la mémoire tampon lpCharType. |
LoadLibrary | L’utilisation de LoadLibrary peut compromettre la sécurité de votre application en chargeant la DLL incorrecte. |
LoadString | L’utilisation incorrecte inclut la spécification de la 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 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 de sizeof(lpBuffer)/sizeof(TCHAR) 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 les erreurs SEH, elle retourne NULL sans fin null de la chaîne et sans null sans fin null de la chaîne et sans notification de l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace insuffisant est la condition d’erreur. Le premier argument, lpString1, doit être suffisamment grand pour contenir lpString2 et la fermeture '\0', 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 à un attaquant 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 les erreurs SEH, elle retourne NULL sans fin null de la chaîne et sans null sans fin null de la chaîne et sans notification de l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace insuffisant est la condition d’erreur. Le premier argument, lpString1, doit être suffisamment grand pour contenir lpString2 et la fermeture '\0', 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 à un attaquant 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 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 les erreurs SEH, elle retourne NULL sans fin null de la chaîne et sans null sans fin null de la chaîne et sans notification de l’appelant de l’erreur. L’appelant n’est pas sûr de supposer que l’espace insuffisant est 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 taille d' retourne le nombre d’octets plutôt que WCHAR, que taille de retourne le nombre d’octets plutôt que de caractères, ce qui est incorrect pour la version Unicode de cette fonction. 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 à un attaquant 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 stringCchCopy à la place. |
lstrlen | lstrlen suppose que lpString est une chaîne terminée par 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 | La chaîne retournée dans lpOut n’est pas garantie d’être terminée par null. En outre, évitez le format %s, ce qui peut entraîner un dépassement de mémoire tampon. Si une violation d’accès se produit, elle provoque un déni de service contre votre application. Dans le pire des cas, un attaquant peut injecter du code exécutable. Envisagez d’utiliser l’une des alternatives suivantes. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
wvsprintf | La chaîne retournée dans lpOutput n’est pas garantie d’être terminée par null. En outre, évitez l’utilisation du format %s, ce qui peut entraîner un dépassement de mémoire tampon. Cela peut entraîner un déni de service s’il entraîne une violation d’accès, ou un attaquant peut injecter du code exécutable. Envisagez d’utiliser l’une des alternatives suivantes. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfou StringCchVPrintfEx. |
Rubriques connexes
-
comment indexer les de sécurité
-
meilleures pratiques pour les API de sécurité