3 Vulnérabilités des jetons JWT

Publié par Saïd le 28 décembre 2022

Les jetons Web JSON (JWT) permettent d'échanger des données à l'aide d'objets JSON. Ils sont souvent utilisés dans le cadre de l'autorisation car ils peuvent être signés, vérifiés et donc fiables - mais seulement s'ils sont mis en œuvre correctement. Voici une analyse technique approfondie des vulnérabilités des jetons JWT.

Structure d'un jeton JWT

A titre de rappel, un jeton JWT se compose de 3 parties distinctes :

  • un header,
  • un payload,
  • une signature

Ces trois parties sont séparés par un point, ce qui donne comme exemple de token :

  PRE[header.payload.signature]
  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Le header contient des métadonnées sur le jeton, comme l'algorithme utilisé pour la signature et le type de jeton (par défaut JWT).

  {
    "alg": "HS256",
    "typ": "JWT"
  }

La seconde partie - le payload - est la partie la plus intéressante. C'est celle où vos données vont être stockés. On y stocke très souvent un object de type JSON. Faites attention à ne jamais y stocker d'informations sensibles (tel qu'un mot de passe), car comme nous allons le voir, vos données peuvent être compromises.

  {
    "name": "John Doe",
  }

Et enfin, la troisième et dernière partie, la signature. Pour la générer, il faudra utiliser l'algorithme Base64 (URL), et appliquer cet algorithme au header et au payload. Ensuite, il s'agira de hasher le tout avec soit un secret, soit une clé privée. Le choix dépend de vous et du niveau de sécurité dont vous avez besoin.

  fSppjHFaqlNcpK1Q8VudRD84YIuhqFfA67XkLam0_aY

Vulnérabilités courantes des JWT

Voici quelques vulnérabilités typiques qui peuvent être introduites en travaillant avec les JWT.

1. Ne pas vérifier la signature

La majorité des bibliothèques JWT proposent :

  • une fonction pour décoder le jeton,
  • une autre fonction pour vérifier l'intégrité du jeton

Cela peut porter à confusion dans la mesure où certains développeurs vont peut-être se dire que décoder le jeton est suffisant. D'autres peuvent également désactiver la vérification de la signature en environnment de test et de développement, et oublier de la réactiver sur l'environnement de production. De telles erreurs peuvent conduire à un accès arbitraire à un compte ou à une élévation de privilèges.

2. Autoriser l'algorithme 'None'

La forme JWT accepte de nombreux types d'algorithmes différents pour la génération d'une signature. Parmi les plus populaires, on retrouve :

  • HMAC (chiffrement symétrique)
  • RSA (chiffrement asymétrique)
  • Aucun (et oui !)

L'algorithme `None` spécifie tout simplement que le jeton n'est pas signé. Si cet algorithme est autorisé, il est alors tout à faire possible de contourner la vérification de la signature en transformant un algorithme existant en `None` et en supprimant la signature.

C'est pourquoi il est très important de ne jamais accepter les jetons avec None, none, NONE, nOnE, ou toute autre variation de casse dans l'en-tête alg de votre jeton.

3. Utiliser une clé de chiffrement trop simple

Avec le chiffrment symétrique, votre signature n'est aussi forte que le secret utilisé. Si vous utilisez une clé secrète trop simple, n'importe qui peut alors deviner votre clé en utilisant la technique de brute-force.

Pour éviter cette vulnérabilité, prenez l'habitude de toujours utiliser des secrets compliqués à deviner, qui ne sont pas des mots présents dans le dictionnaire. C'est le même principe que vous appliquez déjà sur vos mots de passes.

Sources :

Sommaire

Sécurisons votre app ensemble !