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 )
{
}
|
service mon_echod
{ flags = REUSE socker_type = stream wait = no user = root server = root log_on_failure += USERID } |
mon_echod stream tcp nowait root /usr/local/sbin/mon_echo
|
mon_echod 400/tcp #
service demo temporaire
|
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
|
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.