If an attacker can compromise the application running in the user agent,
then from an OAuth2 standpoint there is no way to distinguish or protect
the user from malicious requests made on the user's behalf. I think the
problem here is that one assumption that's been made is that HTTP Only
Cookies secure against your PreCondition #1 (XSS or compromised
dependency). But that was never the case, an attacker could always make
requests on the user's behalf from inside the application. The theoretical
value was preventing the exfiltration of the generated access tokens.
You've proven that's not the case, but realistically that's irrelevant,
because it was never the requirement that HTTP Only Cookies could protect
against XSS or a compromised dependency.

If we want to protect against XSS and a compromised dependency, then both
the generation of the access token and the access token itself have to be
obscured from the application. Today, only the access token can be
controlled to be blocked, but the current state of the browsers is that
there is no way to initiate and secure the token generation from a
compromised user agent application when the only technology available is
the user agent.

To solve there are two different solutions:

   1. User Agents must support an OAuth2 first mechanism for the secure
   generation of PKCE. Right now, since the application is responsible for
   generation, this process can be compromised.
   2. The alternative would be to protect the flow, by restricting the use
   of the /authorize endpoint to Push Authorization Requests. By limiting to a
   Pushed Authorization Request (PAR) and not allowing the use of authorize
   endpoint to generate auth requests via the redirect, we can be sure that an
   credentialled client can roundtrip a secure client secret or even with the
   PKCE.

With that regard, rather than client *response_modes* to limit
configuration, it feels more appropriate to add
*require_pushed_authorization_requests
*to the client metadata of the authorization server.

By doing so we are moving the security out of the user agent into the
credentialed client.

BUT! What good does this actually do? If we assume there could be an XSS or
a compromised dependency in the application running in the browser, then it
is trivially true that we should also expect a transferrable XSS request or
compromised dependency in the credentialed client as well. Which means that
all secrets and mechanisms available are vulnerable there.

Which leads us back to the only way to secure the flow with these
assumptions would be to have a root of trust. That is, the pre-registration
of public keys associated with the client. With that we are back to DPoP:
https://datatracker.ietf.org/doc/html/rfc9449

While DPoP still cannot prevent the XSS or compromised dependency from
allowing an attacker to utilize the tokens generated for the browser, it
will absolutely prevent the type of attack since those tokens would be
bound to the user agent.

The conclusion here, is that we are back to the same two solutions:

   1. User agents must support an OAuth2 first mechanism for the sucer
   generation of PKCE, preferably, DPoP. Right now since the application is
   responsible for the generation, this process can be compromised.
   2. If we can assume there are vulnerabilities somewhere, then we should
   also assume there are vulnerabilities everywhere, and that means secrecy of
   tokens in the browser is worthless because if a credentialed client is
   compromised, then so is the ability to secure HTTP communication from that
   client.

I'm 100% for having a browser supported DPoP mechanism for the bound
generation of access tokens. That for me is the only viable path forward
for this issue and has been brought up multiple times in the DBSC
implementation concerns. But I just don't see how any changes to the OAuth2
protocol can help here.

I hope I'm making at least a little sense.
- Warren

On Thu, Nov 6, 2025 at 12:06 PM Andrey Kuznetsov <[email protected]>
wrote:

