Tsup is a zero-config bundler powered by esbuild, designed for modern TypeScript and JavaScript projects. Version 5.11.10 arrived just days after 5.11.9, sporting subtle but potentially impactful changes. A key update affects the development dependencies, with the "tsup" devDependency updated from version 5.11.8 to 5.11.9, ensuring consistent tooling across the project. The update includes some dependency upgrades such as "@swc/core" from version 1.2.112 to 1.2.124, addressing underlying compilation or transformation improvements. Furthermore, "fs-extra" gets a type definition update from "@types/fs-extra": "^9.0.11" to "@types/fs-extra":"^9.0.13", providing enhanced type safety and potentially resolving compatibility issues with newer file system operations. Svelte also benefits from an upgrade from version 3.37.0 to 3.44.3. Developers using tsup will appreciate that the core dependencies remain consistent between these versions, meaning smooth transitions without breaking fundamental build processes. This incremental upgrade shows the project's comitment to deliver small improvements to the developer experience as soon as they are developed and tested. Package size receives very subtle change from 470,027 to 470,167 unpacked, suggesting changes within the library or build process.
All the vulnerabilities related to the version 5.11.10 of the package
tsup DOM Clobbering vulnerability
A DOM Clobbering vulnerability in tsup v8.3.4 allows attackers to execute arbitrary code via a crafted script in the import.meta.url to document.currentScript in cjs_shims.js components
esbuild enables any website to send any requests to the development server and read the response
esbuild allows any websites to send any request to the development server and read the response due to default CORS settings.
esbuild sets Access-Control-Allow-Origin: *
header to all requests, including the SSE connection, which allows any websites to send any request to the development server and read the response.
https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L121 https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L363
Attack scenario:
http://malicious.example.com
).fetch('http://127.0.0.1:8000/main.js')
request by JS in that malicious web page. This request is normally blocked by same-origin policy, but that's not the case for the reasons above.http://127.0.0.1:8000/main.js
.In this scenario, I assumed that the attacker knows the URL of the bundle output file name. But the attacker can also get that information by
/index.html
: normally you have a script tag here/assets
: it's common to have a assets
directory when you have JS files and CSS files in a different directory and the directory listing feature tells the attacker the list of files/esbuild
SSE endpoint: the SSE endpoint sends the URL path of the changed files when the file is changed (new EventSource('/esbuild').addEventListener('change', e => console.log(e.type, e.data))
)The scenario above fetches the compiled content, but if the victim has the source map option enabled, the attacker can also get the non-compiled content by fetching the source map file.
npm i
npm run watch
fetch('http://127.0.0.1:8000/app.js').then(r => r.text()).then(content => console.log(content))
in a different website's dev tools.Users using the serve feature may get the source code stolen by malicious websites.