Introduction aux débordements et sous-flux d’entiers
Les vulnérabilités de débordement et de sous-flux d’entiers sont considérées comme la huitième vulnérabilité la plus dangereuse de la Liste des 25 principales de l’Énumération des faiblesses communes (CWE) de 2019. Ces types de vulnérabilités sont créés par une mauvaise utilisation des types de variables et peuvent être exploités pour contourner les protections contre d’autres types de vulnérabilités, comme les débordements de tampons.
Types et tailles de variables
Chaque langage de programmation a le concept de différents types de variables. Un caractère, qui peut contenir des données de texte, est très différent d’un entier ou d’un flottant. Cependant, au-delà de ces types généraux, il existe des distinctions supplémentaires entre les variables, et ces distinctions sont ce qui rend possibles les vulnérabilités de débordement et de sous-écoulement d’entiers.
La plupart des langages de programmation ont le concept d’entiers signés et non signés. Un entier signé (comme son nom l’indique) a un signe, lui permettant de stocker des valeurs positives et négatives. Une variable non signée, en revanche, ne peut stocker que des nombres positifs.
Comme le montre l’image ci-dessus, les variables signées et non signées d’une taille donnée sont écrites de manière identique dans la mémoire d’un ordinateur. La seule différence est la façon dont la valeur est interprétée. Dans une valeur signée, une valeur en tête signifie un nombre négatif, tandis que dans une valeur non signée, une valeur au premier endroit signifie simplement un grand nombre.
L’autre distinction principale entre les différents types de variables « entières » est la taille de la valeur qu’elles peuvent contenir. Les langages de programmation ont les concepts de court, entier, long et au-delà, chacun définissant la taille de l’espace mémoire alloué à cette variable et la plage de valeurs qu’elle peut contenir.
Débordements et sous-flux d’entiers
Les vulnérabilités de débordement et de sous-flux d’entiers se résument à une conversion dangereuse entre des variables signées et non signées et des types de variables entières de tailles différentes. Il est généralement permis de convertir entre ces différents types et, dans de nombreux cas, (Lire la suite…)