Skip to content

Attaques de confusion entre HS256 et RS256

Comment la confusion d’algorithmes apparaît quand les vérificateurs mélangent les hypothèses symétriques et asymétriques.

Publié le 3 min de lecture

La confusion d’algorithmes dans les JWT paraît très spécialisée jusqu’au jour où l’on trouve un service avec trois bibliothèques d’authentification et un helper partagé nommé verifyToken. L’attaque classique exploite un vérificateur qui accepte HS256 et RS256 tout en utilisant le même matériau de clé dans le mauvais rôle. Si le serveur traite une clé publique RSA comme un secret HMAC, l’attaquant peut signer un faux jeton HS256 avec des données qui n’étaient jamais censées être secrètes.

Pourquoi le bug passe les revues

En revue de code, on voit souvent jwt.verify(token, key) et l’on continue. La décision dangereuse est cachée dans les valeurs par défaut: algorithmes acceptés, sélection de la clé, branchement éventuel sur l’en-tête du jeton. Les équipes copient aussi des extraits entre services. Une chaîne de clé publique sûre dans un vérificateur RS256 devient dangereuse lorsqu’elle est donnée à un vérificateur qui fait confiance à alg dans l’en-tête.

Les attaquants cherchent des endpoints JWKS exposés, des fichiers PEM dans des applications mobiles, des bundles frontend, des exemples de documentation et des messages d’erreur qui trahissent le comportement du vérificateur. Une fois la clé publique obtenue, ils créent un jeton avec alg à HS256, signent le payload en utilisant les octets de cette clé publique comme secret HMAC, puis testent l’acceptation. Le changement de payload reste souvent discret: augmenter scope, changer tenant_id ou mettre admin à true.

Tester sans faire de bruit

Utilise un compte peu privilégié et commence par un endpoint non destructif, comme les métadonnées de profil ou une route de feature flags. Garde iss, aud et exp valides afin qu’un rejet renseigne mieux sur le traitement de signature. Une réponse invalid algorithm est bon signe. Une réponse invalid signature demande plus d’analyse: l’algorithme est-il fixé, ou le format de clé est-il mauvais? Les en-têtes PEM, retours ligne et espaces finaux comptent.

Liste de contrôle défensive

Fixe les algorithmes par émetteur. Ne laisse pas l’en-tête du jeton décider si une clé est symétrique ou asymétrique. Stocke les secrets HMAC et les clés publiques RSA ou EC dans des chemins de configuration séparés, avec des types séparés si le langage le permet. Un vérificateur RS256 doit refuser de démarrer avec un secret HMAC, et un vérificateur HS256 ne doit jamais charger une clé publique depuis JWKS.

La leçon opérationnelle

La correction consiste à séparer clairement les choses. Un émetteur, une famille d’algorithmes attendue, une source de clé, un wrapper de vérification. Pendant une migration de HS256 vers RS256, n’accepte pas les deux algorithmes indéfiniment sur la même audience. Prévois une courte fenêtre, observe l’usage de l’ancien algorithme, puis supprime le fallback.

Articles liés

Une séquence éprouvée pour tester les JWT: collecte, décodage, claims, clés, replay et rapport.
Comment inspecter des problèmes JWT dans logs, tickets, CLI, captures et canaux incident sans propager de bearer tokens.
Guide opérationnel pour les clés de signature JWT: génération, stockage, KMS, rotation, contrôle d’accès, audit et urgence.