[SECURITY] Algorithm Confusion Through kid Header
paragonie-security opened this issue · 1 comments
Your JWS implementation correctly rejects invalid algorithms.
Line 25 in a2b4c15
However, when a kid
header is present, it fetches the key after this algorithm check.
Lines 124 to 140 in a2b4c15
Lines 24 to 35 in a2b4c15
When JWKs are used, this algorithm check isn't congruently applied to the keys.
Lines 40 to 51 in a2b4c15
Therefore, if someone initializes a JWK or JWK::Set with different algorithm types, it's possible to swap the alg
header and get the wrong key for a given algorithm. In extreme cases, this can lead to a cryptographic integrity bypass (reminiscent of the HS256/RS256 issue from years ago).
This is identical to the problem in firebase/php-jwt#351 https://seclists.org/fulldisclosure/2021/Aug/14
To fix this issue: Keys MUST be stored, in memory, as both the raw key bytes and the specific algorithm the key is expected to be used with. After fetching a key, this algorithm MUST be validated against the algorithms
array.
Note: This particular sharp edge isn't covered by the JWT Best Practices RFC.