CVE-2026-27606
Critical · 9.8CVSS
9.8
EPSS
1.6%
Published
Feb 25, 2026
CISA due date
—
Cloudanix analysis
A flaw in a common JavaScript build tool can let a malicious build input overwrite files on the build machine, potentially allowing attackers to tamper with software releases or gain lasting access.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Remote Code Execution
- Component
- Library
- Class
- Path Traversal
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This vulnerability is an arbitrary file write caused by insufficient path sanitization in Rollup output filename handling. An attacker who can influence Rollup build inputs, named CLI inputs, manual chunk aliases, output names, or plugin-generated file names can include path traversal sequences such as ../ to make Rollup write outside the intended build output directory. The write occurs with the privileges of the build process, so impact depends on where Rollup is executed and what that process can modify. In CI/CD, developer workstations, or build servers, this can overwrite source files, package metadata, shell startup files, scheduled task definitions, service files, deployment artifacts, or other configuration files. If a written file is later executed or loaded, the issue can become persistent remote code execution through the build pipeline or affected host.
Why it matters to the business
Successful exploitation can compromise software build integrity and turn a normal JavaScript build process into a mechanism for overwriting sensitive files. This can lead to poisoned application releases, theft or manipulation of build outputs, persistent compromise of developer or CI systems, and downstream distribution of malicious code. The CVSS score is critical and public exploit capability is reported, but the issue is not currently listed in CISA KEV and EPSS is relatively low, so prioritization should focus first on internet-connected, automated, multi-tenant, or untrusted-code build environments. Because Rollup is widely used in JavaScript supply chains, affected dependencies may be present indirectly through frameworks, plugins, templates, and build tooling even when Rollup is not intentionally installed as a top-level package.
How an attack unfolds
An attacker first needs a path to influence a Rollup build. Common opportunities include submitting a malicious project, dependency, plugin, build configuration, pull request, package update, or command-line input that is processed by an automated build job or developer. The attacker sets a Rollup-controlled filename field to include traversal components such as ../ so that the resolved output path escapes the configured output directory. During the build, vulnerable Rollup versions fail to properly constrain the final write path and create or overwrite the attacker-selected file wherever the build process has permission. The attacker then targets files that will be read or executed later, such as application source files, package lifecycle scripts, shell configuration files, CI configuration, deployment artifacts, or service/task definitions. Persistence or code execution occurs when a developer shell, CI job, deployment step, runtime process, or package manager later loads the overwritten file.
How to fix it
Upgrade Rollup to a fixed release for the branch in use: 2.80.0 or later for 2.x, 3.30.0 or later for 3.x, and 4.59.0 or later for 4.x. If consuming Rollup directly from source, update to a revision that includes commit d17ae15336a45c3c59b2a4aacac2b14186035d28 or later. Regenerate lockfiles after upgrading and verify that transitive dependency resolution does not retain an affected Rollup version. Where immediate upgrade is not possible, restrict who can modify Rollup configuration, plugins, package scripts, and CI build inputs; run builds in isolated containers or sandboxes with least-privilege filesystem permissions; prevent build jobs from writing to user home directories, system paths, and shared deployment locations; and add policy checks that reject output filenames or chunk names containing path traversal sequences, absolute paths, or encoded traversal variants. Treat builds of untrusted pull requests, third-party packages, or external plugins as high risk until the upgrade is complete.
How to confirm the fix worked
Confirm the installed Rollup version with package manager inventory and lockfile review, checking package.json, package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, and generated software bills of materials. Validate that all resolved Rollup instances are at 2.80.0+, 3.30.0+, or 4.59.0+ as applicable, or that source builds include commit d17ae15336a45c3c59b2a4aacac2b14186035d28 or later. Run dependency scanners across application and build-tool repositories, including transitive dependencies. Review Rollup configuration and custom plugins for filename, chunk, asset, and output values that can be influenced by untrusted input. In CI/CD, confirm build jobs execute with restricted working directories and cannot write to sensitive filesystem locations. As a safe functional validation, use a non-production sandbox to verify that Rollup no longer emits files outside the configured output directory when given traversal-style names.
Typical attack path
- Identify a repository, package, plugin, or build workflow that uses a vulnerable Rollup version before 2.80.0, 3.30.0, or 4.59.0.
- Gain the ability to influence Rollup inputs, output names, manual chunk aliases, plugin-generated asset names, or build configuration.
- Insert path traversal sequences such as ../ into a filename value that Rollup will use for emitted files or chunks.
- Trigger the Rollup build locally, in CI/CD, or in another automated packaging environment.
- Cause Rollup to write outside the intended output directory and overwrite a file accessible to the build process.
- Choose a target file that is later executed, imported, sourced, deployed, or trusted by another process.
- Leverage the overwritten file for persistence, build artifact tampering, credential access, or code execution.
How to detect it
Investigate whether Rollup builds wrote files outside their expected output directories. Relevant sources include CI/CD job logs, build runner filesystem audit logs, endpoint detection telemetry, process command-line history, shell history, package manager logs, source-control diffs, artifact manifests, container filesystem layer changes, and file integrity monitoring alerts. Look for Rollup commands or configuration values containing traversal sequences, absolute paths in output-related fields, suspicious manual chunk names, unusual plugin-generated asset names, or build outputs created in parent directories. On build hosts, review recently modified files outside workspace and dist/build directories around Rollup execution times, especially shell startup files, package metadata, CI configuration, deployment scripts, service definitions, cron entries, SSH authorized_keys files, and application files that are later executed. Correlate process execution where node, npm, yarn, pnpm, npx, or rollup is followed by unexpected file writes to sensitive locations. For suspected compromise, compare artifacts against clean rebuilds from patched Rollup, review dependency/plugin changes immediately preceding the event, and rotate any secrets accessible to the build process.
- ../
- ..\\
- %2e%2e%2f
- %2e%2e/
- ..%2f
- ..%5c
- rollup -c
- node_modules/.bin/rollup
- node_modules/rollup
- manualChunks
- chunkFileNames
- assetFileNames
- entryFileNames
- output.file
- output.dir
- this.emitFile
- fileName: '../
- fileName: "../
- name: '../
- name: "../
- created ../
- created ..\\
- dist/../
- build/../
- package.json modified during Rollup build
- package-lock.json modified during Rollup build
- yarn.lock modified during Rollup build
- pnpm-lock.yaml modified during Rollup build
- ~/.bashrc
- ~/.profile
- ~/.zshrc
- ~/.ssh/authorized_keys
- /etc/cron.d/
- /etc/systemd/system/
What your security team should do
- Inventory all repositories, build images, CI jobs, developer tooling baselines, and package templates that include Rollup directly or transitively.
- Prioritize remediation for CI/CD runners, release pipelines, package publishing workflows, automated builds of untrusted pull requests, and environments that build third-party or user-supplied JavaScript.
- Upgrade Rollup to 2.80.0+, 3.30.0+, or 4.59.0+ and refresh lockfiles to remove vulnerable transitive copies.
- Temporarily block or quarantine builds that use untrusted Rollup plugins, externally supplied Rollup configuration, or filename/chunk naming patterns containing ../, ..\\, absolute paths, or encoded traversal sequences.
- Run builds in ephemeral, least-privilege containers with read-only source mounts where feasible and tightly scoped writable output directories.
- Search build logs, repository history, package scripts, and CI artifacts for suspicious traversal patterns in Rollup-related commands and configuration.
- Review recent build outputs and deployment artifacts for unexpected modifications outside normal output directories, especially around the first use of any new plugin or dependency update.
- If suspicious writes are found, rotate credentials available to the affected build job and rebuild release artifacts from a known-clean environment.
The record
Rollup is a module bundler for JavaScript. Versions prior to 2.80.0, 3.30.0, and 4.59.0 of 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. Versions 2.80.0, 3.30.0, and 4.59.0 contain a patch for the issue.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | rollup | 0 | 2.80.0 |
| npm | rollup | 3.0.0 | 3.30.0 |
| npm | rollup | 4.0.0 | 4.59.0 |
| Chainguard | langfuse-2 | 0 | 2.95.12-r12 |
| Chainguard | langfuse-2-worker | 0 | 2.95.12-r12 |
| Chainguard | langfuse-3 | 0 | 3.155.1-r3 |
| Chainguard | langfuse-3-worker | 0 | 3.155.1-r3 |
| Chainguard | langfuse-fips-2 | 0 | 2.95.12-r15 |
| Chainguard | langfuse-fips-2-worker | 0 | 2.95.12-r15 |
| Chainguard | langfuse-fips-3 | 0 | 3.155.1-r3 |
| Chainguard | langfuse-fips-3-worker | 0 | 3.155.1-r3 |
| Chainguard | librechat | 0 | 0.8.2-r6 |
| Chainguard | vitess-22 | 0 | 22.0.4-r2 |
| Chainguard | vitess-23 | 0 | 23.0.3-r2 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP7 | golang-github-prometheus-promu | 0 | 0.17.0-150000.3.30.1 |
| SUSE:Manager Client Tools 15 | dracut-saltboot | 0 | 1.1.0-150000.1.65.1 |
| SUSE:Manager Client Tools 15 | golang-github-QubitProducts-exporter_exporter | 0 | 0.4.0-150000.1.21.1 |
| SUSE:Manager Client Tools 15 | golang-github-boynux-squid_exporter | 0 | 1.13.0-150000.1.12.1 |
| SUSE:Manager Client Tools 15 | golang-github-lusitaniae-apache_exporter | 0 | 1.0.10-150000.1.26.1 |
| SUSE:Manager Client Tools 15 | golang-github-prometheus-prometheus | 0 | 3.5.0-150000.3.67.1 |
| SUSE:Manager Client Tools 15 | grafana | 0 | 11.6.11-150000.1.90.1 |
| SUSE:Manager Client Tools 15 | prometheus-blackbox_exporter | 0 | 0.26.0-150000.1.30.2 |
| SUSE:Manager Client Tools 15 | spacecmd | 0 | 5.0.15-150000.3.142.1 |
| SUSE:Manager Client Tools 15 | uyuni-tools | 0 | 0.1.38-150000.1.30.1 |
| SUSE:Manager Client Tools for SLE Micro 5 | dracut-saltboot | 0 | 1.1.0-150000.1.65.1 |
| SUSE:Manager Client Tools for SLE Micro 5 | golang-github-QubitProducts-exporter_exporter | 0 | 0.4.0-150000.1.21.1 |
| SUSE:Manager Client Tools for SLE Micro 5 | prometheus-blackbox_exporter | 0 | 0.26.0-150000.1.30.2 |
| SUSE:Manager Client Tools for SLE Micro 5 | uyuni-tools | 0 | 0.1.38-150000.1.30.1 |
| Wolfi | langfuse-3 | 0 | 3.155.1-r3 |
| Wolfi | langfuse-3-worker | 0 | 3.155.1-r3 |
| Wolfi | vitess-22 | 0 | 22.0.4-r2 |
| Wolfi | vitess-23 | 0 | 23.0.3-r2 |
| openSUSE:Leap 15.6 | dracut-saltboot | 0 | 1.1.0-150000.1.65.1 |
| openSUSE:Leap 15.6 | golang-github-QubitProducts-exporter_exporter | 0 | 0.4.0-150000.1.21.1 |
| openSUSE:Leap 15.6 | golang-github-boynux-squid_exporter | 0 | 1.13.0-150000.1.12.1 |
| openSUSE:Leap 15.6 | golang-github-lusitaniae-apache_exporter | 0 | 1.0.10-150000.1.26.1 |
| openSUSE:Leap 15.6 | golang-github-prometheus-promu | 0 | 0.17.0-150000.3.30.1 |
| openSUSE:Leap 15.6 | prometheus-blackbox_exporter | 0 | 0.26.0-150000.1.30.2 |
| openSUSE:Leap 15.6 | spacecmd | 0 | 5.0.15-150000.3.142.1 |
| openSUSE:Tumbleweed | heroic-games-launcher | 0 | 2.20.0-2.1 |
| openSUSE:Tumbleweed | velociraptor | 0 | 0.7.0.4.git185.a5708584-2.1 |
Related vulnerabilities
- GHSA-mw96-cpmx-2vgc Rollup 4 has Arbitrary File Write via Path Traversal Same vulnerability
- CVE-2024-47068 DOM Clobbering Gadget found in rollup bundled scripts that leads to XSS Also affects rollup
- GHSA-r5fr-rjxr-66jc lodash vulnerable to Code Injection via `_.template` imports key names Also affects langfuse-2
- GHSA-f23m-r3pf-42rh lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and `_.omit` Also affects langfuse-2
- CVE-2026-4800 Impact: The fix for CVE-2021-23337 (https://github.com/advisories/GHSA-35jh-r3h4-6jhm)… Also affects langfuse-2
- CVE-2026-2950 Impact: Lodash versions 4.17.23 and earlier are vulnerable to prototype pollution in the… Also affects langfuse-2
- GHSA-37ch-88jc-xwx2 path-to-regexp vulnerable to Regular Expression Denial of Service via multiple route… Also affects langfuse-2
- CVE-2026-33671 Picomatch is a glob matcher written JavaScript. Also affects langfuse-2