# Risk map — rollup/rollup

> Canonical page: https://codevetter.com/unpack/rollup/risk-map

# Risk map — rollup/rollup

Scanned commit a77225f4b9ef88f20d26a32a3dc70954241f3fb6 (2026-10-02). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

The inspected security-sensitive boundaries are executable configuration/plugins, watch shell commands, filesystem access, native loading, and CI privilege transitions. These are source observations, not confirmed vulnerabilities. Filename validation provides a concrete output-path guard, while custom filesystem adapters determine actual I/O authority. Native/WASM parity and asynchronous watch ordering are broad correctness hotspots.
- CLI plugin arguments can execute new Function for inline plugin objects and argument expressions, then require/import packages; these inputs enter executable code paths. — [cli/run/commandPlugins.ts#L43-82](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/cli/run/commandPlugins.ts#L43-L82) [cli/run/commandPlugins.ts#L100-120](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/cli/run/commandPlugins.ts#L100-L120)
- Configuration files execute through dynamic import; transpilation writes code beside the config and cleanup errors are logged rather than awaited or rethrown. — [cli/run/loadConfigFile.ts#L75-92](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/cli/run/loadConfigFile.ts#L75-L92) [cli/run/loadConfigFile.ts#L163-180](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/cli/run/loadConfigFile.ts#L163-L180)
- CLI watch hooks execute user-supplied command strings with execSync; command failures are printed and suppressed. — [cli/run/watchHooks.ts#L16-33](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/cli/run/watchHooks.ts#L16-L33)
- Fallback resolution accepts absolute paths and follows symlinks unless preserveSymlinks is set; loading and writing use configured filesystem methods without a repository-root confinement check in those functions. — [src/utils/resolveId.ts#L49-84](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/utils/resolveId.ts#L49-L84) [src/ModuleLoader.ts#L280-297](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/ModuleLoader.ts#L280-L297) [src/rollup/rollup.ts#L312-322](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/rollup/rollup.ts#L312-L322)
- After generateBundle, Bundle validates bundle keys and differing entry filenames, rejecting normalized parent escapes, '.', and absolute paths before core writes. — [src/Bundle.ts#L97-103](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/Bundle.ts#L97-L103) [src/Bundle.ts#L368-392](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/Bundle.ts#L368-L392) [src/rollup/rollup.ts#L211-220](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/rollup/rollup.ts#L211-L220)
- NAPI parseAsync accepts AbortSignal, but browser and Node-WASM adapters ignore it and call synchronous parse; lint-native-js checks export-name presence in only one direction. — [rust/bindings_napi/src/lib.rs#L50-64](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/rust/bindings_napi/src/lib.rs#L50-L64) [browser/src/wasm.ts#L5-11](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/browser/src/wasm.ts#L5-L11) [native.wasm.js#L8-10](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/native.wasm.js#L8-L10) [scripts/lint-native-js.js#L14-20](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/scripts/lint-native-js.js#L14-L20)
- Hypothesis: changing watch running/rerun state or invalidation batching could lose changes or overlap asynchronous listeners; those exact boundaries have sequencing comments and dedicated regressions. (inferred) — [src/watch/watch.ts#L89-150](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/src/watch/watch.ts#L89-L150) [test/watch/index.js#L125-150](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/test/watch/index.js#L125-L150) [test/watch/index.js#L281-301](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/test/watch/index.js#L281-L301)
- The performance workflow uses pull_request_target and executes PR-head code, including in a report job with pull-requests:write; REPL upload uses a separate workflow_run job with OIDC and resolves PR identity through GitHub API. — [.github/workflows/performance-report.yml#L3-36](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/.github/workflows/performance-report.yml#L3-L36) [.github/workflows/performance-report.yml#L65-75](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/.github/workflows/performance-report.yml#L65-L75) [.github/workflows/performance-report.yml#L93-104](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/.github/workflows/performance-report.yml#L93-L104) [.github/workflows/repl-artefacts-upload.yml#L14-19](https://github.com/rollup/rollup/blob/a77225f4b9ef88f20d26a32a3dc70954241f3fb6/.github/workflows/repl-artefacts-upload.yml#L14-L19)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
