Casse-le toi-même
Dans tous les chapitres précédents, tout fonctionnait. Tu appuyais sur un bouton et les maths faisaient ce qu'elles promettaient. Ici, tout est cassé. Quatre énigmes, et dans chacune il y a une erreur que quelqu'un a commise pour de vrai — dans une application, dans une norme wifi, dans la base de données d'un site web. C'est toi l'attaquant maintenant. C'est le jeu, et en même temps la leçon : dans presque chaque fuite qui fait l'actualité, les maths ne sont pas cassées. Elles ont été mal utilisées.
Les mots dont tu as besoin
- Capture the flag (CTF)
- Un concours où tu reçois des énigmes comme celles-ci. On te donne un fichier, un message ou un site web qui cache quelque chose, et tu dois y entrer par toi-même. Partout dans le monde, chaque week-end, gratuitement, et tu n'as besoin de rien savoir faire pour commencer.
- Drapeau (flag)
- Le court bout de texte caché dans une telle énigme, le plus souvent
sous la forme
drapeau{quelque chose}. Si tu trouves le drapeau, tu as prouvé que tu étais entré. Dans l'énigme 1 ci-dessous, il y en a un. - Espace des clés
- Le nombre de clés qui existent. Chez César il y en a 25, chez AES256 il y en a 2256. Si l'espace des clés est assez petit, personne n'a besoin d'être malin : tu les essaies simplement toutes.
- Force brute
- Exactement ça : tout essayer jusqu'à ce que quelque chose sorte. Pas de truc, pas d'intuition, seulement du temps de calcul. C'est l'attaque à laquelle chaque écriture secrète doit résister, et la raison pour laquelle les clés sont si longues.
- Liste de mots
- Un fichier avec les mots de passe que les gens choisissent vraiment,
dans l'ordre de leur fréquence. Les plus grandes qui traînent
librement en comptent des centaines de millions. Un attaquant commence
par là, pas par
aaaa.
Énigme 1 — 25 clés, ce n'est pas une serrure
Quelqu'un a laissé tomber un billet. Il y a des bêtises écrites dessus, mais ce sont des bêtises à la César : chaque lettre décalée d'un nombre fixe de places, comme au chapitre 4. Tu ne connais pas le nombre de places. Ce n'est pas nécessaire non plus.
Casse le César
Tout se passe dans ton navigateur. Rien n'est envoyé au serveur.
- Clique sur Essaie les 25 décalages. La démo décale le texte 25 fois en arrière et met tous les résultats les uns sous les autres.
- Parcours la liste jusqu'à ce que tu voies du français. Note à quel décalage c'était, et lis le drapeau.
- Clique sur Laisse l'ordinateur choisir. Maintenant personne ne lit : la démo compte pour chaque ligne à quel point les lettres se répartissent comme en français et en désigne une elle-même. Regarde si elle choisit la même que toi.
- Chiffre toi-même quelque chose avec. Tape du texte ordinaire dans le champ, clique à nouveau sur les 25 et prends la ligne que tu veux. Un décalage de 7 à l'aller est un décalage de 19 au retour, car ensemble ils font 26.
Ce qui a foiré ici : un espace des clés de 25
César n'a pas de maths faibles. L'addition est parfaitement juste. Il n'y a simplement que 25 clés possibles, et un ordinateur en essaie 25 en moins de temps qu'il ne t'en faut pour les compter. Ça s'appelle la force brute, et ce n'est pas une attaque contre l'écriture secrète mais contre sa taille. AES256, du chapitre 4, fait exactement le même genre de travail que César, avec exactement la même ouverture sur comment il fonctionne — seulement il y a 2256 clés au lieu de 25, et c'est là que la force brute se casse les dents.
Énigme 2 — la base de données du club de sport
Le site d'un club de sport s'est fait pirater. La liste des membres est en ligne : nom et haché du mot de passe, rien de plus. Le club a fait « comme il faut » — il n'y a pas de mots de passe dedans, seulement du SHA-256 du chapitre 2. Quatre membres.
sam:9970626666560a32465d4ce10d28f3233365af833e15eed59884d9477862c379
noor:89ebdcadc16b41410b4a4e9a5e023d2dda67b2cf9a2a75f8c8231140acfe173a
jules:51aa8f7f35a1d0a8da0f6f3479d68363ee8577b64b98760a4da3b175520def29
kaya:5f00fd233b42193e2d9bb6d8b7e6d549d9374fc496c209fa051619896a6b1c05
Lâche une liste de mots sur la fuite
Tout se passe dans ton navigateur. Rien n'est envoyé au serveur. La démo lit les hachés ci-dessus directement sur cette page.
- Clique sur Casse la fuite. La démo hache chaque mot d'une liste de quelques dizaines et compare avec les quatre hachés.
- Regarde combien de millisecondes ça a coûté. Calcule ce que coûterait une liste de cent millions de mots sur une machine mille fois plus rapide que la tienne.
- Un membre y survit. Regarde son haché : il n'y a rien à y voir. Ce qu'il a fait autrement n'est pas dans la base de données mais dans sa tête.
- Casse-le quand même. Son mot de passe est littéralement donné en exemple au chapitre 3. Va le chercher, mets-le dans le champ Mots à toi et clique à nouveau.
Ce qui a foiré ici : un haché sans sel
Le club n'a rien chiffré et tu n'as rien déchiffré. Tu as calculé vers l'avant : pris le haché de chaque mot et regardé s'il était dans la liste. Ça marche parce que la même entrée donne toujours le même haché — et c'est précisément la propriété qui rend un haché utile. Il y a une chose qui casse cette attaque, et c'est le sel : le site ne hache alors pas ton mot de passe mais un bout de texte aléatoire plus ton mot de passe, différent pour chaque membre. Une seule liste ne suffit alors plus ; l'attaquant doit tout recommencer pour chaque membre. Comment ça marche est au chapitre 3.
Ce n'est pas un scénario inventé. En juin 2012, un fichier de LinkedIn contenant 6,5 millions de hachés de mots de passe est apparu sur internet : du SHA-1, sans sel. En quelques jours, la plus grande partie était cassée, exactement de la manière que tu viens d'exécuter toi-même. Plus tard, il est apparu que la fuite était bien plus grande que ces 6,5 millions.
Encore trois mots
- Flux de clé
- La longue traînée de bits d'apparence aléatoire qu'une écriture secrète fabrique à partir de la clé et de l'IV. Ton message y est ajouté avec XOR, et le destinataire en retire la même traînée. Tu l'as déjà vu au bas du chapitre 4.
- Crib
- Un bout de texte dont tu supposes qu'il est dans le message :
Salut,le, le nom du destinataire. Une supposition donc, mais une bonne. Le crib dragging, c'est faire glisser cette supposition sur chaque position du message et regarder où elle colle. - Jeton (token)
- Le petit justificatif qu'un site web laisse dans ton navigateur après que tu t'es connecté. À chaque clic suivant, ton navigateur le renvoie, et c'est à ça que le site reconnaît qui tu es. Il y est écrit qui tu es et ce que tu as le droit de faire.
Énigme 3 — deux messages, un seul flux de clé
Une application de chat chiffre chaque message avec XOR : message ⊕ flux de clé. En soi très bien — c'est comme ça que fonctionne AES aussi. Mais le programmeur a écrit l'IV une seule fois et l'a laissé là. Même clé, même IV, donc à chaque message exactement le même flux de clé. Voici deux messages que l'application a envoyés, en hex comme tu les cueilles sur la ligne :
message 1 : f9299d121657fedbcfb5fb01771a5af0a41d3197c1ab56a703209ff5b289b7f68fa8d6c705a1bc10fad5b4e71c02addb25d755
message 2 : f9299d121657fedbcfb5fb07771a49eda516758094e750e6053082b4a5ccf3f7c6a494da40b2a943fbd5b3b51c02f98b788b07
Regarde le début : f9299d121657fedbcfb5fb y est deux fois.
Vingt-deux caractères hex, onze octets, identiques lettre par lettre. Ça
n'est possible
que si les messages commencent pareil à cet endroit et que le flux
de clé y est le même. Une seule ligne de l'application vient de te le dire.
Fais disparaître le flux de clé
Tout se passe dans ton navigateur. Rien n'est envoyé au serveur. Les deux textes chiffrés sont lus sur cette page ; les textes clairs ne sont nulle part dans le code — ils n'en sortent que si ta supposition est juste.
- Clique sur XOR-les l'un sur l'autre. Comme les deux messages sont chiffrés avec le même flux de clé, ce flux disparaît. Ce qui reste est message 1 ⊕ message 2.
- Compte les zéros du début. Là où deux messages ont le même caractère, XOR donne zéro. Onze zéros veut dire : onze caractères identiques.
- Tape une supposition pour le message 1 et clique sur Mets ma
supposition à côté. Ce que tu récupères est le message 2 — si ta
supposition est juste. Commence par
Salut Sam,et ajoute chaque fois un mot. Si l'autre côté se lit comme du français, tu es sur la bonne voie ; s'il en sort du charabia, tu te trompes. - Coincé ? Clique sur Crib dragging. La démo fait glisser une liste de mots courants sur chaque position du XOR et met en haut ce qui ressemble le plus à du français.
Ce qui a foiré ici : deux fois le même IV
La clé n'a été devinée nulle part et cassée nulle part. Elle a disparu, parce qu'elle a été utilisée deux fois de la même manière. Au chapitre 4 il est écrit que l'IV n'a pas besoin d'être secret, seulement neuf. Voilà pourquoi. Un IV de trop peu et tu n'as plus deux messages chiffrés, mais deux textes clairs posés l'un sur l'autre.
Avec AES-GCM, le mode que ton application de messagerie utilise vraiment, c'est encore pire. Là, réutiliser l'IV ne donne pas seulement ceci : un attaquant peut aussi s'en servir pour imiter le sceau et donc toucher à tes messages sans que ça se voie. Et AES ne te prévient pas. Tout continue d'avoir l'air normal.
En octobre 2017, Mathy Vanhoef et Frank Piessens de la KU Leuven ont montré qu'on peut forcer un appareil wifi à réinstaller sa clé, ce qui fait retomber à zéro le compteur qui fournit l'IV et recommencer le même flux de clé. Cette attaque s'appelle KRACK, et elle fonctionnait contre WPA2 — le protocole de sécurité de à peu près chaque réseau wifi au monde à ce moment-là. Le titre de leur article dit exactement de quoi il s'agit : Forcing Nonce Reuse in WPA2.
Énigme 4 — la signature que personne ne contrôle
Une plateforme scolaire te donne un jeton quand tu te connectes. Il y est
écrit qui tu es et quel rôle tu as : élève ou
administrateur. Le serveur signe ce jeton avec sa
clé privée, comme au chapitre 7.1, pour que personne ne
puisse le falsifier. Les maths sont justes, la paire de clés est réelle, la
signature est réelle. Il n'y a qu'un seul problème : le serveur ne la regarde
pas.
Deviens administrateur
Tout se passe dans ton navigateur. Rien n'est envoyé au serveur. La paire de clés est refaite à chaque clic et disparaît quand tu fermes l'onglet.
- Clique sur Connecte-toi comme élève. La démo fabrique une paire de clés (ECDSA sur P-256, la courbe du chapitre 6.2) et signe un jeton. Il apparaît dans le champ : trois morceaux en base64url, séparés par des points. Tu connais ça du chapitre 1.
- Clique sur Contrôle comme il faut. La clé publique dit : en ordre, ça vient du serveur.
- Clique sur Trafique : fais de moi un administrateur. Le
morceau du milieu est modifié et l'en-tête reçoit
alg: none— « il n'y a pas de signature ». Le troisième morceau est vidé. - Clique sur Contrôle comme le serveur troué. Tu es entré comme administrateur.
- Clique à nouveau sur Contrôle comme il faut. Refusé. Même jeton, mêmes maths, autre réponse — la différence est entièrement dans ce que le serveur fait de ce qu'il reçoit.
Ce qui a foiré ici : alg: none
Une signature que tu ne contrôles pas n'est pas une signature mais une décoration. Pire encore : ce serveur laisse l'attaquant écrire lui-même dans l'en-tête du jeton comment il faut contrôler, et y accepte la réponse « pas du tout ». C'est accrocher son trousseau de clés à la poignée de la porte avec un mot dessus.
Le 31 mars 2015, Tim McLean a publié qu'une série entière de bibliothèques
très utilisées pour ce genre de jetons faisait exactement ça : laisser passer
alg: none comme choix valable. Au
chapitre 6 il est expliqué pourquoi c'est si douloureux —
tout l'intérêt d'une clé publique est que tout le monde peut
contrôler. Ici, tout le monde aurait pu, et personne ne l'a fait.
Voici les maths : pourquoi utiliser une clé deux fois démolit tout
Prends l'énigme 3 en symboles. Le message a et le message b passent tous les deux par le même flux de clé k :
c1 = a ⊕ k
c2 = b ⊕ k
c1 ⊕ c2 = (a ⊕ k) ⊕ (b ⊕ k) = a ⊕ b
Cette dernière ligne, c'est toute l'énigme. XOR, tu peux le faire dans n'importe quel ordre, et k ⊕ k = 0 — c'est la règle du chapitre 4, appliquée deux fois ici. La clé disparaît. Ce qui reste ne contient plus un seul bit de secret : ce sont deux messages qui se recouvrent, et le français recouvre mal le français.
Le plus fou, c'est que XOR avec un flux de clé est mathématiquement parfait tant que tu ne l'utilises qu'une fois. Claude Shannon l'a prouvé en 1949 : si la clé est aussi longue que le message, vraiment aléatoire et à usage unique, alors il n'y a rien à tirer du texte chiffré. Pas « difficile » — rien. Ça s'appelle un masque jetable (one-time pad), et c'est la seule écriture secrète dont on ait prouvé qu'elle est incassable. Le mot one-time fait déjà tout le travail.
Ce n'est pas resté de la théorie. En 1942, l'imprimerie soviétique, sous la pression de la guerre, a fabriqué quelque 35 000 pages doubles de tels carnets de clés. Des casseurs de codes américains l'ont remarqué et ont pu lire des messages pendant des années — le projet VENONA, qui a eu sa première percée le 20 décembre 1946. Sur des centaines de milliers de messages interceptés, moins de 3 000 ont été lus en tout ou en partie, et ça a suffi à mettre au jour des réseaux d'espionnage. Une page réutilisée à la fois.
Ceci est la théorie de l'information : la discipline qui mesure combien d'information il y a vraiment dans un message, fondée elle aussi par Shannon. Elle explique pourquoi a ⊕ b se laisse lire et a ⊕ k non — pas parce que l'une des sommes est plus difficile, mais parce qu'un texte français est prévisible et que le hasard ne l'est pas.
Où ça s'arrête. Ce que tu as fait ici, tu le fais sur tes propres affaires ou dans un environnement fait pour ça. Ces environnements existent : les concours CTF dont parle À propos de ce site sont exactement ceci, mais alors pendant tout un week-end et avec des centaines d'autres. Sur un système qui n'est pas le tien, c'est punissable — en Belgique l'article 550bis du Code pénal, introduit par la loi du 28 novembre 2000. Tu n'as besoin de rien casser ni de rien voler : s'introduire là où tu n'as pas le droit suffit. La différence entre les deux n'est pas une question de capacité, mais de permission.