tsup version 6.1.0 introduces subtle refinements over its predecessor, version 6.0.1, continuing its focus on streamlining the TypeScript build process. Developers will appreciate the ongoing commitment to enhancing developer experience, though the changes between these specific versions might be more incremental than revolutionary. One notable difference is a slightly reduced unpacked size in the newer version (475372 bytes vs 478184 bytes), suggesting potential optimizations in the build process or dependency management.
Examining the devDependencies, a key difference emerges with tsup itself. Version 6.1.0 uses tsup version 6.0.1 as a dev dependency, while 6.0.1 uses tsup 5.12.5, hinting at internal testing against adjacent versions to ensure compatibility and smooth upgrades, or reflecting changes in the development workflow.
While the core dependencies seem largely consistent between the two versions – ensuring stability in fundamental functionalities like bundling and transpilation – developers should always consult the official changelog for a comprehensive understanding of any bug fixes, performance improvements, or minor API adjustments included in version 6.1.0. The update reflects tsup's dedication to staying current with the evolving JavaScript/TypeScript ecosystem, providing a reliable and efficient build tool for modern projects.
All the vulnerabilities related to the version 6.1.0 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.