[Abstract] [Copyright Notice]

Firewalling sous Linux - Chapitre 3
Les différents types d'attaques


Partant du principe qu'il est préférable de savoir à quoi l'on s'expose pour se protéger efficacement, ce chapitre détaille de façon succinte les différents types d'attaques usuelles.


3.1 Le spoofing

Tout d'abord, nous allons parler du concept de spoofing. Il est très facile de créer un paquet IP avec une adresse source fictive. Lorsque le destinataire du paquet reçoit ce dernier, il est alors dans l'incapacité de reconnaître la source réelle du paquet. Ceci permet à un éventuel attaquant de masquer sa véritable identité en usurpant celle d'une autre machine. Notamment, l'attaquant peut par ce biais se faire passer pour une machine disposant d'un accès privilégié auprès d'un serveur.

Cette ruse est quasi-systématiquement utilisée par les pirates consciencieux.


3.2 Le déni de service (denial of service, ou DoS en anglais)

Il s'agit d'une attaque par envoi massif de paquets, quelle que soit leur nature, qui finissent rapidement par saturer le réseau, ou plus ou moins directement les capacités de traitement d'une ou plusieurs machines, que ce soit en monopolisant le temps CPU, ou la mémoire de ces dernières.

Les récentes attaques médiatisées, car bon nombre d'attaques ne sont jamais avouées par leurs victimes par peur du discrédit, sont le fait de pirates ayant utilisé le déni de service distribué. A savoir que le fait de coordonner les efforts à plusieurs rend l'attaque plus efficace :


3.3 Les vulnérabilités du protocole IP


3.3.1 Fragments : Le "Ping de la mort" ("Ping of Death" en anglais)

C'est l'une des attaques basées sur IP les plus courantes. Il s'agit d'un paquet de taille supérieure à la longueur maximum autorisée d'un paquet IP. Le moyen le plus accessible permettant de forger un tel paquet est d'utiliser la commande ping, au moyen de la laquelle on peut notamment spécifier la taille du paquet envoyé.

En fait, lorsqu'un paquet IP est trop long pour pouvoir passer tel quel par un réseau où la taille maximum de l'unité de transmission (Ethernet, par exemple), celui-ci est segmenté en deux ou plusieurs fragments qui satisferont cette condition.

L'en-tête d'un paquet IP non segmenté contient la longueur du paquet, mais l'en-tête d'un paquet fragmenté contient la longueur du fragment. Il n'est donc possible de déterminer la longueur totale du paquet qu'après avoir reçu l'ensemble des paquets.

Certaines piles IP, mal conçues, ne prennent pas en compte le fait qu'un paquet fragmenté puisse s'avérer être de longueur totale supérieure à la taille légale une fois réassemblé. Bien sûr, cela ne devrait pas arriver, mais si ce cas n'est pas pris en compte, la partie en trop peut déborder de l'espace mémoire prévu et corrompre ainsi le code du noyau, provoquant une instabilité du système.

Il est intéressant de noter que les problèmes ne se produisent qu'au moment de réassembler le paquet. Ainsi, l'attaque peut très bien traverser un firewall, les différents fragments étant individuellement parfaitement valides. Voilà l'une des raisons pour lesquelles il est grandement préconisé de réassembler les fragments de paquets au niveau du firewall, ce qui permet de protéger en un seul point un réseau de machines pouvant potentiellement être affectées.

Bien entendu, la parade la plus efficace est d'utiliser un système résistant à ce type de problèmes. Bien sûr, les dernières versions des noyaux Linux sont immunisées.


3.3.2 Teardrop

Cette attaque est assez similaire à celle du Ping of Death. Dans ce cas de figure, les paquets fragmentés se chevauchent au lieu de se réassembler bout-à-bout. Imaginons un premier fragment commençant à l'octet 0 et d'une taille de 20 octets, puis un second fragment, commençant à l'octet 5 et d'une longueur de 10 octets. Les deux fragments se chevauchent, et le noyau se retrouve dans une situation à laquelle il n'est pas forcément préparé.

Les systèmes dont les piles IP ne sont pas suffisamment robustes ne manquent pas d'être corrompus.


3.3.3 Source routing

La stratégie d'attaque des pirates consiste le plus souvent à infecter plusieurs machines servant tour à tour de relai pour l'attaque ultime. Il leur est ainsi bien plus facile de dissimuler la provenance exacte de l'attaque, car remonter les traces jusqu'au point de départ est particulièrement fastidieux, si ce n'est quasi-impossible dans bien des cas.

Un moyen complémentaire utilisé par les pirates pour brouiller les cartes un peu plus encore est d'utiliser une des fonctionnalités offertes par le protocole IP : il s'agit du routage source ("source routing" en anglais). Cette option permet de spécifier le chemin que doit emprunter un paquet pour parvenir à sa destination finale.

