-
Notifications
You must be signed in to change notification settings - Fork 43
Description
Issue
Inbound thread from Nightwatch Cybersecurity Research
Nightwatch Cybersecurity Research <research@....>
It looks like the "x5c" field is not being used, while the RFC
dictates that "x5c" needs to verify the raw key materials:
https://tools.ietf.org/html/rfc7517#section-4.7
Nightwatch Cybersecurity Research <research@....>
Hi,If the JWKS endpoint is compromised or the JWKS data is modified while
in transit by an MITM attacker (when the URL is non-HTTPS). Such an
attacker can choose to modify the public key information only and
leave the certificate alone, so an application verifying the
certificate will miss the fact that the public key doesn't match.There is some discussion on the IETF list ot this affect:
https://mailarchive.ietf.org/arch/msg/jose/f_jo8sfQN6TqzkpmzgzzMb3_kEw/Thanks
Solution
Add the x5c to the JSON Web Key when parsing a certificate, and when extracting a public key from a JSON Web key, attempt to verify the public key against the x5c if possible.
Solution notes
From what I can gather, a consumer of the JWKs may just use the certificate directly if available in the x5c parameter and not trust or parse the public key components.
However, if we also verify the response has not been modified by verifying the key components such as e
, and n
for RSA keys, or the x
and y
coordinates for an EC key, we should be able to detect when the public key represented by the JSON Web key does not match the x5c
parameter.
With all that said, it seems to me if you are concerned about the thread of MITM when consuming JWKS, you should only accept JWKS from a TLS endpoint which has HSTS enabled. Or, only accept a JWK if it is published with the x5c and ignore the public key components in the JWK response.
If you were to be accepting a JSON Web Key from an endpoint that had been compromised by a MITM, it would seem to me the easier way to mess with someone is to remove the x5c
parameter AND modify the public key components so it could not be verified. I do not know why you'd modify the public key components and NOT remove the x5c
.
In any case, it doesn't hurt to perform some additional validation against the JSON Web Key to ensure the public key components match up with the certificate if found in the x5c
parameter if we think it may help security some fashion.