Suivant : Et la signature fut... Monter : Le DoS Précédent: Résultat de la commande

Et le bug de Snort dans tout ca?


On constate donc qu'on a bien d'abord l'en-tête IP (20 bytes), puis l'en-tête ICMP (8 bytes), puis les données (1 bytes).

Si maintenant on regarde le code des fonctions "decode.h" et "decode.c" définie dans snort, (voir le zip avec les fichiers), on constate :
  1. Lorsque Snort reçoit le paquet ICMP, il appelle d'abord la fonction "DecodeIP" en lui passant comme arguments:
  1. Après plein de tests sur les checksum, fragments, ... il appelle la fonction "DecodeICMP" en lui passant comme args:
  1. DecodeICMP refait des tests sur la longueur du paquet ICMP, checksum, ... Ensuite, il définit la longueur des données comme la taille du paquet ICMP moins la taille du Header, et définit un pointeur vers les données, c'est à dire, le pointeur du paquet ICMP plus la taille du Header.

Ensuite survient le bug, ...


Il teste le type de message, et dans le cas d'un "echo", ou "echo reply", il décale de nouveau le pointeur vers les données 4 bytes plus loin (la structure "idseq" représente la ligne <18h-1Bh> de l'en-tête ci-dessus), et réduit la taille des données de 4 bytes.

Or dans l'exemple précédent, la taille du paquet ICMP etait de 9 bytes ==> si on saute le Header, il reste 1 byte, et si on saute encore 4 bytes, on est hors du buffer ==> Segmentation fault, ou core dumped, ...

En fait, il considère que dans certains cas, les 4 derniers bytes du header ICMP doivent figurer dans les données et dans d'autre cas, comme un "echo", non.

Par exemple, pour le paquet ICMP "Redirect Message", le header est constitué comme suit:

    0                   1                   2                   3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
   |     Type      |     Code      |          Checksum             | 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
   |                 Gateway Internet Address                      | 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
   |      Internet Header + 64 bits of Original Data Datagram      | 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 


Si une attaque était réalisée avec des messages de ce type, il peut effectivement être intéressant d'avoir dans les données le champ "Gateway Internet Address".

Mais pour faire cela, il faut considérer que l'en-tête ICMP fait 4 bytes, (pour prendre en compte les 4 suivants dans les données) et dans le cas d'un "echo", il faut sauter les 4 bytes suivants. Cela revient tout simplement à changer la taille par défaut du Header ICMP à 4 bytes, et c'est bien ce que fait le patch proposé par Martin Roesch et implémenté dans la nouvelle version de Snort.



Suivant: Et la signature fut... Monter: Le Denial of Service Précédent: Résultat de la commande