Hacker News new | past | comments | ask | show | jobs | submit login
CSP bypass: How one Chrome XSS bug took 2.5 years and an HTML spec change to fix (portswigger.net)
67 points by weinzierl on June 22, 2021 | hide | past | favorite | 15 comments



I really wish they gave just a little more detail on what this attack looks like.

> "Kokatsu showed that if a web application creates a Blob URL with attacker-controlled data, it could lead to XSS attacks – even if the site is protected with strict CSP policies"

Does this mean that your application had to already have the code for Blob URL creation present? Or did it need to have some sort of XSS already available and this attack could be used in conjunction with it?

The former would be amazingly bad coding practices - to let users control what is in a Blob/Data/etc URL via attacker controlled parameters. For the latter, I'm trying to imagine a scenario with "Strict CSP" that would allow you to create and write a Blob URL. With CSPs you have to specify a 'unsafe-inline' value to allow inline Javascript to execute, which wouldn't be allowed with a "Strict CSP".


The example exploit of chat.mozilla.org helped me understand:

https://keerok.github.io/2021/05/20/mozilla-xss/

It has a link to a video: https://www.youtube.com/watch?v=nmio2rTn38Q

In this case, it did require the end user being exploited to be enticed to "open this image in a new tab". And it did require bad coding practice. In this case, thinking that their postmessage interface with an iframe was a safe input.


Agreed.

https://bugs.chromium.org/p/chromium/issues/detail?id=916326...

But to their credit they do provide external links with more details. Reading those now, because I'm running into the same questions/ conclusions as you.


I’m yet to find a website that actually has CSP without unsafe inline / eval granted in their policy. I suspect react doesn’t support the policies well, but also that the policy is not as scalable as intended.

Don’t get me wrong, it’s a cool idea but I can’t help but think that it’s dead. Can anyone prove me wrong?


You can get a list of the most recent websites with a score of 120 or higher on Mozilla's HTTP Observatory in JSON format: https://http-observatory.security.mozilla.org/api/v1/getRece...

All those sites have a restrictive CSP, among other things. Many of them are Fediverse instances (mostly Mastodon), i.e. complex web services that often serve thousands of users. Some others are simple static sites which are comparatively easy to apply a strict CSP to.


React itself can be fine, but most of the ecosystem doesn't.

Next.JS: https://github.com/vercel/next.js/issues/256

Gatsby: https://github.com/gatsbyjs/gatsby/discussions/10890

Create React app (a solution exists, but is not enabled by default): https://stackoverflow.com/questions/58354362/inline-script-b...

Google tag manager involves jumping through hoops the people running GTM usually won't jump through: https://developers.google.com/tag-manager/web/csp


That Next.js issue is 5 years old, here's a more recent discussion where we're exploring adding a CSP by default (https://github.com/vercel/next.js/issues/23993).

We've also added documentation on adding HTTP response headers to improve security (https://nextjs.org/docs/advanced-features/security-headers).


CSPs are hard to get right, but they're doable. Most occurrences of script unsafe-inline and unsafe-eval are due to laziness. As far as I know -- and I use React regularly -- there's nothing about React that makes a strong CSP harder vs normal DOM manipulations.


It's also worth noting that 'unsafe-inline' in CSP is commonly used to support older browsers, and a nonce subsequently disables the unsafe directive for modern browsers that support it. It can be hard to read a policy visually and see if the directive actually applies.

(The same thing happens with 'strict-dynamic' and allowing all HTTP(S) URIs -- 'strict-dynamic' disables the URIs when supported.)

ref: https://csp.withgoogle.com/docs/strict-csp.html#example


We use quite strong CSP for https://beta.peergos.net

Most of the site is written is vuejs and yes you need to precompile the vuejs templates for it to work with this strong CSP.


> I suspect react doesn’t support the policies well

Frankly this sounds like something you just made up.

Why would React require any weakening of CSP rules? Is there something special about React that requires loading it differently than any other JavaScript?

On the whole, React is a win for security, because XSS is by default impossible, due to the indirection provided by the Virtual DOM abstraction. As long as you (and your dependencies) don’t dangerouslySetInnerHTML, you’ll eliminate most XSS bugs.


The iframe was created for a different era of the web and it seems to be a constant source of security issues now. Would it be that bad to mark it as deprecated and completely drop support for it in a couple of years?


It is very common for websites to want to include some content from a different site, with a robust security boundary between them. Iframes have issues because security boundaries are hard.

A site that does not want to allow any iframes can already ban them with CSP.


you know iframe's can be sandboxed (still not the default tough)


Are other browsers affected?




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: