Tsup version 4.8.8 brings subtle refinements to the developer experience compared to version 4.8.7 of this popular zero-config TypeScript bundler built on esbuild. Primarily, a new dependency on the 'debug' package at version ^4.3.1 has been introduced in 4.8.8, suggesting enhanced debugging capabilities for developers utilizing the library. While the core functionality likely remains similar, this addition points towards improved insights into the bundling process, potentially aiding in troubleshooting and optimization.
The 'debug' library empowers developers with more verbose logging and conditional debugging statements within the Tsup codebase itself. The new debug dependency allow Tsup maintainers to isolate and resolve issues more efficiently, benefitting the entire user base through a more robust and reliable tool.
Beyond the introduced dependency, the unpacked size of the distribution has been slightly reduced in version 4.8.8, coming in at 756408 bytes compared to 757715 bytes of the previous released. Both releases maintain the same file count. Also it is important to note that the release of the newest version happened almost an hour after the previous one. For developers already using Tsup, upgrading to version 4.8.8 could be beneficial to leverage the improved debugging and reliability features.
All the vulnerabilities related to the version 4.8.8 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.