Dans ce cadre, il existe deux types de routage : le routage "loose", et le routage "strict". Le premier permet de spécifier un certain nombre de machines par lesquelles le paquet doit passer, même s'il peut entre-temps en passer par d'autres. Quant au second, le routage strict, il impose une route bien précise au paquet.

Ainsi, il devient possible de faire croire que l'attaque provient de l'une de vos machines, par exemple, ou encore de changer l'identité de la source des paquets à loisir.

Fort heureusement, le "source routing" n'est que très peu utilisé en général. Il est donc recommandé de bloquer les paquets présentant cette option au niveau du firewall.


3.4 Les vulnérabilités du protocole TCP

Le protocole TCP est construit au-dessus du protocole IP, dans lequel il est encapsulé. C'est un protocole bien plus robuste, dans le sens où il assure que les données envoyées seront reçues, et qu'elles arriveront dans le bon ordre, autant de choses qui ne sont pas forcément garanties avec des protocoles tels qu'IP et UDP.

Ce protocole introduit la notion de connexion sur un port. C'est donc un protocole en mode connecté, le client et le serveur négociant celle-ci par une suite de demande de connexion et d'aller-retour d'acquittements.

Pour ce faire, les paquets TCP différents drapeaux permettant de changer l'état de la connexion.

Au besoin, les paquets non reçus par la machine distante (non acquittés) sont retransmis pour éviter toute perte.


3.4.1 Spoofing

L'une des attaques TCP les plus simples consiste à forger un paquet TCP dont l'adresse IP source et destination sont identiques, ainsi que les ports source et destination. L'adresse doit être celle de la machine cible, et le numéro de port celui d'un service actif tournant sur cette machine. Pour cela, on doit bien sûr "spoofer" le paquet en forgeant artificiellement son adresse source.

Sans trop rentrer dans le détail, le mécanisme d'acquittement du protocole TCP veut que la réception d'un acquittement ne correspondant pas à celui qui est attendu entraîne une nouvelle demande d'acquittement. Cette attaque a pour effet de provoquer de mauvais acquittements et donc d'entraîner une boucle infinie d'envoi continuel d'acquittements et de nouvelles demandes d'acquittement. Ce traitement étant d'assez haute priorité, il ne manque pas de consommer beaucoup de ressources, et occasionne bien souvent un ralentissement conséquent, voir le gel de la machine.

La seule est d'utiliser un système possédant une pile réseau immunisée contre ce genre de choses. C'est bien sûr le cas de celle de Linux.


3.4.2 Numéros de séquence

Les numéros de séquence utilisés par TCP réduisent la probabilité d'intrusion pendant un échange, mais les machines peuvent néanmoins être abusées. Ainsi, si le pirate envoie un paquet de reset de la connexion (RST) au serveur après le second acquittement, avec le numéro de séquence adéquat et la bonne adresse source (spoofing de l'adresse IP du client), bien sûr, on se retrouve alors dans un état où le serveur croit que le client a annulé la demande de connexion en cours, et où le client croit être connecté.

Ils sont donc dans un état de désynchronisation mutuelle. Dès lors, le pirate :


3.4.3 Fragments


3.4.4 Drapeaux hors spécification

Certaines piles réseau ne sont pas préparées à recevoir des paquets ayant des drapeaux actifs ne correspondant pas à la norme, dans le sens où ils interviennent à des moments inopportuns lors du dialogue client/serveur, ou encore des drapeaux n'existant pas (valeur hors spécification).


3.5 Les vulnérabilités du protocole UDP

UDP est un protocole bâti au-dessus d'IP, tout comme TCP. Cependant, il ne fonctionne pas en mode connecté. Il ne garantit nullement que les paquets expédiés arriveront dans le même ordre, ni même s'ils arriveront.

En revanche, l'avantage d'UDP sur TCP est qu'il reproduit la notion de ports, et donc de services associés, tout en s'affranchissant d'un certain nombre de lourdeurs de ce dernier. "Lourdeurs" indispensables pour garantir la fiabilité de TCP, mais qui induisent un coût (en terme de charge de réseau et de traitement) prohibitif pour certaines applications nécessitant des taux de transferts aussi élevés que possible (transmission d'images vidéo en temps-réel, etc.).


3.5.1 Fraggle (Déni de service)

Outre des attaques comme Teardrop, déjà décrites plus haut, il existe des attaques de type déni de service, comme par exemple Fraggle. Ceci correspond à des envois massifs de broadcast (envoi destiné à toutes les machines du réseau). Bien sûr, cela a déjà pour effet de saturer le réseau, mais il est encore plus intéressant, s'il on peut dire, de choisir un port UDP intéressant :


[Abstract] [Copyright Notice]

Firewalling sous Linux
Hervé Eychenne herve.eychenne@alcove.fr