BUFFER OVERFLOW


Autrement appelé débordement de pile en terminologie française, un buffer overflow est une attaque classique consistant à exploiter la mauvaise gestion de la pile mémoire (réservation et relâche des espaces mémoires) dans un programme. La personne malveillante envoie délibérément trop d'informations dans un champs ou une variable spécifique, entraînant un dépassement de la zone mémoire allouée à cette variable. La personne malveillante peut alors obtenir des droits d'accès élevés ou disposer du code exécutable malicieux dans la zone de mémoire débordée.


+ d'infos :

En informatique, un dépassement ou débordement de tampon (en anglais, buffer overflow) est un bogue pouvant être exploité pour violer la politique de sécurité d’un système. Cette technique est couramment utilisée par les pirates informatiques.

Lorsque le bogue est provoqué inintentionnellement, le comportement de la machine devient complètement imprévisible. Cela se manifeste souvent par un blocage du programme, voire de tout le système, s’il est mal conçu.

Lorsque le bogue est exploité à des fins malveillantes, la stratégie du pirate est de détourner le programme bogué en lui faisant exécuter un code externe, hostile ou non.

Plus techniquement, le principe 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é.

Afin d’éviter ces dépassements, certaines fonctions ont été réécrites pour prendre en paramètre la taille du buffer dans lequel les données sont copiées, et éviter ainsi de copier plus qu’il ne contient. Ainsi strncpy() est une version de strcpy() qui prend la taille du buffer. Dès que les techniques de débordement de tampon commencèrent à se généraliser, l’équipe de FreeBSD cessa tout nouveau développement pendant plusieurs mois afin de colmater toutes les brèches de ce genre dans leur code source. Celle de Linux temporisa un peu plus.

Prévention:
Pour se prémunir de telles attaques, plusieurs options sont offertes au programmeur. Les différentes techniques de prévention font débat. En voici quelques-unes :
Utiliser un autre langage que le C/C++ qui ne comprend aucun mécanisme de vérification de dépassement des bornes. Utiliser éventuellement des bibliothèques ou programmes externes qui permettent en mode développement de tester les cas « litigieux ».
Bannir de son utilisation les fonctions dites « non protégées ». Préférer par exemple strncpy à strcpy qui effectue un contrôle de taille. Les compilateurs récents peuvent prévenir le programmeur s’il utilise des fonctions « à risque », même si l’exploitation reste possible.
Protéger, côté système, la pile :
Rendre la pile non exécutable.
Mettre en place un mécanisme de vérification de la pile, le principe est de stocker une clé, générée à l’exécution entre la fin de la pile et la valeur de retour. Si cette clé est modifiée, l’exécution est avortée (disponible en option dans les compilateurs C récents - éventuellement avec recours à des patchs). La principale critique étant que l’appel de fonction est ralenti.

Aucune de ces solutions ne s’est pour l’instant imposée dans le monde du développement industriel. Pourtant, ces attaques représentent une part encore importante des failles permettant le développement de vers ou virus.