[security] OIC self-issued mode is insecure
Mike Jones
Michael.Jones at microsoft.com
Mon Mar 3 22:39:23 UTC 2014
OPs would still send "sub", since the pair ("iss", "sub") is the universal account identifier for OpenID Connect. It would just be computed in the specified manner.
-- Mike
-----Original Message-----
From: Manger, James [mailto:James.H.Manger at team.telstra.com]
Sent: Monday, March 03, 2014 2:37 PM
To: Mike Jones; n-sakimura; openid-security at lists.openid.net
Subject: RE: [security] OIC self-issued mode is insecure
An "agreed-upon legal JWK representation" is a reasonable approach for RPs. Putting the JWK member names in alphabetical order would be the best rule, as it is not limited to the 2 current key types. Will this be in addition to self-issued OPs not sending "sub"?
--
James Manger
> -----Original Message-----
> From: openid-security-bounces at lists.openid.net
> [mailto:openid-security- bounces at lists.openid.net] On Behalf Of Mike
> Jones
> Sent: Monday, 3 March 2014 6:34 PM
> To: n-sakimura; openid-security at lists.openid.net
> Subject: Re: [security] OIC self-issued mode is insecure
>
> Rather than using "," as the delimiter, a less arbitrary choice would
> be to use an agreed-upon legal JWK representation of the key as the
> value to be hashed. So, for instance, for an RSA key the "sub" could
> be:
> BASE64URL(SHA-256('{"kty":"' || sub_jwk.kty || '","n":"' ||
> sub_jwk.n || '","e":"' || sub_jwk.e || '"}')) and the "sub" for an EC
> key could be:
> BASE64URL(SHA-256('{"kty":"' || sub_jwk.kty || '","crv":"' ||
> sub_jwk.crv || '","x":"' || sub_jwk.x || '","y":"' || sub_jwk.y ||
> '"}'))
>
> Anyway, Pam's right that we should move discussion of this to the
> working group list so that a decision can be made. I'll send a
> summary there later this morning, or you can do that, Nat.
>
> -- Mike
>
> -----Original Message-----
> From: openid-security-bounces at lists.openid.net
> [mailto:openid-security- bounces at lists.openid.net] On Behalf Of
> n-sakimura
> Sent: Sunday, March 02, 2014 11:02 PM
> To: openid-security at lists.openid.net
> Subject: Re: [security] OIC self-issued mode is insecure
>
> Hi James,
>
> Sorry for a tardy reply. I was travelling back to Tokyo, then got sick
> over the weekend.
>
> Your email reminded me of how it was designed in the beginning.
>
> The sub creation was based on the public keys solely to create
> more-or- less globally unique string which is short enough that would
> not overflow "sub" field prepared for the standard case. The
> authentication was meant to be done by the public key, which is going
> to be stored in the RP.
>
> Then, the statlessness requirment kicked in and ended up with an
> authentication scheme that compares the sub and the public key
> provided.
> (This, by itself, is a bit problematic since we can now not rotate the
> private key, but statelessness took precidence.)
>
> Also, when I first wrote it, it was using PEM for the public key
> format.
> Though it would still have the key rotation problems, it would not
> have the problem you have pointed out. However, it was later swapped to JWK.
> Now, we are having this problem.
>
> For the time being, as you suggested, using public key itself to
> identify the user would be the way to go.
>
> In the mean time, though it is my personal opinion only, an errata
> process should be started.
>
> By the way, is there a particular reason to use "," as the delemiter?
>
> Nat
>
> (2014/02/28 9:50), Manger, James wrote:
> > Nat,
> >
> > An RP looking for self-issued RSA keys where e is not 65537 would be
> a cute way to try to detect attacks exploiting this flaw.
> >
> > It is not a good "work around" to recommend, though. Attacks can
> still slip through. A self-issued OP using a P-256 elliptic curve, for
> instance, will expect a 128-bit security level. However, if an RP uses
> this work around the OP only gets 22-bit security! There is a about a
> 1 in 2^22 chance that an elliptic curve key can look like an RSA key
> with
> e=65537 (ie when the y component ends with ...AQAB). 128-bit to 22-bit
> is a catastrophic security fall.
> > This work around gives self-issued OPs no way to know if an RP is
> safe.
> > This work around will be hard to undo so e=65537 may well be fixed
> forever. That may be mostly harmless, but I am not confident.
> >
> > A better work around is to tell RPs to ignore "sub" (when "iss" is
> "https://self-issued.me") and use "sub_jwk" as the account identifier.
> >
> > For RPs that want still want a "sub" value, you could suggest the
> *RP* changes
> > sub = B64(SHA256(sub_jwk.n + sub_jwk.e))
> > or B64(SHA256(sub_jwk.crv + sub_jwk.x + sub_jwk.y)) To
> > sub = B64(SHA256(sub_jwk.kty + "," + sub_jwk.n + "," sub_jwk.e))
> > or B64(SHA256(sub_jwk.kty + "," + sub_jwk.crv + "," +
> > sub_jwk.x
> > + "," + sub_jwk.y)) Or
> > sub = B64(SHA256(JSON.canonical_stringify(sub_jwk)))
> >
> >
> > I'm not sure there is any reasonable work around for self-issued OPs.
> > Using separate keys for each RP helps a bit.
> >
> > I would recommend self-issued OPs omit "sub" from messages; under
> > the
> assumption (hope) that RP using the flawed spec will reject the login,
> while RPs that have fixed it will accept the message (as they should
> ignore "sub", including ignoring its absence).
> >
> > --
> > James Manger
More information about the security
mailing list