Partager via


Utilisation de fonctions entières sécurisées

Une façon de réduire les problèmes de sécurité consiste à empêcher les dépassements d’entiers et les sous-flux.

  • Les dépassements d'entier se produisent lorsque le résultat d'une opération arithmétique dépasse la capacité mémoire du type de données choisi pour l'accueillir. Cette opération entraîne la troncation de l’entier et un résultat incorrect. Par exemple, si vous ajoutez deux entiers de 32 bits qui entraînent une valeur supérieure à 2^31-1, le résultat est tronqué pour s'intégrer dans l'espace d'entier de 32 bits, ce qui peut entraîner un comportement inattendu dans votre code.

  • Le sous-flux entier se produit lorsqu’une opération, généralement soustraction, donne un résultat incorrect. Par exemple, si vous soustrayez un nombre de INT_MIN (valeur la plus petite pour un entier signé 32 bits), le résultat est tronqué pour s’adapter à l’espace entier 32 bits, ce qui peut également entraîner un comportement inattendu.

  • La conversion entre deux types de données peut également entraîner des résultats incorrects en raison de la troncation d’un résultat qui ne correspond pas au nouvel espace mémoire.

La bibliothèque ntintsafe fournit un ensemble de fonctions C qui effectuent des opérations arithmétiques entières sécurisées avec vérification des limites pour empêcher les dépassements et les sous-dépassements dans le code en mode noyau. Toutes les fonctions se trouvent dans le fichier d’en-tête ntintsafe.h , fourni avec le Kit de pilotes Windows (WDK). Ces fonctions correspondent aux fonctions Windows IntSafe utilisées par le code de l’application.

Vous utilisez ces fonctions pour calculer un index ou une taille de mémoire tampon, ou pour calculer une autre forme de vérification des limites. Les fonctions sont optimisées pour la vitesse.

Les fonctions entières sécurisées offrent les avantages suivants :

  • La taille de la mémoire tampon de destination est toujours fournie à la fonction pour s’assurer que la fonction n’écrit pas au-delà de la fin de la mémoire tampon.

  • Les mémoires tampons sont garanties comme étant terminées par null, même si l’opération tronque le résultat prévu.

  • Toutes les fonctions retournent une valeur NTSTATUS, avec un seul code de réussite possible (STATUS_SUCCESS) et une condition d’erreur possible (STATUS_INTEGER_OVERFLOW). Par exemple, NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); devrait renvoyer le résultat = -2 147 483 649, mais ce nombre ne peut pas être représenté dans un champ de 32 bits. Au lieu de cela, result n’est pas défini et status est STATUS_INTEGER_OVERFLOW, qui est la valeur d’état retournée pour signaler les dépassements de capacité et les flux inférieurs.

La bibliothèque ntintsafe a deux catégories de fonctions :

  • Fonctions de conversion : ces fonctions effectuent des conversions entre deux types de données.

  • Fonctions arithmétiques : ces fonctions effectuent des opérations d’addition, de soustraction et de multiplication pour chaque type de données.

Résumé des fonctions d’entier sécurisé Kernel-Mode

Importation de fonctions d'entiers sécurisées en mode noyau