Résumé

  • RFC 1948 décrivait un intrus qui observait un vrai numéro initial TCP, usurpait l’adresse d’un hôte jugé fiable et devinait le prochain numéro du serveur pour achever une poignée de main dont la réponse lui échappait.
  • Sa réponse gardait la progression temporelle M pour les réouvertures d’une même connexion, mais ajoutait un décalage secret F propre à chaque quadruplet de deux adresses et deux ports. Un numéro vu à une porte renseignait bien moins sur la suivante.

Le voleur commençait par une démarche banale : ouvrir sa propre connexion TCP et noter le premier numéro envoyé par le serveur. Le RFC 1948 de mai 1996 montrait comment ce nombre pouvait aider à prévoir celui d’une seconde connexion. L’intrus empruntait alors l’adresse IP d’une machine à laquelle le serveur faisait confiance. La réponse du serveur partait vers la véritable machine, hors de la vue de l’intrus. Si celui-ci devinait le nombre attendu et réduisait l’autre machine au silence, il pouvait envoyer lui-même l’acquittement final. Un service de commande fondé sur la confiance accordée à l’adresse risquait de le recevoir comme un vieil ami.

La faille tenait au lien entre deux conversations. La première, légitime, révélait un numéro de séquence initial, ou ISN. Sur les noyaux issus de Berkeley décrits par le RFC, ce numéro augmentait par étapes prévisibles avec le temps et avec chaque nouvelle connexion. Pour la conversation usurpée, il suffisait de déduire le nombre suivant. L’attaquant n’avait alors même pas besoin de voir la réponse adressée à la machine qu’il imitait. Le guichet distribuait des tickets dans un ordre lisible depuis la rue.

Pourquoi ne pas choisir chaque ticket au hasard ? Le RFC 793 original de TCP faisait avancer une horloge de numérotation afin que les paquets restés d’une ancienne incarnation d’une connexion ne paraissent pas neufs quand elle s’ouvrait de nouveau. RFC 1948 relevait aussi les règles de TIME-WAIT dans les systèmes dérivés de BSD. Deux conversations différentes avaient besoin de départs indépendants; les incarnations successives d’une même conversation avaient besoin de progresser. Jeter un dé à chaque ouverture réglait une menace en réveillant l’autre.

Le RFC 1948 sépara les deux mouvements. Une connexion TCP porte l’identité de quatre valeurs : adresse IP et port locaux, adresse IP et port distants. Sa proposition calculait le numéro initial comme M + F(quadruplet). M venait d’une horloge qui avance. F était un décalage tiré de l’identité de cette connexion et d’un secret. Chaque quadruplet obtenait sa propre piste de numéros; le même quadruplet, réutilisé plus tard, suivait encore l’avancée de M. Voir un ticket sur une piste ne révélait pas le début de la piste voisine.

Le secret comptait autant que la formule. RFC 1948 proposait de calculer F avec une fonction de hachage cryptographique appliquée au quadruplet et à une matière secrète; MD5 y figurait comme exemple disponible à l’époque. Il discutait d’aléa matériel, de secret propre à la machine, de son heure de démarrage et de son identité. Une fonction prévisible aurait rendu au voleur son plan des guichets. Le calcul évitait aussi de garder indéfiniment des fiches sur toutes les connexions closes.

Changer le secret créait pourtant une dette. Pour un quadruplet rouvert, le nouveau F déplaçait la piste alors que de vieux paquets pouvaient encore circuler. RFC 1948 demandait donc, pour un changement sur une machine active, de conserver l’état des connexions mortes ou d’observer deux durées maximales de vie d’un segment sans trafic. La clé cachait les rapports entre pistes; sa rotation devait respecter l’espacement temporel qui protégeait chacune d’elles. Une serrure neuve ne dispense pas de vérifier ce qui traîne dans l’embrasure.

Le RFC 6528 de 2012 a porté l’idée au rang de norme, remplacé RFC 1948 et actualisé RFC 793. Il précise la fonction pseudoaléatoire, le quadruplet, la clé secrète et les conditions de rotation, tout en conservant la structure M + F. Le principe de 1996 a tenu : l’horloge fait avancer chaque identité de connexion; le secret empêche un observateur de calculer le départ d’une autre identité.

Le premier ticket pouvait encore être lu. RFC 1948 a retiré la carte qui conduisait de ce ticket au suivant. Le voleur connaissait un guichet; les autres commençaient ailleurs, derrière le comptoir.