What is XSS?
Cross-site scripting (XSS) is an exploit where the attacker attaches code onto a legitimate website that will execute when the victim loads the website. That malicious code can be inserted in several ways. Most popularly, it is either added to the end of a url or posted directly onto a page that displays user-generated content. In more technical terms, cross-site scripting is a client-side code injection attack. https://www.cloudflare.com/learning/security/threats/cross-site-scripting/
Impact
One-click Lemmy account compromise by social engineering users to click your posts URL.
Reproduction
Lemmy does not properly sanitize URI’s on posts leading to cross-site scripting. You can see this working in action by clicking the “link” attached to this post on the web client.
To recreate, simply create a new post with the URL field set to: javascript:alert(1)//
Patching
Adding filtering to block javascript:
and data:
URI’s seems like the easiest approach.
Does the default CSP do anything to mitigate this?
https://github.com/LemmyNet/lemmy-ui/blob/9ce164245f51b834997f31f3f12497ee87474965/src/server/middleware.ts#L12
I believe if
unsafe-inline
were removed fromscript-src
then the CSP would block this.If the frontend depends on inline script tags then this likely can’t be changed super easily… The fact that
unsafe-eval
is inscript-src
is kinda worrying as well. Ideally you would lock the CSP down a lot more than they have.Aye, I am pretty sure CSP is bypass-able in most situations unless your pinning checksums or hashes. Just thought it might help take the edge off the hacker panic.
Yeah, it can certainly help in some cases, defense in depth and all that. If the CSP were ‘self’ (allowing any JS hosted on your domain) this would probably be DoA. Sadly, until the frontend stops using
<script>
to set things onwindow
to hydrate state from SSR to client-side they won’t be able to change it without breaking things.