Buffer overflow (Dépassement de tampon)
Un buffer overflow (ou dépassement de tampon en français) est une vulnérabilité de sécurité se produisant lorsqu'un programme écrit plus de données dans un tampon (mémoire temporaire) que ce qu'il peut contenir. Cela peut entraîner des comportements imprévisibles, des plantages, ou permettre à un attaquant d'exécuter un code malveillant.
Comment cela fonctionne ?
Un tampon est une zone de mémoire allouée pour entreposer des données temporaires, comme une chaîne de caractères ou un tableau. Si un programme ne vérifie pas correctement la taille des données avant de les écrire dans un tampon, les données supplémentaires débordent dans les zones adjacentes de la mémoire. Ces zones adjacentes peuvent contenir d'autres données, des variables critiques, ou même des pointeurs d'exécution.
Conséquences potentielles
- Altération de données : Les données adjacentes sont corrompues.
- Crash du programme : Le programme peut se terminer de manière inattendue.
- Exécution de code malveillant : Un attaquant peut injecter du code dans la mémoire et rediriger le flux d'exécution pour le faire fonctionner. Celle-ci est souvent exploité en manipulant des adresses dans la pile (stack) ou la mémoire de tas (heap).
Exemple en C
Dans cet exemple, la fonction strcpy copie des données sans vérifier leur taille, ce qui provoque un dépassement de tampon.
Exemple en Free Pascal
Voici un exemple en Free Pascal illustrant un dépassement de tampon. Bien que Pascal soit souvent considéré comme plus sûr que le C grâce à sa gestion stricte des limites de tableaux, un dépassement de tampon reste possible si des constructions comme les chaînes de caractères non contrôlées ou les pointeurs sont utilisées :
- Program BufferOverflowExample;
-
- Uses
- SysUtils;
-
- Procedure VulnerableFunction(input:PChar);
- Var
- Buffer:Array[0..7] of Char; (* Tampon de 8 caractères (indices 0 à 7) *)
- Begin
- StrCopy(buffer, input); (* Copie de la chaîne sans vérifier sa taille *)
- WriteLn('Contenu du tampon : ', buffer);
- End;
-
- Var
- maliciousInput:PChar;
- BEGIN
- maliciousInput:='1234567890ABCDEF'; (* Chaîne de caractères plus grande que le tampon *)
- WriteLn('Input : ', maliciousInput);
- VulnerableFunction(maliciousInput);
- END.
Prévention
Pour éviter les buffer overflow :
- Vérification des limites : Utiliser des fonctions sûres comme strncpy ou snprintf au lieu de leurs équivalents non sécurisés.
- Techniques de durcissement : Utilisation de protections comme ASLR (Address Space Layout Randomization) et DEP (Data Execution Prevention). Activation des protections de pile telles que les canaries.
- Langages sûrs : Privilégier des langages modernes gérant automatiquement les débordements (exemple : Rust, Java).
- Tests de sécurité : Effectuer des audits de code et des tests de fuzzing pour détecter les vulnérabilités.
Ce type de vulnérabilité est l'une des plus anciennes et des plus connues en sécurité informatique, mais il reste courant dans certains systèmes critiques.