Makes sense, thanks. > On 18 Mar 2021, at 22:55, Brian Campbell <bcampb...@pingidentity.com> wrote: > > > Thanks Neil. I'll look at incorporating that guidance. Although I think > referencing might be more appropriate than incorporating directly. > >> On Mon, Mar 15, 2021 at 3:44 AM Neil Madden <neil.mad...@forgerock.com> >> wrote: >> There is now a draft from the W3C explicitly addressing Spectre and its >> impacts on web security. I think we should aim to incorporate the guidance >> for “dynamic subresources” [1], and in particular the first item in the >> list, which is recommendations for "Application-internal resources (private >> API endpoints …)”. The recommended response headers given are: >> >> Cross-Origin-Resource-Policy: same-origin >> Content-Security-Policy: sandbox >> Cross-Origin-Opener-Policy: same-origin >> Vary: Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site >> X-Content-Type-Options: nosniff >> X-Frame-Options: DENY >> >> Cheers, >> >> Neil >> >> [1]: >> https://w3c.github.io/webappsec-post-spectre-webdev/#dynamic-subresources >> >>> On 20 Feb 2021, at 09:07, Neil Madden <neil.mad...@forgerock.com> wrote: >>> >>> I was mentioning it primarily as another example of the assumption that GET >>> requests are safe. However, the draft rfc6265bis [1] does seem concerned >>> about this, and mentions <link rel=prerender> as a possible attack vector. >>> This would again potentially pull the access token into the renderer’s >>> memory space (until site isolation becomes widespread). >>> >>> I also have a general dislike of SameSite cookies as a defence against >>> CSRF. There are CSRF-like attacks that are not strictly cross-*site* but >>> are cross-origin (CORF?). For example, subdomain hijacking is relatively >>> common [2] and completely defeats SameSite. As the draft itself says [3]: >>> >>> <quote> >>> >>> "SameSite" cookies offer a robust defense against CSRF attack when >>> deployed in strict mode, and when supported by the client. It is, >>> however, prudent to ensure that this designation is not the extent of >>> a site's defense against CSRF, as same-site navigations and >>> submissions can certainly be executed in conjunction with other >>> attack vectors such as cross-site scripting. >>> >>> Developers are strongly encouraged to deploy the usual server-side >>> defenses (CSRF tokens, ensuring that "safe" HTTP methods are >>> idempotent, etc) to mitigate the risk more fully. >>> </quote> >>> >>> If we recommend SameSite for this, IMO we should do so only with the same >>> caveats expressed in the httpbis draft. >>> >>> [1]: >>> https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-07#section-5.3.7.1 >>> [2]: https://www.hackerone.com/blog/Guide-Subdomain-Takeovers# >>> [3]: >>> https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-07#section-8.8.1 >>> >>> Cheers, >>> >>> Neil >>> >>>>> On 19 Feb 2021, at 23:18, Brian Campbell <bcampb...@pingidentity.com> >>>>> wrote: >>>>> >>>> >>>> Thanks Neil, >>>> Appreciate the insight and recommendations. I think we can incorporate >>>> that, more or less, into the next revision. >>>> One point to dig into just a bit more, you said that 'SameSite has a >>>> "GET-out clause" in the form of “lax”'. As I understand it, such a cookie >>>> would still only be sent on a cross-site GET resulting from a top-level >>>> navigation. And in the context of the bff-token endpoint, that >>>> significantly reduces the ways a cross-site request could be initiated and >>>> those ways (pop-up or full page redirection) further limits the likelihood >>>> of the malicious party being able to read response data. >>>> >>>>> On Thu, Feb 18, 2021 at 5:08 AM Neil Madden <neil.mad...@forgerock.com> >>>>> wrote: >>>>> Thanks for following up, Brian. Responses below. >>>>> >>>>>> On 17 Feb 2021, at 22:48, Brian Campbell <bcampb...@pingidentity.com> >>>>>> wrote: >>>>>> >>>>>> Always appreciate (and often learn from) your insights, Neil. I'd like >>>>>> to dig into the CSRF thing a bit more though to understand better and >>>>>> hopefully do the right thing in the draft. >>>>>> >>>>>> It seems to me that a GET at the bff-token endpoint is "safe" in that >>>>>> it's effectively just a read. >>>>> >>>>> Well it’s a read that returns an access token. It’s “safe” in the sense >>>>> of side-effects, but we absolutely want to preserve the confidentiality >>>>> of what is returned and only allow it to be accessed by authorized >>>>> clients (the legitimate frontend). At the moment the only thing keeping >>>>> that safe is the JSON content type. For example, imagine a world in which >>>>> the token-bff endpoint instead returned the access token as HTML: >>>>> >>>>> <div id=“accessToken”>abcd</div> >>>>> >>>>> Then as an attacker I can simply embed an iframe on my site that refers >>>>> to your bff-endpoint and then parse the access token out of the DOM. The >>>>> browser will happily load that iframe and send along the cookie when it >>>>> makes the request. If you have CORS enabled on your site (with >>>>> Access-Control-Allow-Credentials) then any of the allowed CORS origins >>>>> can directly call the bff-token endpoint and read the access token even >>>>> in JSON form. There have also been historical same-origin policy bypasses >>>>> using Flash, Adobe Reader, or other plugins (thankfully now largely >>>>> eliminated), or by redefining JavaScript prototypes - see >>>>> https://haacked.com/archive/2009/06/25/json-hijacking.aspx/ . These are >>>>> largely fixed, but I wouldn’t bet on there never being another one. >>>>> >>>>> >>>>>> There could be a "cache miss" where the backend attempts to use a >>>>>> refresh token it has to get a new access token from the remote AS, which >>>>>> will be more resource intensive but doesn't fundamentally alter the >>>>>> state of the backend so is still "safe". That in conjunction with your >>>>>> pointing to Cross-Origin Read Blocking makes me think your concern isn't >>>>>> so much about traditional CSRF used to take some malicious action but >>>>>> rather about somehow (speculative side-channel attacks, problems with >>>>>> javascript interpreters, other similar vectors that are somewhat beyond >>>>>> me) accessing the data of the response to a forged cross site request. >>>>>> Correct me if I'm wrong. I don't know if or how much the distinction >>>>>> matters in terms of mitigation approach but I'm keen to better >>>>>> understand. >>>>> >>>>> As explained above, because the endpoint returns JSON it _should_ be >>>>> impossible to directly read the response from a cross-origin read (unless >>>>> explicitly enabled with CORS). But you may still be able to embed that >>>>> response in an <img> or similar. Because people are terrible at setting >>>>> correct Content-Type headers on responses, browsers often ignore them and >>>>> instead try to sniff what the real content type is: so if the response >>>>> looks a bit like a valid image format (or PDF or JavaScript or whatever) >>>>> then it might try and render it. No doubt this will fail, but at that >>>>> point the data has already been loaded into the address space of the >>>>> renderer process for the attacker’s site. That means that it is then >>>>> vulnerable to attacks like Spectre that bypass normal memory protection. >>>>> The browser vendors consider this to be a real threat, hence CORB. >>>>> >>>>> The most important thing for a cookie-based JSON API to do is to return a >>>>> correct Content-Type header and to also return X-Content-Type-Options: >>>>> nosniff to prevent browsers from trying to sniff the real content-type. >>>>> (I have an example in my book where the failure to do this can actually >>>>> turn a JSON API into a vector for XSS attacks, even if you have no SPA >>>>> frontend component at all). >>>>> >>>>> (You should also mark the cookie as HttpOnly because this prevents the >>>>> cookie ever entering the address space of a renderer process in modern >>>>> browsers - an actual genuine security benefit of HttpOnly cookies). >>>>> >>>>> But my worry is that this is still basically trusting the client to >>>>> perform critical security checks, and historically browsers have had >>>>> plenty of bypasses in this area. So for something as high-value as an >>>>> access token I’d prefer that any request using cookie-based >>>>> authentication is protected by proactive CSRF defences to prevent >>>>> malicious requests being allowed in the first place. >>>>> >>>>>> >>>>>> It sounds like your preference for only POST rests in an assumption that >>>>>> the larger app will already have in place some CSRF defenses and by >>>>>> using POST the bff-token endpoint will basically inherit said defenses. >>>>>> Or is POST by itself good enough (the CORB writeup seems to suggest that >>>>>> the context in which a POST could be made is more guarded against side >>>>>> channel stuff)? But perhaps then the draft should be more explicit >>>>>> about CSRF defense? Saying it just has to be done. Or like even >>>>>> mandating a non-standard header be in the request, >>>>>> "X-Neil-says-beware-CSRF: yuppers" as a strawman. With such a header it >>>>>> could remain a GET. And I kinda like GET because it is really a request >>>>>> for data. Or perhaps the request should be a POST with built-in CSRF >>>>>> protection by changing it to carry any parameters as JSON in the body >>>>>> with "{}" for the case of no parameters specified? Or just make it a >>>>>> PUT and call it good? Not sure any of these are good ideas but just >>>>>> trying to hash out the most appropriate thing to do. >>>>> >>>>> Right, the preference for POST is because it's more likely to trigger >>>>> CSRF defences, which often consider GET/HEAD requests to be “safe”. Even >>>>> before Spectre, there is a whole array of side-channel attacks for >>>>> extracting information from cross-site responses: https://xsleaks.dev . >>>>> Note that even SameSite has a "GET-out clause" in the form of “lax”. >>>>> >>>>> So yes, the real requirement is that the endpoint should have adequate >>>>> CSRF protection. Requiring a special header has had bypasses in the past >>>>> (again, mostly using Flash). >>>>> >>>>> So I think we should recommend the following: >>>>> >>>>> 1. The response MUST contain a correct Content-Type: application/json >>>>> header and X-Content-Type-Options: nosniff. >>>>> 2. The cookie SHOULD be marked as HttpOnly. >>>>> 3. The endpoint MUST NOT be accessible via CORS. >>>>> 4. The endpoint SHOULD have adequate CSRF protections in place. At a >>>>> minimum the cookie should be marked as SameSite. >>>>> >>>>> We could perhaps add an informational reference to >>>>> https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html >>>>> given that there is a changing landscape around cookies at the moment. >>>>> If the browser vendors do eliminate 3rd-party cookies then 1, 3, and 4 >>>>> become largely unnecessary (although 3 might still be a risk due to >>>>> sub-domain hijacking, and 1 will always be good practice). >>>>> >>>>> — Neil >>>>> >>>>>> >>>>>> That got a little rambly, sorry. But hopefully it makes some sense. >>>>>> >>>>>>> On Sun, Feb 14, 2021 at 1:17 AM Neil Madden <neil.mad...@forgerock.com> >>>>>>> wrote: >>>>>>> >>>>>>> The combination of the bff-token endpoint recommending the use of GET >>>>>>> requests together with the hint to use cookie-based authentication is >>>>>>> likely going to punch a hole in most CSRF defenses, which assume that >>>>>>> GETs are safe. The only thing preventing this being exploitable is >>>>>>> Cross-Origin Read Blocking >>>>>>> (https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md) >>>>>>> due to the JSON content-type. That makes me really nervous. We should >>>>>>> at least mandate X-Content-Type-Options: nosniff on that response. I’d >>>>>>> feel more comfortable if this was a POST request only. >>>>>>> >>>>>>> — Neil >>>>>>> >>>>>> >>>>>> CONFIDENTIALITY NOTICE: This email may contain confidential and >>>>>> privileged material for the sole use of the intended recipient(s). Any >>>>>> review, use, distribution or disclosure by others is strictly >>>>>> prohibited. If you have received this communication in error, please >>>>>> notify the sender immediately by e-mail and delete the message and any >>>>>> file attachments from your computer. Thank you. >>>>> >>>>> >>>>> ForgeRock values your Privacy >>>> >>>> CONFIDENTIALITY NOTICE: This email may contain confidential and privileged >>>> material for the sole use of the intended recipient(s). Any review, use, >>>> distribution or disclosure by others is strictly prohibited. If you have >>>> received this communication in error, please notify the sender immediately >>>> by e-mail and delete the message and any file attachments from your >>>> computer. Thank you. >> >> >> ForgeRock values your Privacy > > CONFIDENTIALITY NOTICE: This email may contain confidential and privileged > material for the sole use of the intended recipient(s). Any review, use, > distribution or disclosure by others is strictly prohibited. If you have > received this communication in error, please notify the sender immediately by > e-mail and delete the message and any file attachments from your computer. > Thank you.
-- ForgeRock values your Privacy <https://www.forgerock.com/your-privacy>
_______________________________________________ OAuth mailing list OAuth@ietf.org https://www.ietf.org/mailman/listinfo/oauth