I agree with having the DPoP proof cover the access token (unless there's some 
burden on the clients doing so that I'm unaware of).

That would also limit the ability to pre-compute DPoP proofs with future 
timestamps (I sent an email to the list about this on 1 April) if an attacker 
can perform some kind of attack (XSS?) that temporarily allows executing code 
in the context of the client - as it would prevent generating DPoP proofs for 
access tokens that have not yet been issued.

DPoP key rotation (e.g. "generating and using a new DPoP key for each new 
authorization code grant" as suggested in section 2 of the DPoP draft) is a 
good idea but as Justin says depends on the clients actually doing it, with no 
real enforcement mechanism.

Mike

On 11/23/20, 6:52 AM, "OAuth on behalf of Justin Richer" 
<[email protected] on behalf of [email protected]> wrote:

    Correct, but the choice of using different keys is entirely in the hands of 
the client, as the AS accepts whatever key the client presents in its initial 
DPoP proof to bind to the token. If it’s on the client to prevent this kind of 
thing, we should at least mention it in the security considerations. If it’s 
something we want to prevent wholesale, we should expand the signature coverage 
to the access token, or at least a hash of the token.

     — Justin

    > On Nov 20, 2020, at 9:30 PM, Nikos Fotiou <[email protected]> wrote:
    > 
    > Hi,
    > The token is granted to a client based on the authorization grant and not 
the client's key. Therefore, a client may use a different key per token. At 
least this is an approach we are following. 
    > 
    > Best,
    > Nikos
    > 
    > -----Original Message-----
    > From: OAuth <[email protected]> On Behalf Of Justin Richer
    > Sent: Friday, November 20, 2020 9:26 PM
    > To: oauth <[email protected]>
    > Subject: [OAUTH-WG] Token substitution in DPoP
    > 
    > While working on an implementation of DPoP recently, I realized that the 
value of the access token itself is not covered by the DPoP signature at all. 
What I’m wondering is whether or not this constitutes an attack surface that we 
care about here. Here’s how it works:
    > 
    > 
    > Let’s say that a client creates a DPoP key and uses that key to request 
two tokens, T1 and T2, for different users, Alice and Bob, respectively. Alice 
is malicious and wants to get Bob’s stuff. Alice manages to get a hold of Bob’s 
token value, T2, through some means. Normally DPoP wouldn’t let Alice create a 
new request using T2 since Alice doesn’t have the client’s key. However, if 
Alice gets the client to create a request for her using T1, she can copy the 
signature from that request onto a new request using T2. Since the signature 
doesn’t cover the token value and the key is the same, the RS should accept 
both requests, right?
    > 
    > An important aspect is that the parts needed to make this attack work are 
a little weird: you’d need access to a valid signed request from the client 
with T1 as well as access to a valid T2 attached to the same key in order to 
make this substitution. However, this is effectively the same attack area that 
bearer tokens have in a lot of ways, since it doesn’t require the attacker 
gaining access to the singing key to generate or modify a signature, nor does 
it require the attacker to generate or modify an access token (merely obtain 
one).
    > 
    > 
    > I’d like to understand if this is an actual attack against DPoP. If it 
isn’t, how is it countered by DPoP today? If it is, do we discuss in the DPoP 
draft? I didn’t see a mention of it there. If it’s not, should we discuss it 
there?
    > 
    > 
    > The old OAuth PoP draft mitigates this attack by putting the access token 
itself inside the signature body instead of a second header. Another option 
would be to include a hash of the token value (such as OIDC’s “at_hash” method 
used in ID Tokens) in the DPoP payload. With either of these approaches, Alice 
having access to T1, T2, and a signed message for T1 does not allow her to use 
T2 effectively.
    > 
    > — Justin
    > _______________________________________________
    > OAuth mailing list
    > [email protected]
    > https://www.ietf.org/mailman/listinfo/oauth

    _______________________________________________
    OAuth mailing list
    [email protected]
    https://www.ietf.org/mailman/listinfo/oauth

_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to