Dans cet article, nous souhaitons vous parler du buffer overflow, appelé en français « Dépassement de tampon », qui est une technique très efficace pour exploiter une faille informatique. Nous vous donnerons une définition concise de ce qu’est un buffer overflow, puis nous reviendrons plus en détails sur les différents types d’attaques possibles.
Sommaire
Qu’est-ce qu’un buffer overflow ?
Les buffers (tampons) sont des zones de stockage de mémoire qui contiennent temporairement des données pendant leur transfert d’un emplacement à un autre. Un buffer overflow (ou buffer overrun) se produit lorsque le volume de données dépasse la capacité de stockage de la mémoire tampon. En conséquence, le programme tentant d’écrire les données dans la mémoire tampon écrase les emplacements de mémoire adjacents.
Par exemple, pour les informations d’identification de connexion d’un site Internet, un buffer peut être conçu pour stocker des entrées de nom d’utilisateur et de mot de passe de 8 octets, donc s’il y a une entrée de 10 octets (c’est-à-dire 2 octets de plus que prévu), le programme malveillant va écrire dans le buffer plus de données qu’il ne peut en stocker.
Les débordements de buffer peuvent affecter tous les types de logiciels : navigateur web, logiciels de messagerie, site Internet, réseau informatique, etc). Les hackers utilisant le buffer overflow vont alors exploiter des entrées informatiques mal développées qui sont dans l’incapacité d’allouer suffisamment d’espace pour le tampon. Cela arrive lorsque le programmeur n’a pas délimité la taille de la mémoire, donnant la possibilité à un hacker de déborder ou d’écraser des variables.
Si l’attaque du buffer écrase le code exécutable, le programme peut se comporter de manière imprévisible et générer des résultats incorrects, des erreurs d’accès à la mémoire ou des plantages.
Attaque par buffer overflow en détails
Comme nous venons de le préciser, les hackers exploitent les problèmes de dépassement de mémoire tampon en écrasant la mémoire d’une application. Cela modifie le chemin d’exécution du programme, déclenchant une réponse qui endommage les fichiers ou expose des informations privées.
Par exemple, un hacker peut introduire du code supplémentaire, envoyant de nouvelles instructions à l’application pour accéder aux systèmes informatiques.
Si les cybercriminels connaissent la disposition de la mémoire d’un programme, ils peuvent intentionnellement alimenter une entrée que le buffer ne peut pas stocker et écraser les zones qui contiennent du code exécutable, en le remplaçant par leur propre code.
Par exemple, un hacker peut écraser un élément qui pointe vers une autre zone en mémoire et rediriger son attaque vers une charge utile d’exploit, pour prendre le contrôle du programme.
Le stack-based overflow
Voyons de manière concrète les deux grandes catégories des attaques par overflow du tampon :
- Stack-based overflow (« pile d’exécution » en français)
- Heap-based attacks
Les débordements de tampon de type « Stack-based overflow » sont les plus courants et exploitent la mémoire de la pile qui n’existe que pendant le temps d’exécution d’une fonction.
Les attaques basées sur le tas sont plus difficiles à réaliser et impliquent de déborder l’espace mémoire alloué à un programme au-delà de la mémoire utilisée pour les opérations d’exécution en cours.
Exploiter un « stack-based overflow » au niveau de la pile d’exécution, permet de réécrire le pointeur d’instruction sauvegardé, donnant la possibilité d’exploiter plusieurs failles au sein du système, par exemple pour rediriger un flux d’exécution du programme cible vers un autre élément.
Ce type de vulnérabilité nécessite au préalable une préparation importante et précise, le hacker devra couper des mécanismes de sécurité et utiliser des techniques spécifiques telles que l’address space layout randomization (ASLR) ou encore écraser le « stack canary ».
Quels langages de programmation sont les plus vulnérables ?
C et C++ sont deux langages très sensibles aux attaques par buffer overlow, car ils ne disposent pas de protections intégrées contre l’écrasement ou l’accès aux données dans leur mémoire. Mac OSX, Windows et Linux utilisent tous du code écrit en C et C++.
Des langages tels que PERL, Java, JavaScript et C# utilisent des mécanismes de sécurité intégrés qui minimisent le risque de débordement de la mémoire tampon.
Comment éviter les débordements de tampon ?
Les développeurs peuvent se protéger contre les vulnérabilités de débordement de tampon via des mesures de sécurité dans leur code, ou en utilisant des langages qui offrent une protection intégrée.
De plus, les systèmes d’exploitation modernes disposent d’une protection à l’exécution.
Comme précisé ci-dessus à propos de la technique stack-based overflow, il existe trois protections courantes qu’il est primordial d’utiliser pour se protéger contre les attaques par dépassement du tampon :
- Randomisation de l’espace d’adressage (ASLR)
- Prévention de l’exécution des données : signale certaines zones de la mémoire comme non exécutables ou exécutables, ce qui empêche une attaque d’exécuter du code dans une région non exécutable.
- Protection contre l’écrasement du gestionnaire d’exceptions structuré (SEHOP) :
Les mesures de sécurité dans le code et la protection du système d’exploitation ne suffisent pas. Lorsqu’une organisation découvre une vulnérabilité de dépassement de mémoire tampon, elle doit réagir rapidement pour corriger le logiciel concerné et s’assurer que les utilisateurs du logiciel peuvent accéder au correctif.