Utilisation de fonctions de chaîne sécurisée
De nombreux problèmes de sécurité système sont dus à une gestion médiocre de la mémoire tampon et aux dépassements de mémoire tampon qui en résultent. Une mauvaise gestion de la mémoire tampon est souvent associée aux opérations de manipulation de chaîne. Les fonctions de manipulation de chaîne standard fournies par les bibliothèques du runtime de langage C/C++ (strcat, strcpy, sprintf, etc.) n’empêchent pas l’écriture au-delà de la fin des mémoires tampons.
Deux nouveaux ensembles de fonctions de manipulation de chaîne, appelées fonctions de chaîne sécurisée, fournissent un traitement supplémentaire pour une gestion appropriée de la mémoire tampon dans votre code. Ces fonctions de chaîne sécurisée sont disponibles dans le Kit de pilotes Windows (WDK) et pour Microsoft Windows XP SP1 et les versions ultérieures du Kit de développement de pilotes (DDK) et du SDK Windows. Ils sont destinés à remplacer leurs équivalents C/C++ intégrés et les routines similaires fournies par Windows.
Un ensemble de fonctions de chaîne sécurisées sont destinées à être utilisées dans le code en mode noyau. Ces fonctions sont prototypes dans un fichier d’en-tête nommé Ntstrsafe.h. Ce fichier d’en-tête et une bibliothèque associée sont disponibles dans wdk.
L’autre ensemble de fonctions de chaîne sécurisée est destiné à être utilisé dans les applications en mode utilisateur. Un fichier d’en-tête correspondant, Strsafe.h, contient des prototypes pour ces fonctions. Ce fichier et une bibliothèque associée sont disponibles dans le Kit de développement logiciel (SDK) Windows. Pour plus d’informations sur Strsafe.h, consultez Utilisation des fonctions Strsafe.h.
L’ensemble des fonctions de chaîne sans échec en mode noyau se compose des deux sous-ensembles suivants :
Fonctions de chaîne sécurisée pour les caractères Unicode et ANSI
Chacune de ces fonctions est disponible dans une version à suffixe W qui prend en charge les caractères Unicode codés sur deux octets et une version à suffixe A qui prend en charge les caractères ANSI codés sur un octet. Par exemple, RtlStringCbCatN, qui concatène deux chaînes et limite la longueur de la chaîne ajoutée, est disponible en tant que RtlStringCbCatNW et RtlStringCbCatNA.
Fonctions de chaîne sécurisée pour les structures UNICODE_STRING
Chacune de ces fonctions accepte une structure UNICODE_STRING comme paramètre d’entrée ou de sortie, ou les deux. Par exemple, RtlStringCbCopyUnicodeString accepte la structure en tant que paramètre d’entrée, RtlUnicodeStringCopyString accepte la structure en tant que paramètre de sortie et RtlUnicodeStringCopy accepte la structure en tant que paramètre d’entrée et de sortie.
Les fonctions de chaîne sans échec en mode noyau fournissent les fonctionnalités suivantes :
Chaque fonction de chaîne sécurisée reçoit la taille de la mémoire tampon de destination comme entrée. La fonction peut ainsi s’assurer qu’elle n’écrit pas au-delà de la fin de la mémoire tampon.
Les fonctions de chaîne Unicode et ANSI terminent toutes les chaînes de sortie avec un caractère NULL, même si l’opération tronque le résultat prévu.
Toutes les fonctions de chaîne sécurisée retournent une valeur NTSTATUS, avec un seul code de réussite possible (STATUS_SUCCESS).
La plupart des fonctions de chaîne sécurisée sont disponibles à la fois dans une version comptée en octets et en caractères. Par exemple, RtlStringCbCata concatène deux chaînes comptées en octets et RtlStringCchCata concatène deux chaînes comptées en caractères.
La plupart des fonctions de chaîne sécurisée sont disponibles dans une version étendue avec suffixe ex qui fournit des fonctionnalités supplémentaires. Par exemple, RtlStringCbCatExa étend les fonctionnalités de RtlStringCbCata.
Cette section comprend les rubriques suivantes :