Subject: [OAUTH-WG] Token scanning attacks in RFC 7662

From: Neil Madden <[email-masked]>
Date: Tue, 2 Jan 2018 12:42:46 +0000

Greetings, and Happy New Year!

I was just re-reading the OAuth 2.0 token introspection RFC 7662, and I am a bit confused by the rationale for requiring client (RS) authentication when making calls to this endpoint. The stated rationale in Section 2.1 (https://tools.ietf.org/html/rfc7662#page-5) is:

  “To prevent token scanning attacks, the endpoint MUST also require
   some form of authorization to access this endpoint, such as client
   authentication as described in OAuth 2.0 [RFC6749] or a separate
   OAuth 2.0 access token such as the bearer token described in OAuth
   2.0 Bearer Token Usage [RFC6750].”

This rationale is elaborated in the Security Considerations:

  "If left unprotected and un-throttled, the introspection endpoint
   could present a means for an attacker to poll a series of possible
   token values, fishing for a valid token.  To prevent this, the
   authorization server MUST require authentication of protected
   resources that need to access the introspection endpoint and SHOULD
   require protected resources to be specifically authorized to call the
   introspection endpoint.”

However, RFC 6749 already requires that access tokens be unguessable with a probability of successful guesses being at most 2^(-128) [https://tools.ietf.org/html/rfc6749#section-10.10]. Assuming that this means something like: if an attacker makes 2^n guesses then they have a maximum chance of guessing a particular access token of at most 2^(n-128), then I think the token scanning attacks are already taken care of aren’t they? It is not feasible for an attacker to make that many queries. Even if you consider that the attacker only needs to guess one out of the set of all valid access tokens, then I still don’t think this attack is feasible in any realistic time-frame, especially if you follow the “SHOULD" recommendation to require at most 2^(-160) probability.

Is there some other threat model being considered here? Timing side-channels maybe?

Also, I cannot find a justification in the RFC for how this threat is mitigated by requiring authentication. Is the assumption that this is a closed ecosystem where malicious parties cannot get valid credentials?

Kind regards,

Neil

--
Neil Madden
Security Director, ForgeRock Engineering.
Email: [email-masked]     PGP: 90F8 43DF 4EDD AC5D
Bugs/Reports: [email-masked] PGP: 6D19 AD77 1F43 ADAD

---

From: John Bradley <[email-masked]>
Date: Tue, 2 Jan 2018 12:06:25 -0300

In reality people developers may not always be putting that much entropy into a token.   It is only a SHOULD and hard to enforce.  I may have come up with the min entropy number.

There may also be side channel attacks if you allow introspection of encrypted or signed tokens. 

There is also a potential privacy issue if you return a bunch of PII in the token response.  If the token leaked it perhaps can’t be used if it isa POP token but you may still leak PII via introspection.

In general I am not a big fan of introspection.  We didn’t include it in Connect.  However the pattern is used in a number of commercial products to have the RS introspect tokens at the AS. 
It was decided by the WG that having a standard would reduce the number of things people need to support when you have things like a DataPower talking to Ping Fed or something like that.

Given that this is mostly used by RS I think the decision was made to err on the side of caution, as authentication is not a huge burden. 
I recall it being discussed and some people didn’t want to do authentication.

It is not cut and perhaps in some cases it might not be required, however that would introduce a option that people may get wrong in implementations.

Happy New Year 
John B.

> On Jan 2, 2018, at 9:42 AM, Neil Madden <[email-masked]> wrote:
> 
> _______________________________________________
> OAuth mailing list
> [email-masked]
> https://www.ietf.org/mailman/listinfo/oauth

---

From: Neil Madden <[email-masked]>
Date: Tue, 2 Jan 2018 17:01:40 +0000

The requirement on 128-bit entropy is a MUST in RFC 6749. There is a SHOULD for the stronger 160-bit level. How does authentication address the problem?

Neil

> On 2 Jan 2018, at 15:06, John Bradley <[email-masked]> wrote:
>

---

From: William Denniss <[email-masked]>
Date: Tue, 2 Jan 2018 12:54:29 -0800

If you're interested in examples in the wild of token introspection without
client authentication, Google offers one and specifically recommends that
JS clients (which are public clients and thus can't use client
authentication) use it to mitigate confused deputy attacks on access
tokens. Documented here:
https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token
(section 5, select the "OAuth 2.0 Endpoints" tab). The endpoint doesn't
follow the spec precisely, as it pre-dated it, but it's pretty close.

Regarding that "MUST require authentication", it does seem like there are
other mitigations, including ones that the text eludes to (e.g. throttling,
high entropy, etc). I actually advocated for a watering down of the MUST at
IETF 93, but by then the document was too advanced along the publishing
process for chances to be considered. I gathered the intended use-case of
the spec was more for resource server rather than client introspection
(though I expressed a view that it could be expanded to cover both since it
was so close).

On Tue, Jan 2, 2018 at 9:01 AM, Neil Madden <[email-masked]>
wrote:

> The requirement on 128-bit entropy is a MUST in RFC 6749. There is a
> SHOULD for the stronger 160-bit level. How does authentication address the
> problem?
>
> Neil
>
> > In reality people developers may not always be putting that much entropy
> into a token.   It is only a SHOULD and hard to enforce.  I may have come
> up with the min entropy number.
> >
> > There is also a potential privacy issue if you return a bunch of PII in
> the token response.  If the token leaked it perhaps can’t be used if it isa
> POP token but you may still leak PII via introspection.
> >
> > In general I am not a big fan of introspection.  We didn’t include it in
> Connect.  However the pattern is used in a number of commercial products to
> have the RS introspect tokens at the AS.
> > It was decided by the WG that having a standard would reduce the number
> of things people need to support when you have things like a DataPower
> talking to Ping Fed or something like that.
> >
> > Given that this is mostly used by RS I think the decision was made to
> err on the side of caution, as authentication is not a huge burden.
> > It is not cut and perhaps in some cases it might not be required,
> however that would introduce a option that people may get wrong in
> implementations.
> >
> > Happy New Year
> > John B.
> >
> >> I was just re-reading the OAuth 2.0 token introspection RFC 7662, and I
> am a bit confused by the rationale for requiring client (RS) authentication
> when making calls to this endpoint. The stated rationale in Section 2.1 (
> https://tools.ietf.org/html/rfc7662#page-5) is:
> >>
> >> However, RFC 6749 already requires that access tokens be unguessable
> with a probability of successful guesses being at most 2^(-128) [
> https://tools.ietf.org/html/rfc6749#section-10.10]. Assuming that this
> means something like: if an attacker makes 2^n guesses then they have a
> maximum chance of guessing a particular access token of at most 2^(n-128),
> then I think the token scanning attacks are already taken care of aren’t
> they? It is not feasible for an attacker to make that many queries. Even if
> you consider that the attacker only needs to guess one out of the set of
> all valid access tokens, then I still don’t think this attack is feasible
> in any realistic time-frame, especially if you follow the “SHOULD"
> recommendation to require at most 2^(-160) probability.
> >>
> >> Also, I cannot find a justification in the RFC for how this threat is
> mitigated by requiring authentication. Is the assumption that this is a
> closed ecosystem where malicious parties cannot get valid credentials?
> >>
> >> Kind regards,
> >>
> >> Neil
> >>
> >> --
> >> Neil Madden

---

From: Vladimir Dzhuvinov <[email-masked]>
Date: Wed, 3 Jan 2018 09:07:08 +0200

On 02/01/18 19:01, Neil Madden wrote:
> How does authentication address the problem?
Authentication increases the effective entropy. An attacker fist has to
be break the client secret, then successfully guess the token.

Vladimir

---

From: Neil Madden <[email-masked]>
Date: Wed, 3 Jan 2018 14:09:50 +0000

On 3 Jan 2018, at 07:07, Vladimir Dzhuvinov <[email-masked]> wrote:
> Authentication increases the effective entropy. An attacker fist has to be break the client secret, then successfully guess the token.

Authentication of parties using the introspection endpoint doesn’t increase entropy. If I have a 1 in 2^128 chance of correctly guessing an access token before you add authentication to the endpoint, then I still have the same probability of success afterwards. You’ve just made it harder for me to check my answers. But I can just try and actually use the token to see if it works. If access token guessing is a problem for token introspection, then it is a problem for essentially every part of the OAuth 2.0 ecosystem.

There is also the issue that attackers may have valid credentials anyway. If this attack is valid in the first place, then it is also valid to consider a malicious RS trying to compromise tokens for a different resource server. Unless you have a completely closed environment where all valid parties trust each other, then authentication doesn’t make much difference.

But the token scanning attack is already ruled out by the entropy requirements on access tokens. For example, suppose your application produces access tokens at a rate of 1 million per second, and they each last for 2 years. You will have a maximum of just over 63 trillion access tokens in circulation (~2^46). Assuming an attacker doesn’t care about which access token they compromise, then with the minimum entropy requirements of 128 bits they will require effort of approximately 2^(128-46) = 2^82 to guess any one of those access tokens. That should still be beyond the likely capabilities of anybody to achieve in a 2 year timespan. If you use the recommendation for 160-bit entropy, then they have effort of 2^114, which is comfortably beyond practical for the foreseeable future. (All assuming that you do not leak tokens by other means).

It is not a bad idea to require authentication on the token introspection endpoint, for other reasons mentioned in this thread. So I don’t think the RFC is wrong to recommend it, or even require it. But the stated rationale seems incorrect to me.

Regards,

Neil