ChaCha20-Poly1305 est un chiffrement authentifié : ChaCha20 chiffre, Poly1305 produit une étiquette qui prouve que le chiffré n’a pas été touché. Retirez l’étiquette et il vous reste un chiffrement qui cache les données et ne garantit rien à leur sujet.
Ce qui s’est passé
L’algorithme expérimental de chiffrement de clé Chacha20Poly1305 engendrait correctement son étiquette Poly1305 de seize octets, puis la jetait. Rien ne la transportait, donc rien ne la vérifiait au retour.
La construction était silencieusement dégradée en ChaCha20 non authentifié. Une clé chiffrée altérée était acceptée sans un murmure.
Pourquoi cette classe de bogue est vicieuse
Tout fonctionne. Les jetons se chiffrent, les jetons se déchiffrent, les tests passent, les allers-retours réussissent. La propriété manquante n’apparaît que quand quelqu’un vous attaque, et le code porte le nom d’un chiffrement authentifié de bout en bout.
Un test qui chiffre puis déchiffre ne l’attrapera jamais. Le test qui l’attrape retourne un bit du chiffré et affirme que le déchiffrement échoue. S’il réussit, l’authentification n’est pas là, quel que soit le nom de la classe.
Le correctif, et un mot sur « expérimental »
L’étiquette est désormais émise et vérifiée. Corrigé en 3.4.10, 4.0.7 et 4.1.7.
Cet algorithme vit dans web-token/jwt-experimental, un paquet dont tout l’objet est de contenir ce qui n’est pas assez stable pour la production, et qui le dit. Cet avertissement n’est pas décoratif. Si un algorithme expérimental a atteint votre configuration de production, voici le rappel qu’il faut aller y regarder.