97
Sécurité du système d’exploitation et des programmes
Chapitre 5
Débordement de tampon : exposé du cas général
Pour citer Wikipédia, « le principe [du débordement de tampon] est de profiter
de l’accès à certaines variables du programme, souvent par le biais de fonctions
telles scanf() (analyse de chaîne de caractères) ou strcpy() (copie de chaîne
de caractères) en langage C, qui ne contrôlent pas la taille de la chaîne à enregistrer dans un tampon, afin d’écraser la mémoire du processeur jusqu’à l’adresse
de retour de la fonction en cours d’exécution. On peut ainsi choisir quelles seront les prochaines instructions exécutées par le processeur. Le code introduit est
généralement exécuté avec les droits du programme détourné. »
Comme nous l’expliquent Cunningham & Cunningham [38], les langages C et
C++ représentent les chaînes de caractères au moyen de tampons de caractères (
char * ), qui ne sont que des zones de mémoire à partir d’une adresse de début, dépourvues de taille propre. La fin de la zone est simplement indiquée par
le caractère ASCII 0, que le programme peut écraser à sa guise pour allonger la
taille attribuée à la chaîne considérée. L’utilisateur malveillant d’un programme
écrit en C peut fournir, en réponse à une question du programme, une chaîne de
caractères plus longue que ce que le programmeur a prévu, et ainsi écrire subrepticement dans des zones mémoires réservées à d’autres usages, ce qui va altérer
le comportement du programme. Par exemple, il sera possible ainsi d’insérer, à
des emplacements bien choisis, du code exécutable, et de le faire exécuter par le
programme : c’est l’exploitation d’un débordement de tampon.
Que le programme soit vulnérable à ce genre d’exploitation n’est bien sûr pas une
fatalité : il est possible d’écrire des programmes qui vérifient que la longueur de
la chaîne de caractères saisie par l’utilisateur n’excède pas la taille prévue pour le
tampon, mais c’est très laborieux, et l’expérience montre que, sauf à utiliser des
méthodes systématiques, le programmeur en oublie toujours quelque part. Parmi
les méthodes systématiques on peut citer l’usage de bibliothèques de fonctions
de traitement de chaînes de caractères écrites conformes aux bonnes règles de
sécurité ; de telles bibliothèques existent mais leur usage n’est pas très répandu
parce qu’elles sont assez étrangères à la tradition de la programmation en C.
Débordement de tampon et langage C
Il est à noter que le problème du débordement de tampon est propre aux langages C et C++ : ainsi, il est à peu près impossible d’en déclencher un en Java,
Sécurité du système d’exploitation et des programmes
Chapitre 5
Débordement de tampon : exposé du cas général
Pour citer Wikipédia, « le principe [du débordement de tampon] est de profiter
de l’accès à certaines variables du programme, souvent par le biais de fonctions
telles scanf() (analyse de chaîne de caractères) ou strcpy() (copie de chaîne
de caractères) en langage C, qui ne contrôlent pas la taille de la chaîne à enregistrer dans un tampon, afin d’écraser la mémoire du processeur jusqu’à l’adresse
de retour de la fonction en cours d’exécution. On peut ainsi choisir quelles seront les prochaines instructions exécutées par le processeur. Le code introduit est
généralement exécuté avec les droits du programme détourné. »
Comme nous l’expliquent Cunningham & Cunningham [38], les langages C et
C++ représentent les chaînes de caractères au moyen de tampons de caractères (
char * ), qui ne sont que des zones de mémoire à partir d’une adresse de début, dépourvues de taille propre. La fin de la zone est simplement indiquée par
le caractère ASCII 0, que le programme peut écraser à sa guise pour allonger la
taille attribuée à la chaîne considérée. L’utilisateur malveillant d’un programme
écrit en C peut fournir, en réponse à une question du programme, une chaîne de
caractères plus longue que ce que le programmeur a prévu, et ainsi écrire subrepticement dans des zones mémoires réservées à d’autres usages, ce qui va altérer
le comportement du programme. Par exemple, il sera possible ainsi d’insérer, à
des emplacements bien choisis, du code exécutable, et de le faire exécuter par le
programme : c’est l’exploitation d’un débordement de tampon.
Que le programme soit vulnérable à ce genre d’exploitation n’est bien sûr pas une
fatalité : il est possible d’écrire des programmes qui vérifient que la longueur de
la chaîne de caractères saisie par l’utilisateur n’excède pas la taille prévue pour le
tampon, mais c’est très laborieux, et l’expérience montre que, sauf à utiliser des
méthodes systématiques, le programmeur en oublie toujours quelque part. Parmi
les méthodes systématiques on peut citer l’usage de bibliothèques de fonctions
de traitement de chaînes de caractères écrites conformes aux bonnes règles de
sécurité ; de telles bibliothèques existent mais leur usage n’est pas très répandu
parce qu’elles sont assez étrangères à la tradition de la programmation en C.
Débordement de tampon et langage C
Il est à noter que le problème du débordement de tampon est propre aux langages C et C++ : ainsi, il est à peu près impossible d’en déclencher un en Java,
