Cette attaque consiste à amener une application à accepter un message frauduleux en le signant au moyen d’un algorithme symétrique alors que l’application s’attend à recevoir un message signé avec un algorithme de signature asymétrique.
Nous allons illustrer cette situation avec les algorithmes de signature HS256 et RS256.
HS256 est un algorithme symétrique qui utilise un même secret pour à la fois signer les messages et valider la signature des messages. Celui qui signe et celui qui vérifie la signature utilisent le même secret.
RS256 est un algorithme asymétrique qui utilise une clé privée pour signer les messages, et la clé publique correspondante pour valider la signature des messages. Celui qui signe le fait avec la clé privée, celui qui vérifie la signature le fait avec la clé publique. La clé privée est connu uniquement par celui qui signe, tandis que la clé publique est connu de tous.
Déroulement de l’attaque avec des jetons JWT
Une application est protégée avec des jetons JWT. Pour valider la signature du jeton, elle se base sur une clé publique ainsi que l’algorithme de signature contenu dans l’entête du jeton, par exemple RS256.
Un attaquant génère un jeton, utilise HS256 comme algorithme, la clé publique comme secret et signe le jeton. Il inclut cet algorithme dans l’entête du jeton, puis utilise ce jeton pour contacter l’application.
L’application reçoit le jeton, le jeton, récupère l’algorithme HS256 de l’entête, et utilise sa clé publique comme secret pour vérifier la signature. De ce fait, la signature du jeton sera considérée comme vérifiée, et le jeton comme valide. L’attaque aura réussie.
Comment se protéger de ce type d’attaque
Les mesures suivantes permettent de se prémunir de ce type d’attaque:
- Attribuer un identifiant unique à chaque paire de clé publique/privée qui sert à signer les jetons JWT.
- Dans l’entête de chaque jeton, inclure cet identifiant en plus de l’algorithme de signature
- Faire en sorte que l’application récupère la liste des associations ( identifiant de la paire de clés + d’algorithme de signature) auprès d’un tiers de confiance, par exemple un serveur d’autorisation tel que Keycloak.
- A la réception d’un jeton, l’application vérifie que le couple (identifiant de la paire de clés + algorithme de signature) contenu dans l’entête correspond à ce qu’elle à récupéré auprès du tiers de confiance.
Conclusion
La sécurité, c’est complexe, chronophage, et les possibilités de se tromper sont nombreuses.
Il est recommandé d’utiliser des solutions testées et éprouvées pour sécuriser vos applications. Ne construisez pas vous même votre propre solution de sécurité.
Utilisez un serveur d’autorisation tel que Keycloak comme tiers de confiance, utilisez des librairies open source pour vérifier la signature des jetons JWT.
Ne réinventez pas la roue, au risque de vous retrouver avec des trous dans la raquette.
