next up previous contents Next: Programmes setuid. Up: Attaques communes. Previous: Attaques communes.   Table des matières  


45.1.1 Attaques par dépassement de tampon.

Le terme anglais est buffer overflow attack(s). Considérons le programme C dans l'encadré suivant. Si vous ne comprenez pas très bien le C, ce n'est pas grave. Ce qui est important, c'est la logique du programme (si vous envisagez d'essayer le programme, déconnectez-vous du réseau):

# include <stdio.h> 
 
void do_echo ( void )

{ 
    char buf[ 256 ]; 
    gets ( buf ); 
    printf ( ``%s'', buf ); 
    fflush ( stdout );

} 
 
int main ( int argc, char *argv[] ) 
{ 
    for ( ;; ) { 
        do_echo (); 
} 



Compilez ce programme avec la commande gcc -o /usr/local/sbin/mon_echod mon_echod.c. A présent, créez un service géré soit par xinetd soit par inetd. Dans le cas de xinetd, créez un fichier /etc/xinetd.d/mon_echod contenant:

service mon_echod 
{ 
      flags          = REUSE 
      socker_type    = stream 
      wait           = no 
      user           = root 
      server         = root  
      log_on_failure += USERID 
} 


Concernant inetd, vous ajouterez la ligne suivante dans /etc/inetd.conf:

mon_echod  stream  tcp    nowait   root     /usr/local/sbin/mon_echo 


Bien sûr, le service mon_echod n'existe pas. Il faut donc ajouter la ligne suivante à votre fichier /etc/services:

mon_echod  400/tcp    # service demo temporaire 


et redémarrer xinetd (ou inetd) comme d'habitude.

Maintenant, vous pouvez exécuter netstat -na. Vous devriez voir une ligne comme celle-ci en sortie:

tcp        0        0.0.0.0:400        0.0.0.0:*        LISTEN 


Lancez la commande telnet localhost 400 et saisissez quelques commentaires. Le démon mon_echod se charge d'afficher simplement les lignes.

Un habitué de la programmation C a déjà noté que la saisie de plus de 256 caractères s'effectue dans une zone non-définie de la mémoire. Comment utilisez cette propriété pour faire fonctionner le programme hors du champ pour lequel il a été prévu? Le principe est simple. Il suffit d'écrire des instructions dans une zone de la mémoire pour qu'elles soient exécutées en différé; ceci va conduire le démon à exécuter tout ce que vous voudrez. Or, le processus fonctionne avec les privilèges de root, si bien que quelques instructions envoyées au noyau pourraient conduire à la troncature du fichier passwd ou la suppression d'un superbloc. Cette technique qui se base sur l'exécution d'un programme particulier s'appelle, en anglais, un exploit (c'est une technique de piratage basée sur une astuce permettant d'exploiter une faille de sécurité dans un programme). En général, ce type d'attaque entre dans la catégorie des attaques par dépassement de tampon (ou buffer overflow attacks).

La prévention est simple, elle aussi: lorsque vous écrivez des programmes. assurez-vous que les données entrantes sont traitées comme potentiellement dangereuses. Dans le cas qui nous occupe, la fonction fgets devrait être employée (à la place de gets) parce qu'elle limite le nombre de caractères pouvant être écrits dans le tampon. Cependant, il existe de nombreuses fonctions qui ont un comportement potentiellement dangereux: même strcpy écrit jusqu'à un caractère nul ('\0') qui peut ne jamais être encodé. sprintf écrit une chaîne qui peut être plus longue que le tampon et getwd est une autre fonction [NdT: getwd permet de déterminer le chemin absolu du répertoire courant. Voir man getwd.] qui ne fait jamais de vérification des limites de chaînes.


next up previous contents Next: Programmes setuid. Up: Attaques communes. Previous: Attaques communes.   Table des matières  
1-01-2006