{Buffer Overflow} – Initiation rapide à l’art du Buffer Overflow

 

Salut à tous,

 

J'ai longtemps hésité à écrire un article sur le sujet des "Buffer Overflow" ... l'expliquer oralement est assez simple, mais entre théorie et pratique il y a un monde.
J'ai donc regardé un certain nombre de tutoriels, de personnes qui tentaient une approche simplifiée de la chose.
Mais je dois vous avouer que je n'ai pas vraiment été conquis.
Il faut dire qu'il s'agit d'un sujet assez complexe.

D'autant qu'avec les dernières vulnérabilités découvertes ... les sécurités qui arrivent vont rendre cette attaque de plus en plus compliquée ....

Cet article apportera je l'espère une meilleure approche du sujet en le simplifiant de façon à ce que tout le monde puisse s'essayer à des "Buffer Overflow" sans pour autant avoir de notion technique telle que le "ShellCode"

Un peu de vulgarisation

Dans un programme informatique, un développeur va utiliser des variables.
Une variable va servir à stocker une information.
Par exemple, si je souhaite utiliser un nom et un prénom dans mon programme, je vais créer une variable "nom" et une variable "prénom" !
Nous pourrons ainsi associer à ces variables une valeur :

nom       = "Jean Pierre"
prenom =  "Dubois"

Cependant, une variable va prendre de la place dans la mémoire de votre ordinateur.
Un développeur aura la possibilité selon le langage de programmation qu'il utilise, de définir la taille maximum qu'il souhaite utiliser dans la mémoire de votre ordinateur.

char nom[16] = "";

Ci-dessus, je demande à l'ordinateur de me réserver dans sa "mémoire", de la place pour 16 "caractères"

L'ordinateur en allouera toujours un tout petit peu plus, mais c'est un autre sujet.
Bref ...
Nous disposons donc de 16 petites cases dans lesquels nous allons pouvoir stocker des caractères.

Nous ne sommes cependant, pas obligé de toutes les utiliser, il est tout à fait possible de n'utiliser que quelques-unes de nos cases.

Par contre, l'inverse n'est pas vrai ! 

Il n'est pas possible (normalement) d'utiliser plus d'espace que ce que nous avons demandé !
Dans le cas où nous occuperions plus de case ... nous pourrions écrire dans un endroit qui est utilisé par une autre variable (par exemple), ce qui peut entraîner un plantage complet du programme.

 

C'est ce débordement qui est intéressant dans cette attaque, car un pirate informatique, va pouvoir écrire à des endroits où il n'a pas spécialement l'autorisation (dans d'autres variables par exemple).

Les conséquences peuvent être multiples :

  • Exécuter un programme auquel nous n'avons pas accès
  • Obtenir plus de privilèges / droits dans un programme
  • Faire planter le programme
  • ...

 

Les cas d'usage

Ils sont nombreux, le "buffer overflow" peut s'exploiter d'une multitude de manière différente :

  • Dans un terminal en envoyant des paramètres très longs
  • Dans des champs textes d'une application
  • Dans un fichier qui va être utilisé par un programme
  • ...

Bref tous les endroits où il vous est possible d'interagir avec un programme.

Nous pourrions citer par exemple la playstation portable de Sony, où un "Buffer Overflow" avait été exploité au travers d'un simple fichier image (modifiée), qui en étant ouvert depuis la console a permis de "Jailbreaker" celle-ci.

Aussi il est tout à fait possible d'exploiter les sous-titres de VLC pour réaliser un "Buffer Overflow" (VLC permet d'importer des fichiers de sous titre). En créant des sous-titre super-longs par exemple.

Le SSID (nom de votre réseau) de votre box Internet (routeur) peut-être sujet au Buffer Overflow et faire "tomber en panne" le matériel qui affiche les réseaux dispo ou bien la box, si quelqu'un injecte un nom trop long

Bref les exemples sont vraiment très nombreux !!!

 

Passons à la pratique

Voici un petit bout de code en C qui est vulnérable aux "Buffer Overflow"

#include <stdlib.h>
#include <stdio.h>


main(){
        char    *nom = malloc(sizeof(char)*10),
             *prenom = malloc(sizeof(char)*10);

        printf("Addesses des Variables :\n   nom:%d\nprenom:%d\n", nom, prenom);

        printf("Quel est votre nom :");
        scanf("%s",nom);

        printf("Connexion en tant que nom: %s, prenom : %s\n", nom, prenom);
}

Dans le bout de code ci-dessous, que vous pourriez compiler dans un terminal
Je crée 2 variables : nom et prénom.

La ligne ci-dessous est simplement là pour vous aider, elle vous indiquera l'adresse de la variable "nom" et de "prénom" :
(Dans la mémoire de votre ordinateur, chaque donnée dispose d'une adresse)

printf("Addesses des Variables :\n nom:%d\nprenom:%d\n", nom, prenom);

Ce bout de code demande simplement votre nom !
Notre but, est donc de modifier le prénom.... qui ne nous est pas demandé.

Ainsi, si j’exécute ce petit programme, et que je lui dis que mon nom est "Dylan" j'obtiens :

 

 

Si vous regardez l'adresse de nom et de prénom, vous constatez qu'il y a juste 16 cases de différence ( 53220592- 53220576 = 16)
Ainsi, lorsque le programme me demande mon nom, si j'indique un "nom" de plus de 16 caractères, je vais écrire directement sur la variable "prénom" (sachant que normalement je n'ai pas la possibilité de renseigner mon prénom) :

En renseignant un nom de 16 caractères, j'arrive sur l'adresse de la variable "prénom" ...
Tout ce qui sera écrit à la suite de ces 16 caractères, écrira par-dessus la variable "prénom".

Dylan...........Bob

En ajoutant "Bob" après mes 16 caractères, j'écris "Bob" dans la variable "prénom" !

Et voilà, nous venons de réaliser notre premier "Buffer Overflow" !

 

Une démo vidéo

Comme je vous l'ai promis, cette année, je vais essayer de vous faire un max de contenu vidéo ;)
N’hésitez donc pas à vous abonner à ma chaîne.


 

Sécurisation

Il n'y a pas vraiment de méthode miracle pour se protéger contre les "Buffer Overflow".
Selon le langage de programmation vous aurez certaines fonctions plus vulnérables que d'autres et non recommandées ...
Dans ma démo j'utilise "scanf" qui n'est pas très recommandée.
Je vous recommande de bien vérifier chaque saisie utilisateur et chaque donnée "externe" qui pourrait être utilisée dans votre programme.

 

Conclusion

Je pense intimement que les "buffer overflow" vont être de plus en plus rare, car la sécurité va de plus en  plus se développer.
Pour l'heure nous pouvons encore y être sujet.
Un buffer overflow peut vous nuire ...

Je prenais l'exemple de VLC tout à l'heure, car il s'agit d'un lecteur vidéo très connu ... et vu que vous êtes sage et ne téléchargez jamais (n'est-ce pas) vous n'êtes donc pas exposé à d'éventuels fichiers vidéo trafiqués ^^

 

Partagez ce contenu

One comment

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *