fbpx

Buffer Overflow Attack

Les attaques par « débordement de tampon » (en anglais « Buffer overflow ») ont pour principe l’exécution de code arbitraire par un programme en lui envoyant plus de données qu’il n’est censé en recevoir. C’est à dire faire exécuter un code malveillant à un programme.

Il y a deux types de codes malveillant :

  1. Un code provoquant une sorte de déni de service monopolisant un ensemble ou un sous-ensemble des ressources de la machine.
  2. Un code permettant d’exécuter des routines du système dans un but d’intrusion ou de destruction.

En effet, les programmes acceptant des données en entrée, passées en paramètre, les stockent temporairement dans une zone de la mémoire appelée tampon (en anglais buffer). Or, certaines fonctions de lecture, telles que les fonctions strcpy() du langage C, ne gèrent pas ce type de débordement et provoquent un plantage de l’application pouvant aboutir à l’exécution du code arbitraire et ainsi donner un accès au système.

La mise en œuvre de ce type d’attaque est très compliquée car elle demande une connaissance poussée de l’architecture des programmes et des processeurs. Néanmoins, il existe de nombreux exploits capable d’automatiser ce type d’attaque et la rendant à la portée de quasi-néophytes.

Le principe de fonctionnement d’un débordement de tampon est fortement lié à l’architecture du processeur sur lequel l’application vulnérable est exécutée.

Les données saisies dans une application sont stockée en mémoire vive dans une zone appelée tampon. Un programme correctement conçu doit prévoir une taille maximale pour les données en entrées et vérifier que les données saisies ne dépassent pas cette valeur.

Les instructions et les données d’un programme en cours d’exécution sont provisoirement stockées en mémoire de manière contigüe dans une zone appelée pile (en anglais stack). Les données situées après le tampon contiennent ainsi une adresse de retour (appelée pointeur d’instruction) permettant au programme de continuer son exécution. Si la taille des données est supérieure à la taille du tampon, l’adresse de retour est alors écrasée et le programme lira une adresse mémoire invalide provoquant une faute de segmentation (en anglais segmentation fault) de l’application.

Un pirate ayant de bonnes connaissance techniques peut s’assurer que l’adresse mémoire écrasé corresponde à une adresse réelle, par exemple située dans le tampon lui-même. Ainsi, en écrivant des instructions dans le tampon (code arbitraire), il lui est simple de l’exécuter.
Il est ainsi possible d’inclure dans le tampon des instructions ouvrant un interpréteur de commande (en anglais shell) et permettant au pirate de prendre la main sur le système. Ce code arbitraire permettant d’exécuter l’interpréteur de commande est appelé shellcode.

Pour se protéger de ce type d’attaque,

  • utiliser des langages haut-niveau qui intègre une gestion complète de la mémoire. Ex: Java, Cyclone…
  • utiliser des librairies et des fonctions sécurisés (fonction strncpy()…, librairie Libsafe) et éviter scanf / strcpy / gets
  • tester son code avec des logiciels spécialisé comme Qaudit ou Flawfinder
  • Appliquer rapidement les correctifs
Des bulletins d’alerte sont régulièrement publiés, annonçant la vulnérabilité de certaines applications à des attaques par débordement de tampon. Suite à ces bulletins d’alerte, les éditeurs des logiciels touchés par la vulnérabilité publient généralement des correctifs (patchs) permettant de corriger la faille. Tout administrateur système et réseau se doit de se tenir informé des alertes de sécurité et d’appliquer le plus rapidement possible les correctifs.
Partagez nous !