That's outside of the responsibility of a BFF. That's what web application
firewalls are doing, with disputable results. They are another tool that
can be used, for any of the described flows btw.

Le lun. 28 août 2023, 18:14, Dick Hardt <dick.ha...@gmail.com> a écrit :

> While a breach of a BFF may be as catastrophic as an exfiltration of an
> access token, the BFF may also be more secure against a breach.
>
> For example, a BFF could detect a possible compromise by the API usage
> pattern becoming unusual to the app, that a RS is not able to detect as the
> general usage patterns are less defined, and the BFF could then stop
> processing requests.
>
>
>
>
> On Mon, Aug 28, 2023 at 8:58 AM Aaron Parecki <aaron=
> 40parecki....@dmarc.ietf.org> wrote:
>
>> > An XSS compromise would allow an attacker to call the resource server
>> from the browser context through the BFF, which would lead to the same
>> catastrophous result as doing it from another context.
>>
>> There is a huge difference between being able to access resources through
>> the user's browser while it's online vs being able to access resources
>> without the browser's involvement.
>>
>> Additionally, in many cases, the BFF exposes only a subset of actions of
>> the resource server to the client. Or put another way, sometimes access
>> tokens can access more resources than just the ones the BFF can access.
>> This obviously doesn't apply to everyone, but it's still common enough to
>> be significant. This is briefly mentioned in the security considerations
>> already:
>> https://datatracker.ietf.org/doc/html/draft-ietf-oauth-browser-based-apps#name-reducing-the-impact-of-toke
>>
>> Aaron
>>
>>
>> On Mon, Aug 28, 2023 at 8:51 AM Yannick Majoros <yann...@valuya.be>
>> wrote:
>>
>>> An XSS compromise would allow an attacker to call the resource server
>>> from the browser context through the BFF, which would lead to the same
>>> catastrophous result as doing it from another context.
>>>
>>> Cookies are sent automatically, potentially to resources which shouldn't
>>> get it. Same threat level as a token that is too broadly scoped, really.
>>>
>>> You really have a point about refresh tokens here, but they are a
>>> separate, real issue. Refresh tokens should be avoided whenever you can do
>>> without. Any pattern that can keep them safe is on the same level, but
>>> their safety is always relative. They make any attack worse, indeed (and
>>> that is also true for BFFs in some scenario's). This isn't specifically
>>> about BFFs.
>>>
>>> Le lun. 28 août 2023 à 17:38, Aaron Parecki <aa...@parecki.com> a
>>> écrit :
>>>
>>>> > BFFs are not any safer, XSS or any successful malicious javascript
>>>> execution has the same end effect
>>>>
>>>> As described in the draft as well as in this email thread, this is
>>>> incorrect.
>>>>
>>>> An XSS compromise of the BFF architecture results in the attacker being
>>>> able to make requests to the BFF with the legitimate user's cookie, as long
>>>> as the user's browser is active. An XSS compromise of a SPA results in the
>>>> attacker being able to obtain access tokens (and possible refresh tokens),
>>>> which results in the attacker being able to access the resource server
>>>> directly, outside of the context of the user's browser, which may allow the
>>>> attacker to access far more data than the browser app alone, and for a
>>>> longer period of time.
>>>>
>>>> The difference between these threats is extremely significant.
>>>>
>>>> Aaron
>>>>
>>>> On Mon, Aug 28, 2023 at 8:14 AM Yannick Majoros <yann...@valuya.be>
>>>> wrote:
>>>>
>>>>> My last comment was rather ironic: user-facing applications are
>>>>> dangerous (security is hard, which I say nothing with), and that is true
>>>>> for any scheme.. BFFs are not any safer, XSS or any successful malicious
>>>>> javascript execution has the same end effect (=game over, complete
>>>>> compromise of authenticated calls), and there was still no
>>>>> factual demonstration of multiple levels of security here. See my detailed
>>>>> explanations.
>>>>>
>>>>> Le lun. 28 août 2023 à 11:35, Steinar Noem <stei...@udelt.no> a
>>>>> écrit :
>>>>>
>>>>>> I think this is a great discussion, and it seems to me that Yannicks
>>>>>> last comment is basically what Phillippe is trying to point out..
>>>>>> I just wanted to remind the authors about a couple of things that we
>>>>>> briefly discussed during OSW in London.
>>>>>>
>>>>>> Although it might not be directly relevant for this discussion I do
>>>>>> think that it might be a good idea that the spec mentions that:
>>>>>>
>>>>>>    - The level of security you require for any client is often a
>>>>>>    reflection of the sensitivity of the information that the API 
>>>>>> exposes. You
>>>>>>    will have different requirements for confidential information than 
>>>>>> for open
>>>>>>    data. An example of a similar recommendation can be found in the HTTP
>>>>>>    Semantics specification: https://httpwg.org/specs/rfc9110.html#GET
>>>>>>
>>>>>>    - In my domain it is most often the owner of the API (the data
>>>>>>    controller) who defines and approves the level of security which it 
>>>>>> finds
>>>>>>    to fit their responsibilities (e.g. legal obligations) - although in 
>>>>>> some
>>>>>>    cases it might be both the data provider and the data consumer. 
>>>>>> Meaning -
>>>>>>    this BCP might be equally important for the API-owner as it is to the
>>>>>>    client developer.
>>>>>>    - I think this discussion shows that any mitigation on the
>>>>>>    browser side will only raise the bar for the attacker, and can never 
>>>>>> be a
>>>>>>    fully effective countermeasure. I think this point could be even more
>>>>>>    clearly stated early in the spec, and that both the API-owner or 
>>>>>> client
>>>>>>    owner should be aware of this risk, and select their appropriate 
>>>>>> choice of
>>>>>>    security measures based on a risk assessment. In some cases their
>>>>>>    conclusion might be that a browser based app is not secure enough for
>>>>>>    their responsibilities.
>>>>>>
>>>>>>
>>>>>> S
>>>>>>
>>>>>> søn. 27. aug. 2023 kl. 18:41 skrev Yannick Majoros <yann...@valuya.be
>>>>>> >:
>>>>>>
>>>>>>> Yes, but this is true for all flows. Web applications are dangerous.
>>>>>>> Applications handling user input are dangerous too.
>>>>>>>
>>>>>>> Le dim. 27 août 2023, 17:46, Tom Jones <thomasclinganjo...@gmail.com>
>>>>>>> a écrit :
>>>>>>>
>>>>>>>> You can write your code as strong as you wish. You cannot determine
>>>>>>>> if the code running in the computer is that code running unaltered.
>>>>>>>> ..tom
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sun, Aug 27, 2023 at 5:25 AM Yannick Majoros <yann...@valuya.be>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Thanks for taking the time to respond and for the constructive
>>>>>>>>> feedback.
>>>>>>>>>
>>>>>>>>> Still, there is some initial incorrect point that makes the rest
>>>>>>>>> of the discussion complicated, and partly wrong.
>>>>>>>>>
>>>>>>>>> Specifically, §6.4.2.1 says this: *The service worker MUST NOT
>>>>>>>>> transmit tokens, authorization codes or PKCE code verifier to the 
>>>>>>>>> frontend
>>>>>>>>> application.*
>>>>>>>>>
>>>>>>>>> Wording should be refined, but the idea is that the service worker
>>>>>>>>> is to actually restrict authorization codes from even reaching the
>>>>>>>>> frontend. Of course, easier said than done, but that part happens to 
>>>>>>>>> be
>>>>>>>>> quite easy to implement.
>>>>>>>>>
>>>>>>>>> This has further impact on much of the other statements:
>>>>>>>>> *> The main problem with a browser-only client is that the
>>>>>>>>> attacker with control over the client has the ability to run a silent
>>>>>>>>> Authorization Code flow, which provides them with an independent set 
>>>>>>>>> of
>>>>>>>>> tokens*
>>>>>>>>> [...]
>>>>>>>>> *> **The security differences between a BFF and a browser-only
>>>>>>>>> app are not about token storage, but about the attacker being able to 
>>>>>>>>> run a
>>>>>>>>> new flow to obtain tokens.*
>>>>>>>>> [...]
>>>>>>>>> *> Again, the security benefits of a BFF are not about stoken
>>>>>>>>> storage. Even if you find the perfect storage solution for 
>>>>>>>>> non-extractable
>>>>>>>>> tokens in the browser, an attacker still controls the client 
>>>>>>>>> application
>>>>>>>>> and can simply request a new set of tokens. *
>>>>>>>>>
>>>>>>>>> Truth is: no, you can't start a new authentication flow and get
>>>>>>>>> the authorization code back in the main thread. I'm talking about the
>>>>>>>>> redirection scenario, which I'm the most familiar with, but it would
>>>>>>>>> probably apply to the "message" one as well (which is new to me and 
>>>>>>>>> seems
>>>>>>>>> to be ashtoningly legit due to vague "for example" wording in the 
>>>>>>>>> OAuth2
>>>>>>>>> spec :-) ).
>>>>>>>>>
>>>>>>>>> The service worker, according to
>>>>>>>>> https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/fetch_event#description
>>>>>>>>> , just intercepts the authorization code, gets a token, and never 
>>>>>>>>> sends it
>>>>>>>>> back to the main code.
>>>>>>>>>
>>>>>>>>> But don't trust me on my words: what about demonstrating our
>>>>>>>>> claims with actual code, and as such create a shorter, simpler, but 
>>>>>>>>> more
>>>>>>>>> constructive discussion?
>>>>>>>>>
>>>>>>>>> The demonstration in its current form would not lead to a
>>>>>>>>> successful compromise of a good implementation of access tokens 
>>>>>>>>> handled by
>>>>>>>>> a service worker.
>>>>>>>>>
>>>>>>>>> Yannick
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Le sam. 26 août 2023 à 14:20, Philippe De Ryck <
>>>>>>>>> phili...@pragmaticwebsecurity.com> a écrit :
>>>>>>>>>
>>>>>>>>>> My responses inline.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hi everyone,
>>>>>>>>>>
>>>>>>>>>> The document is about "OAuth 2.0 for Browser-Based Apps". Its
>>>>>>>>>> abstract further explains that it "details the security 
>>>>>>>>>> considerations and
>>>>>>>>>> best practices that must be taken into account when developing
>>>>>>>>>> browser-based applications that use OAuth 2.0.".
>>>>>>>>>>
>>>>>>>>>> As such, detailing security considerations is important. I share
>>>>>>>>>> the point of view that basing web applications on proven concepts is
>>>>>>>>>> important. The approaches detailed in the document have all their
>>>>>>>>>> advantages and disadvantages.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> We have discussed the topic of browser-based apps in depth at the
>>>>>>>>>> OAuth Security Workshop last week. I am also working with Aaron 
>>>>>>>>>> Parecki on
>>>>>>>>>> updating the specification to more accurately reflect these 
>>>>>>>>>> advantages and
>>>>>>>>>> disadvantages. Updates will go out in the coming days/weeks, so we 
>>>>>>>>>> more
>>>>>>>>>> than welcome concrete feedback on the content there.
>>>>>>>>>>
>>>>>>>>>> There are 2 main approaches to browser-based applications
>>>>>>>>>> security. One of them is to store security credentials at the 
>>>>>>>>>> frontend. The
>>>>>>>>>> other one is to use cookies and a BFF. Though common practice, there 
>>>>>>>>>> is
>>>>>>>>>> nothing fundamentally more secure about them in a demonstrable way.
>>>>>>>>>> Different approaches, different characteristics and security 
>>>>>>>>>> assumptions.
>>>>>>>>>> Nobody can prove that either approach is better, just that there are
>>>>>>>>>> different concerns.
>>>>>>>>>>
>>>>>>>>>> Handling security in BFFs relies on cookies that cannot be read
>>>>>>>>>> by the javascript application. This mechanism provides some reliable
>>>>>>>>>> protection about the cookie itself that is used as a kind of 
>>>>>>>>>> credential to
>>>>>>>>>> access confidential web resources. It obviously demands some 
>>>>>>>>>> additional
>>>>>>>>>> layers in the flow (proxy or light server). You also need a 
>>>>>>>>>> mechanism to
>>>>>>>>>> share session information, either at the server side, or for example 
>>>>>>>>>> by
>>>>>>>>>> having the cookie itself hold that information. A bigger concern to 
>>>>>>>>>> me is
>>>>>>>>>> that you basically give up standard mechanisms for securing the flow
>>>>>>>>>> between the frontend and the backend: the security between the two 
>>>>>>>>>> is a
>>>>>>>>>> custom solution (based on cookies, in a specific, custom way, this 
>>>>>>>>>> part
>>>>>>>>>> being in no way OAuth or standard). This solves the problem by not 
>>>>>>>>>> using
>>>>>>>>>> OAuth at all in the browser part of the application, basically 
>>>>>>>>>> making the
>>>>>>>>>> client application purely backend. However, the fact that 
>>>>>>>>>> browser-based
>>>>>>>>>> applications cannot be secured with OAuth isn't universally true, and
>>>>>>>>>> strongly depends on one's definition of "secure", and basically 
>>>>>>>>>> comes down
>>>>>>>>>> to what the security issue is.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> The updated specification will clearly outline the security
>>>>>>>>>> considerations when making the browser-based application a public 
>>>>>>>>>> OAuth
>>>>>>>>>> client.
>>>>>>>>>>
>>>>>>>>>> *The main problem with a browser-only client is that the attacker
>>>>>>>>>> with control over the client has the ability to run a silent 
>>>>>>>>>> Authorization
>>>>>>>>>> Code flow, which provides them with an independent set of tokens.*
>>>>>>>>>> These tokens give the attacker long-term and unrestricted access in 
>>>>>>>>>> the
>>>>>>>>>> name of the user. A BFF-based architecture does not suffer from this 
>>>>>>>>>> issue,
>>>>>>>>>> since the OAuth client is a confidential client. Regardless of one’s
>>>>>>>>>> definition of “secure”, this is a clear difference on the achievable 
>>>>>>>>>> level
>>>>>>>>>> of security.
>>>>>>>>>>
>>>>>>>>>> Of course, as stated multiple times before, the use of a BFF does
>>>>>>>>>> not eliminate the presence of the malicious JS, nor does it solve 
>>>>>>>>>> all abuse
>>>>>>>>>> scenarios.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Storing tokens at the frontend has advantages: it solves my
>>>>>>>>>> concern above about a standard based flow between the frontend and 
>>>>>>>>>> the
>>>>>>>>>> backend.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> The use of cookies is a core building block of the web, and is
>>>>>>>>>> quite standard.
>>>>>>>>>>
>>>>>>>>>> It's simpler from an operational point of view. And it's been
>>>>>>>>>> used in the wild for ages.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Anyone using a browser-only client should be informed about the
>>>>>>>>>> clear and significant dangers of this approach, which the updated
>>>>>>>>>> specification will do.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Both flows have been compromised numerous times. This doesn't
>>>>>>>>>> mean they are not right by design, but that the specific security 
>>>>>>>>>> concerns
>>>>>>>>>> have to be addressed.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> If you have specific security concerns about a BFF, I’d suggest
>>>>>>>>>> raising them. Until now, I have only seen arguments that highlight 
>>>>>>>>>> the
>>>>>>>>>> additional effort it takes to implement a BFF, but nothing to 
>>>>>>>>>> undermine its
>>>>>>>>>> security. Plenty of highly sensitive applications in the healthcare 
>>>>>>>>>> and
>>>>>>>>>> financial industry opt for a BFF for its improved security 
>>>>>>>>>> properties and
>>>>>>>>>> consider this trade-off to be favorable.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Now, the concerns we are really discussing is, what happens in
>>>>>>>>>> case of XSS or any form of malicious javascript.
>>>>>>>>>>
>>>>>>>>>> In this case, for all known flows, session riding is the first
>>>>>>>>>> real issue. Whether the injected code calls protected web resources 
>>>>>>>>>> through
>>>>>>>>>> the BFF or using the stored tokens, is irrelevant: the evil is done. 
>>>>>>>>>> Seeing
>>>>>>>>>> different threat levels between token abuse and session riding is a 
>>>>>>>>>> logical
>>>>>>>>>> shortcut: in many cases, the impact will be exactly the same.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Stating that using stolen tokens is the same as sending requests
>>>>>>>>>> through a compromised client in the user’s browser (client 
>>>>>>>>>> hijacking) is
>>>>>>>>>> categorically false. Here are two concrete differences:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>    - Stolen refresh tokens give an attacker long-term access in
>>>>>>>>>>    the name of the user. Client hijacking only works as long as the 
>>>>>>>>>> user’s
>>>>>>>>>>    browser is online and the client is effectively running.
>>>>>>>>>>    - Stolen access tokens give an attacker unfettered access to
>>>>>>>>>>    any resource server that accepts it. Client hijacking forces the 
>>>>>>>>>> attacker
>>>>>>>>>>    to play by the rules of the client. For example, an attacker can 
>>>>>>>>>> abuse a
>>>>>>>>>>    stolen token with fake origin headers to access a resource server 
>>>>>>>>>> that
>>>>>>>>>>    would accept the token, but has a CORS policy that rejects 
>>>>>>>>>> requests from
>>>>>>>>>>    the client’s origin
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> As stated before, the DPoP specification takes a similar point of
>>>>>>>>>> view on these consequences. They explicitly aim to prevent the abuse 
>>>>>>>>>> of
>>>>>>>>>> stolen tokens, while considering client hijacking to be out of scope 
>>>>>>>>>> (
>>>>>>>>>> https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop#name-objectives
>>>>>>>>>> )
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On a sidenote, the term “session riding” seems to refer to CSRF,
>>>>>>>>>> not to client hijacking. I have only learned this myself recently 
>>>>>>>>>> and have
>>>>>>>>>> mis-used this term before as well. I wanted to point this out to 
>>>>>>>>>> avoid
>>>>>>>>>> further confusion.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Reducing the attack surface with a BFF or even a simple proxy is
>>>>>>>>>> a possible but separate topic: this doesn't have to be linked to 
>>>>>>>>>> where
>>>>>>>>>> tokens are stored. Alternatively, services that shouldn't be 
>>>>>>>>>> accessible
>>>>>>>>>> could simply not be exposed, and token scope and audience must be 
>>>>>>>>>> well
>>>>>>>>>> thought.
>>>>>>>>>>
>>>>>>>>>> As such, BFFs as well as frontend token storage, though
>>>>>>>>>> different, are application design choices and have no demonstrable
>>>>>>>>>> superiority from a security point of view.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> *The security differences between a BFF and a browser-only app
>>>>>>>>>> are not about token storage, but about the attacker being able to 
>>>>>>>>>> run a new
>>>>>>>>>> flow to obtain tokens.*
>>>>>>>>>>
>>>>>>>>>> You also talk about “demonstrable” differences. I have shown
>>>>>>>>>> examples (both in text and video) of these consequences in 
>>>>>>>>>> browser-only
>>>>>>>>>> apps, resulting in the attacker obtaining both an access token and a
>>>>>>>>>> refresh token. If you claim that BFFs are just the same, I invite 
>>>>>>>>>> you to
>>>>>>>>>> demonstrate your point of view.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Still, it seems it matters to some people to not exfiltrate
>>>>>>>>>> tokens in case of successful XSS. In the first instance, I don't 
>>>>>>>>>> share this
>>>>>>>>>> need to protect short-lived tokens in a game over scenario, but the 
>>>>>>>>>> whole
>>>>>>>>>> investigation of more secure frontend storage mechanisms started 
>>>>>>>>>> because
>>>>>>>>>> some customers are concerned. We are in the realm of choice, not of
>>>>>>>>>> provable security need, but it is still important to them.
>>>>>>>>>>
>>>>>>>>>> Documenting security concerns and possible solutions is part of
>>>>>>>>>> the document. Where you store the tokens has an impact on how easy 
>>>>>>>>>> it will
>>>>>>>>>> be for an attacker to exfiltrate them. Local or session storage is
>>>>>>>>>> obviously not the best choice here, as injected javascript can easily
>>>>>>>>>> access it.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Again, the security benefits of a BFF are not about stoken
>>>>>>>>>> storage. Even if you find the perfect storage solution for 
>>>>>>>>>> non-extractable
>>>>>>>>>> tokens in the browser, an attacker still controls the client 
>>>>>>>>>> application
>>>>>>>>>> and can simply request a new set of tokens.
>>>>>>>>>>
>>>>>>>>>> This link points to the exact demo scenario in the video I have
>>>>>>>>>> referenced before:
>>>>>>>>>> https://youtu.be/OpFN6gmct8c?feature=shared&t=1366 It clearly
>>>>>>>>>> shows how the attacker runs a new flow to obtain tokens, without ever
>>>>>>>>>> touching the application’s tokens.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> A service worker is an interesting place to store them, as it can
>>>>>>>>>> additionally play the role of a front-end proxy that both holds the 
>>>>>>>>>> token
>>>>>>>>>> securely, and securely proxy requests to the resource server. 
>>>>>>>>>> Besides, a
>>>>>>>>>> track was started with Rifaat to initiate changes to the service 
>>>>>>>>>> worker
>>>>>>>>>> specifications to make some things simpler.
>>>>>>>>>>
>>>>>>>>>> The point that the service worker solution isn't that widespread
>>>>>>>>>> is indeed correct and should be addressed. I propose transparently
>>>>>>>>>> mentioning that it is seen as a possible but uncommon storage 
>>>>>>>>>> mechanism.
>>>>>>>>>> There should also be some explanation about other kinds of web 
>>>>>>>>>> workers,
>>>>>>>>>> which are more commonly used but exploitable, so less secure when 
>>>>>>>>>> token
>>>>>>>>>> exfiltration is a concern. The document isn't only about security 
>>>>>>>>>> best
>>>>>>>>>> practices, though, but about security concerns. Implementations are
>>>>>>>>>> explicitly out of scope.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Using a SW for storage does not solve anything, since the
>>>>>>>>>> attacker can simply request fresh tokens.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> My conclusion is that, though we can surely make the document
>>>>>>>>>> better, there is no all-encompassing solution. Similarly, BFFs are 
>>>>>>>>>> not
>>>>>>>>>> a higher level of security for healthcare of banks, just a different
>>>>>>>>>> solution. Service workers are still an interesting solution for 
>>>>>>>>>> people who
>>>>>>>>>> absolutely want to secure tokens at the frontend, and as improvable 
>>>>>>>>>> as
>>>>>>>>>> the document is, shouldn't be left out.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> You, as the creator of the SW approach, have clearly stated that
>>>>>>>>>> you don’t even use it in practice, so I don’t really understand the 
>>>>>>>>>> urge to
>>>>>>>>>> make this a recommended pattern. On the contrary, BFFs are used in 
>>>>>>>>>> practice
>>>>>>>>>> in a variety of scenarios.
>>>>>>>>>>
>>>>>>>>>> That said, the SW approach should indeed be mentioned in the
>>>>>>>>>> document, to clearly illustrate the security considerations and
>>>>>>>>>> limitations.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> About some specific concerns:
>>>>>>>>>> > *While content injection attacks are still possible, the BFF
>>>>>>>>>> limits the attacker’s ability to abuse APIs by constraining access 
>>>>>>>>>> through
>>>>>>>>>> a well-defined interface to the backend which eliminates the 
>>>>>>>>>> possibility of
>>>>>>>>>> arbitrary API calls.*
>>>>>>>>>> Session riding is still the main issue and isn't addressed at
>>>>>>>>>> all. If the intention here was to limit the number of exposed 
>>>>>>>>>> endpoints,
>>>>>>>>>> the application can still be designed to either only expose what is 
>>>>>>>>>> needed,
>>>>>>>>>> or put a proxy or api manager between for limiting exposition, 
>>>>>>>>>> unrelated to
>>>>>>>>>> where token storage happen.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> No-one has ever stated that a BFF would solve the consequences of
>>>>>>>>>> an attacker hijacking a client. However, when the attacker is forced 
>>>>>>>>>> to
>>>>>>>>>> launch attacks through a client running in the user’s browser, they 
>>>>>>>>>> are
>>>>>>>>>> forced to go through the BFF. That gives you a point of control 
>>>>>>>>>> which you
>>>>>>>>>> *could* use to implement restrictions. This is not required to
>>>>>>>>>> benefit from a BFF, since the main benefit is moving from a public 
>>>>>>>>>> client
>>>>>>>>>> to a confidential client.
>>>>>>>>>>
>>>>>>>>>> You state that you can achieve the same by using a careful design
>>>>>>>>>> of the application. However, you fail to mention what you consider 
>>>>>>>>>> the
>>>>>>>>>> “application” and where exactly this restriction fits in. This is
>>>>>>>>>> important, because once the attacker has exfiltrated access tokens, 
>>>>>>>>>> they
>>>>>>>>>> can send arbitrary requests. If the resource servers are not fully 
>>>>>>>>>> shielded
>>>>>>>>>> by an API manager, the attacker can contact them directly with a 
>>>>>>>>>> stolen
>>>>>>>>>> token. And if you apply this close to the resource servers, how will 
>>>>>>>>>> you
>>>>>>>>>> then configure them to only allow certain clients to access certain
>>>>>>>>>> endpoints?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> *> No, because running a silent flow in an iframe typically uses
>>>>>>>>>> a web message response. In essence, the callback is not the redirect 
>>>>>>>>>> URI,
>>>>>>>>>> but a minimal JS page that sends the code to the main application 
>>>>>>>>>> context
>>>>>>>>>> using the web messaging mechanism. The message will have the origin 
>>>>>>>>>> of the
>>>>>>>>>> authorization server as a sender. *
>>>>>>>>>> The iframe needs to get the auth code somehow, and that typically
>>>>>>>>>> happens by setting its src to the auth endpoint, and having a 
>>>>>>>>>> redirect URI
>>>>>>>>>> that points to that minimal js page. This would mean an  attacker can
>>>>>>>>>> change the redirect URI to be able to point to some custom js in the
>>>>>>>>>> application, which is a whole different
>>>>>>>>>>
>>>>>>>>>> Philippe, I'm honestly quite skeptical about that attack, but it
>>>>>>>>>> sounds interesting. Can you provide some details or a reproducer?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> In all honesty, my understanding that the Web Messaging approach
>>>>>>>>>> was universally used turned out to be inaccurate. There are two 
>>>>>>>>>> concrete
>>>>>>>>>> ways to run a silent authorization code flow: (1) using
>>>>>>>>>> response_mode=web_message and (2) using the proper redirect URI. Both
>>>>>>>>>> scenarios allow the attacker to obtain the authorization code by 
>>>>>>>>>> starting
>>>>>>>>>> the flow with an authorization request that
>>>>>>>>>> *is indistinguishable* from a request coming from the legitimate
>>>>>>>>>> application.
>>>>>>>>>>
>>>>>>>>>> *Scenario 1 (web messaging)*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>    - The iframe src points to the authorize endpoint
>>>>>>>>>>    - The AS does not redirect, but responds with an HTML page
>>>>>>>>>>    containing JS code. This JS code uses postmessage to send a 
>>>>>>>>>> message
>>>>>>>>>>    containing the authorization code to the main application context.
>>>>>>>>>>    - The attacker receives this message and obtains the
>>>>>>>>>>    authorization code
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> This approach is used by Auth0 and Apple. I have tested my attack
>>>>>>>>>> scenario against Auth0. Note that while this flow *does not use* the
>>>>>>>>>> redirect URI, it does validate the provided redirect URI. 
>>>>>>>>>> Additionally, the
>>>>>>>>>> admin needs to configure the AS to include the client’s origin in a 
>>>>>>>>>> list of
>>>>>>>>>> “Allowed Web Origins”.
>>>>>>>>>>
>>>>>>>>>> This is also the scenario I use in the demo I have linked to
>>>>>>>>>> above, so you can see it in action there.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> *Scenario 2 (redirect)*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>    - The iframe src points to the authorize endpoint
>>>>>>>>>>    - The AS redirects the frame to the application’s callback
>>>>>>>>>>    with the authorization code as a query parameter
>>>>>>>>>>    - The attacker can monitor the iframe for a URL that contains
>>>>>>>>>>    the authorization code, stop the frame from loading (and 
>>>>>>>>>> redeeming the
>>>>>>>>>>    authorization code), and extract the code
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> This approach is more universal, but just as vulnerable. The
>>>>>>>>>> scenario is exactly the same as in the demo linked to above, but the 
>>>>>>>>>> attack
>>>>>>>>>> code looks slightly different.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> To conclude, I have carefully argued my point of view on this
>>>>>>>>>> mailing list, in recorded videos, and in the sessions at the OAuth 
>>>>>>>>>> Security
>>>>>>>>>> Workshop last week. As far as I can tell, the experts in the 
>>>>>>>>>> community
>>>>>>>>>> acknowledge the dangers of browser-only apps (i.e., the attacker 
>>>>>>>>>> running a
>>>>>>>>>> silent flow)  and agree that the browser-based apps BCP should 
>>>>>>>>>> accurately
>>>>>>>>>> reflect this information. We’re currently working on updating the
>>>>>>>>>> specification (which will happen in multiple steps, so we ask for a 
>>>>>>>>>> bit of
>>>>>>>>>> patience).
>>>>>>>>>>
>>>>>>>>>> Unless you have anything new to add or any new issues to raise, I
>>>>>>>>>> respectfully opt to disengage from further discussion.
>>>>>>>>>>
>>>>>>>>>> Kind regards
>>>>>>>>>>
>>>>>>>>>> Philippe
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Yannick Majoros
>>>>>>>>> Valuya sprl
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> OAuth mailing list
>>>>>>>>> OAuth@ietf.org
>>>>>>>>> https://www.ietf.org/mailman/listinfo/oauth
>>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>> OAuth mailing list
>>>>>>> OAuth@ietf.org
>>>>>>> https://www.ietf.org/mailman/listinfo/oauth
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Vennlig hilsen
>>>>>>
>>>>>> Steinar Noem
>>>>>> Partner Udelt AS
>>>>>> Systemutvikler
>>>>>>
>>>>>> | stei...@udelt.no | h...@udelt.no  | +47 955 21 620 | www.udelt.no |
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Yannick Majoros
>>>>> Valuya sprl
>>>>>
>>>>> _______________________________________________
>>>>> OAuth mailing list
>>>>> OAuth@ietf.org
>>>>> https://www.ietf.org/mailman/listinfo/oauth
>>>>>
>>>>
>>>
>>> --
>>> Yannick Majoros
>>> Valuya sprl
>>>
>>> _______________________________________________
>> OAuth mailing list
>> OAuth@ietf.org
>> https://www.ietf.org/mailman/listinfo/oauth
>>
>
_______________________________________________
OAuth mailing list
OAuth@ietf.org
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to