SYN cookie

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Les SYN cookies (syncookies) sont des valeurs particulières des numéros de séquences initiales générés par un serveur (ISN: Initial Sequence Number) lors d'une demande de connexion TCP. La technique mise en œuvre permet notamment de se défendre contre les attaques par inondation de requêtes SYN et accessoirement par IP spoofing.

Principe[modifier | modifier le code]

Une demande de session TCP se fait en trois étapes:

  • le client envoie au serveur un paquet SYN avec un numéro de séquence initial N_{client}\, et un numéro d'acquittement nul
  • le serveur place alors cette requête dans sa file d'attente de connexion et renvoie au client un paquet SYN|ACK de numéro de séquence N_{serveur}\, et un numéro d'acquittement égal à N_{client}+1\,
  • le client répond par un paquet ACK de numéro de séquence N_{client}+1\, et un numéro d'acquittement N_{serveur}+1\,

La connexion est alors établie et le client et le serveur peuvent commencer à échanger des données.

               client                                serveur
                 | flags: SYN=1,ACK=0    SN:56          |
                 |----------------->>-------------------|
                 | flags: SYN=1,ACK=1    SN:90 ACK:57   | création d'un contexte          
                 |-------------------<<-----------------|
                 | flags: SYN=0,ACK=1    SN:57 ACK:91   |
                 |-------------------->>----------------|
                 |                                      | connexion établie
                 |                                      |

Même si la procédure de connexion n'est pas encore terminée, le serveur a quand même alloué une ressource pour enregistrer la demande de session du client. Cette propriété est justement exploitée dans les attaques par SYN flooding. En utilisant un SYN cookie, le serveur va se servir du réseau comme zone mémoire. Au lieu de créer directement un contexte localement, il va envoyer au client les informations dont il a besoin pour établir la connexion. Le client les lui retournera, puis il vérifiera si le numéro d'acquittement du paquet envoyé par le client passe un test de sécurité spécifique pour créer enfin un contexte et établir la connexion. La procédure de demande de session se passe alors comme suit.

               client                    serveur
                 |       SYN:56 ACK:0       |
                 |------------->>-----------|
                 |   SYN:syncookie ACK:57   |          
                 |------------<<------------|
                 |   SYN:57 ACK:syncookie+1 |
                 |------------>>------------|
                 |                          |création d'un contexte
                 |                          |connexion établie   

Valeur de syncookie[modifier | modifier le code]

Étant donné que le champ d'acquittement ne contient que 32 bits[1], les informations envoyées au client sont restreintes, les informations conseillées sont les suivantes[2] :

  • les cinq premiers bits contiennent la valeur modulo 32 d'un compteur incrémenté toutes les 64 secondes. Ce champ permet de garantir que la valeur contenue dans le champ SYN sera croissante
  • les trois bits suivant contiennent la valeur codée du MSS[3] négocié (aucun contexte n'a été créé chez le serveur donc le réseau est utilisé pour stocker cette valeur)
  • les 24 derniers bits contiennent la valeur d'une fonction gardée secrète par le serveur et qui prend en compte les adresses des deux sites, les numéros de ports utilisés et la valeur du compteur de temps précédent. Ce champ est donc une sorte de signature cryptographique qui permet d'authentifier chaque demande de connexion.

Inconvénients[modifier | modifier le code]

L'utilisation des syncookies présente quelques désavantages. En effet, comme les options de TCP ne sont pas sauvegardées lors de la demande de connexion, certaines ne seront pas prises en compte. Par exemple, dans l'exemple ci-dessus, la taille de la fenêtre d'émission et le temps de temporisation ne sont pas traités. Ce qui peut entraîner un faible rendement du réseau.

D'un autre côté, les administrateurs soucieux de la sécurité de leur réseau doivent tenir compte de quelques risques qui peuvent subvenir. Étant donné que l'authentification de la connexion est basée uniquement sur la valeur du champ d'acquittement du paquet ACK envoyé par le client, si un attaquant arrive à deviner le protocole d'authentification utilisé par le serveur, il peut se faire passer pour n'importe qui. De plus il peut également inonder de paquets ACK le serveur pour tenter de créer une connexion. Et enfin, un serveur utilisant des syncookies ne pourra pas effectuer un filtrage de paquets ACK, ce qui peut permettre éventuellement à un attaquant de passer à travers un pare-feu qui filtre les paquets SYN de demande de connexion.

Paramétrage sous Linux[modifier | modifier le code]

Sous linux, le paramétrage de ce mécanisme de protection est fait par le paramètre tcp_syncookies du fichier sysctl.conf.

Notes[modifier | modifier le code]

  1. Voir le format d'un paquet TCP.
  2. (en) référence
  3. Maximum Segment Size : taille maximale des données que peut contenir un paquet TCP

Articles connexes[modifier | modifier le code]

Lien externe[modifier | modifier le code]