> Sure. The preconditions are:
>
> 1. Execution of malicious JavaScript code within the context of one of the
> application’s pages with the same origin. Such as
>    - Cross-Site Scripting (XSS)
>    - A vulnerable or compromised dependency, or third-party script
> 2. The ability to obtain the parameters of the authorization response:
>   - Using the web message response mode and setting up one’s own event
> listener
>   - Injecting an invisible iframe and obtaining the authorization response
> from the location object + *breaking the OAuth flow*
>   - Briefly opening a new window and obtaining the authorization response
> from the location object + *breaking the OAuth flow*
> 3. Breaking the OAuth flow. To break the OAuth flow means to prevent the
> authorization response parameters (such as the authorization code) from
> being received and consumed by the application itself. This can be achieved
> by
>    - Passing an invalid state value
>    - Changing the response type/response mode for the authorization request
>    - Case-shifting the redirect URI value
>    - Path extension for the redirect URI value
>    - Adding query parameters to the redirect URI value
>    - Using previously added, but forgotten valid values for the redirect
> URI
> 4. SSO mechanism and seamless user authorization. The user must have an
> active session on the authorization server, so that the authentication form
> is not returned in response to the authorization request.
>
>
> ----------------
> Кому: Andrey Kuznetsov ([email protected]);
> Копия: Philippe De Ryck ([email protected]),
> [email protected];
> Тема: [OAUTH-WG] Re: Question: Form Post Response Mode in OAuth/OIDC
> Security Best Practices;
> 06.11.2025, 13:41, "Warren Parad" <[email protected]>:
>
> I'm using the word "assumption", and you've used the word "precondition",
> that's fine, but it doesn't clarify the situation. Can you state what
> "preconditions" you are expecting here?
>
> On Thu, Nov 6, 2025 at 11:30 AM Andrey Kuznetsov <
> [email protected]> wrote:
>
> Philippe,
> Yes, i suppose, i do.
> I have a short video demonstration <https://youtu.be/AFsrm02tC6c> for the
> described attack. Also there is another demo
> <https://youtu.be/asEBPOs9ys8> for the same attack but done manually for
> clarity.
> The source code for applications used in those examples is available on
> GitHub <https://github.com/anador/oauth-demo-poc>. The app may take some
> setup but can be used with any OAuth/OIDC-compatible authorization server.
>
> Warren,
> Perhaps, i may misunderstand your questions, but with the necessary
> preconditions met it's not an assumption, but a statement.
>
>
> ----------------
> Кому: Philippe De Ryck ([email protected]);
> Копия: [email protected];
> Тема: [OAUTH-WG] Re: Question: Form Post Response Mode in OAuth/OIDC
> Security Best Practices;
> 06.11.2025, 12:46, "Warren Parad" <[email protected]>:
>
> Would someone be able to state the obvious for me?
>
> Is the assumption that there is a code injection attack present where an
> attacker has access to javascript running in the application's interface?
> Is that the core assumption or is it something else?
>
> On Thu, Nov 6, 2025 at 8:18 AM Philippe De Ryck <
> [email protected]> wrote:
>
> Hi Andrey,
>
> It seems that with this high degree of control, the attacker would indeed
> be able to manipulate the flows.
>
> However, I’m curious to know if you have an actual working demo of step
> 9-10-11. I remember from a private discussion a while ago that someone
> pointed out that intermediate redirects are not observable in the browser.
> So if response 9 triggers a redirect to the backend (10), and the backend
> handles it and then redirects back to the main application (as a BFF would
> do), then the request in 10 is not observable from JS, and would prevent an
> attacker from stealing the authz code.
>
> Kind regards
>
> Philippe
>
> —
> *Pragmatic Web Security*
> *Security for developers*
> https://pragmaticwebsecurity.com/
>
>
>
> On 6 Nov 2025, at 06:33, Andrey Kuznetsov <[email protected]>
> wrote:
>
> I'm sorry for the delayed response.
>
> *Filip*, i agree with your statements and you provided reasonable
> examples of cookie that might be needed on the request to the redirect URI.
>
> There is also a reply from *Dick *with the similar reasoning:
>
>
>
> *As Filip stated, cookies are the main reason.  There is almost always
> some session state that the app wants to maintain between making the
> authorization request and getting the authorization response. It can be as
> simple as where the user was in the app so they are redirected to the
> original place, to what is already in the shopping cart, or even existing
> authentication context as the user is linking another account. With the use
> of PKCE, the threats of intercepted query parameters are reduced.If we were
> to make a recommendation, it would be the redirect and not form post as
> session hijacking is the larger threat now from my understanding.*
>
>
> Also there's been another thread started about Browser Swapping attack
> which discusses the related topic. However, i would like to clear things up.
> 1. There is a real attack scenario in which the attacker can steal the
> authorization code from the user's browser and use it even if the client
> implements confidential client, PKCE, state and nonce (please, consult the
> diagram 1.png attached)
> 2. The ways of authorization code stealing are not hypothetical or
> ephemeral: basically it can be done if the attacker is able to execute JS
> on any page of the legitimate application that has an origin matching the
> origin of the redirect URI . Full preconditions are listed here
> <https://medium.com/@anador/attacks-via-a-new-oauth-flow-authorization-code-injection-and-whether-httponly-pkce-and-bff-3db1624b4fa7#cd2e>
> .
> 3. The only complete mitigation for the attack is form post response mode
> (please, consult the diagram 2.png attached). Other additional mitigations
> are listed here
> <https://medium.com/@anador/attacks-via-a-new-oauth-flow-authorization-code-injection-and-whether-httponly-pkce-and-bff-3db1624b4fa7#6da0>
> .
> 4. The attack is possible because of the nature of OAuth flows (please,
> consult the diagram 3.png attached). All additional protection measures
> such as PAR/JAR/JARM don’t prevent the attack.
> 4. When we use query/fragment/web message response modes we cannot prevent
> the attacker that executes JS on the app's origin from accessing the
> authorization response. However, form post response mode does not allow
> access to the authorization response from the origin of the application
> itself. But the authorization server must be able to limit the available
> response modes at some level.
>
> On the other hand we have downsides of using form post response mode: if
> we need cookies to be received on the redirect URI page, those cookies (not
> actual session cookies!) must have SameSite=None attribute. I agree that
> for some cases it can be crucial, but for some it can add no risks.
> Also close attention should be paid to the values of the redirect URI that
> the authorization server considers valid to prevent XSS at the AS side.
>
>
> I suggest we should point out that form post response mode protects from
> the stated attack, while it should be considered if CSRF at client's side
> is going to be possible because of marking some cookies with SameSite=None.
>
> ----------------
> Кому: Andrey Kuznetsov ([email protected]);
> Копия: [email protected];
> Тема: [OAUTH-WG] Re: Question: Form Post Response Mode in OAuth/OIDC
> Security Best Practices;
> 26.10.2025, 10:54, "Filip Skokan" <[email protected]>:
>
> > That is why I emphasized "significant".
>
> Are they not significant?
>
> I may not have read your blog post but i did read and quote the question I
> was answering to. While these may appear as insignificant reasons at first
> glance they are both blockers encountered at one point in time in my past
> experience.
>
> > sameSite
>
> Account Linking, Step-up, re-auth, site preferences, shopping carts are
> all scenarios where you want/need an existing session loaded (regardless
> whether it's preauth or not).
>
> > FOUC
>
> User agent that's processing a 30x response with a location header and a
> 200 that contains a JS self-submitting form is different when it comes to
> FOUC. Of course this problem is exaggerated on unstable or slow connections
> such as mobile.
>
> - Filip
>
>
> 25. 10. 2025 v 17:50, Andrey Kuznetsov <[email protected]>:
>
>
> 
> That is why I emphasized "significant".
>
>
> UX - FOUC or briefly displayed submit page at the AS when it's sending
> responses
>
> - The returning page with the autosubmitted form usually does not contain
> any explicit content. In fact, I'm not sure how it's different from any
> redirect URI page that might appear briefly, as you mentioned, when other
> response modes are in use
>
>
> sameSite - the client is required to use sameSite=none for the cookies
> they expect to load at the redirect_uri, that may include session related
> cookies for which sameSite=none is the exact opposite of what they should
> strive for.
>
> - I agree with the first part of your statement, that's true. However, we
> should define what we mean by a "session" here and determine if it's a
> problem. Usually, this applies only to certain cookies that are used to
> maintain a "pre-auth session" and for such a case I'm not sure if it's a
> significant issue. I considered this nuance in the research i mentioned
> previously and explicitly stated that constraint. Could you share your
> example, If you have another case where we do need a cookie to be sent to
> the redirect URI endpoint?
> ----------------
> Кому: Andrey Kuznetsov ([email protected]);
> Копия: [email protected];
> Тема: [OAUTH-WG] Re: Question: Form Post Response Mode in OAuth/OIDC
> Security Best Practices;
> 25.10.2025, 16:40, "Filip Skokan" <[email protected]>:
>
>  On the other hand, i cannot identify any significant drawbacks to using
> this response mode, aside from inconsistent support across implementations.
>
>
> What about
> - UX - FOUC or briefly displayed submit page at the AS when it's sending
> responses
> - sameSite - the client is required to use sameSite=none for the cookies
> they expect to load at the redirect_uri, that may include session related
> cookies for which sameSite=none is the exact opposite of what they should
> strive for.
>
> - Filip
>
>
>  25. 10. 2025 v 15:21, Andrey Kuznetsov <[email protected]>:
>
>  On the other hand, i cannot identify any significant drawbacks to using
> this response mode, aside from inconsistent support across implementations.
>
>
> _______________________________________________
> OAuth mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
>
>
>
> --
> Best regards,
> Andrey Kuznetsov
> Software Architect
> Identity & Access Management
> Yandex Cloud
>
>
> ,
>
> _______________________________________________
> OAuth mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
>
>
>
> --
> Best regards,
> Andrey Kuznetsov
> Software Architect
> Identity & Access Management
> Yandex Cloud
>
> <1.png><2.png><3.png>_______________________________________________
> OAuth mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
>
> _______________________________________________
> OAuth mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
>
>
>
> --
> С уважением,
> Андрей Кузнецов
> Архитектор, YC IAM & Resource Management
> TG: @andreukuznetsov_work <https://t.me/andreukuznetsov_work>
>
>
>
>
> --
> С уважением,
> Андрей Кузнецов
> Архитектор, YC IAM & Resource Management
> TG: @andreukuznetsov_work <https://t.me/andreukuznetsov_work>
>
>
_______________________________________________
OAuth mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to