Skip to main content

n8n Case Study

Verified baseline scan — CVE Lite CLI v1.19.1 · 2026-06-02

n8n logo

Summary

  • Project: n8n — fair-code workflow automation platform with native AI capabilities, 400+ integrations, and a large TypeScript pnpm monorepo
  • Revision: e2e03948562e1c744be4ef7898b3b754fbdb6cf9
  • Lockfile: pnpm-lock.yaml (3,746 resolved packages, pnpm workspace monorepo)
  • Baseline findings: 32 unique vulnerable packages (0 critical · 13 high · 14 medium · 5 low)
  • OSV advisory matches: 53 CVE/advisory entries deduplicated into 32 packages
  • Direct vs transitive: 1 direct / 31 transitive
  • Validated fix command groups generated: 4
  • First-pass coverage: 4 of 32 findings have confident copy-and-run commands (one partial path on @tootallnate/once)
  • pnpm audit (same lockfile): 51 vulnerability entries (19 high · 25 moderate · 7 low)
  • Remediation applied in this study: none — baseline scan and generated fix plan only

What this case study demonstrates

n8n sits in the workflow automation / integration platform category — distinct from pure AI SDK monorepos (OpenAI Agents JS, Mastra) or UI tooling (Storybook, Lit). At 3,746 resolved packages, the graph is large but not the largest in the portfolio (Mastra: 4,555; Ghost: 4,447). The vulnerability profile mixes one direct toolchain finding with 31 transitive integration, email, editor, and build-tooling risks.

[email protected] — medium, direct. CVE Lite generates a validated direct upgrade:

That is the clearest “edit root manifest and rescan” outcome on this snapshot — the same class of finding as Vercel AI SDK and Mastra, but on a workflow platform where turbo orchestrates dozens of packages.

High-severity build and docs tooling: three minimatch majors, two rollup majors, [email protected], [email protected], serialize-javascript, svgo, tmp, and html-minifier — typical of a monorepo that ships editor UI, email templates (MJML), and frontend tooling. CVE Lite names validated targets (9.0.7, 4.59.0, 8.0.5, etc.) but most rows are skipped until parent packages (@n8n/* workspaces, Storybook consumers, bundler configs) ship safe releases.

@babel/[email protected] — high, with within-range refresh. CVE Lite generates:

pnpm update --recursive --no-save @babel/plugin-transform-modules-systemjs

This is a lockfile refresh pattern (v1.19.1 within-range transitive fix): the plugin’s declared range already permits 7.29.7+; no parent bump is required.

Email and content-safety cluster (medium): dompurify, mjml, nodemailer, markdown-it, showdown, element-plus, prismjs — risk relevant to user-supplied HTML/email in automation workflows, not abstract CVE noise.

SheetJS CDN tarball (xlsx) — high, unknown relationship: n8n pins xlsx from cdn.sheetjs.com rather than npm. CVE Lite still flags CVE-2023-30533 / CVE-2024-22363; remediation requires upstream packaging decisions, not a one-line pnpm add.

Partial parent upgrade on @tootallnate/once: pnpm add [email protected] covers one of five documented paths to @tootallnate/[email protected]; LangChain and Google Cloud storage chains remain after a single command.


Comparison Note: CVE Lite CLI vs pnpm audit

Both tools were run against the same pnpm-lock.yaml on the same machine on 2026-06-02 (Node.js 22+, pnpm 10.14.0).

Metricpnpm audit (10.14.0)CVE Lite CLI v1.19.1
Packages audited / parsed3,7463,746
Total reported findings5132
Critical00
High1913
Moderate / Medium2514
Low75
Direct vs transitive breakdown✓ (1 / 31)
Deduplicated package view
Parent package named per findingpartial (paths)
Specific copy-and-run commandspartial✓ (4 groups)
Skipped findings with reason✓ (28 entries)

Why the totals differ: pnpm audit counts 51 vulnerability entries (advisory × dependency path rows in metadata). CVE Lite counts 32 unique vulnerable package versions once each. Example: three minimatch majors are three rows in CVE Lite and multiple path rows in pnpm audit.

Severity bucketing: pnpm audit reports 19 high entries; CVE Lite reports 13 high unique packages. Path multiplication across editor, CLI, and integration packages inflates audit output without adding distinct remediation targets.

Fix guidance:

pnpm audit may suggest broad pnpm audit fix changes. CVE Lite separates four command groups — Babel within-range refresh, direct turbo, ESLint plugin-kit refresh, and partial jest-environment-jsdom parent upgrade — and 28 skipped rows explaining why rollup, vite, storybook, xlsx, and email-template packages need parent or upstream routing.


Before vs After

No remediation pass was performed for this study. This table records the verified baseline scan only.

StageFindingsCriticalHighMediumLowDirectTransitiveCommand groups
Baseline (verified)320131451314

Four command groups covering four findings (with partial coverage on one low finding) is a realistic first pass on a 3,746-package integration monorepo — the case study documents where triage time goes after the direct turbo bump.


Fix Journey

No commands were run for this study.

What a maintainer should do first:

  1. Run the direct command: pnpm add [email protected], then rescan.
  2. Run generated within-range refreshes: @babel/plugin-transform-modules-systemjs and @eslint/plugin-kit update commands.
  3. Evaluate [email protected] if test tooling is in scope — rescan for remaining @tootallnate/once paths via LangChain / GCP clients.
  4. Route high build-tooling (rollup, vite, storybook, minimatch) to owners of the workspaces that import them — not root pnpm add minimatch.
  5. Treat xlsx CDN pin separately — advisory fix may require changing how SheetJS is vendored, not a semver bump on npm.

What not to do:

  • pnpm audit fix --force across 3,746 packages without reviewing breaking changes in workflow nodes and editor UI.
  • pnpm add [email protected] at the monorepo root without validating which workspace owns each rollup major.

Why this matters

Teams running workflow automation platforms inherit dependency graphs from email rendering, rich text editors, AI/LLM clients, and frontend build pipelines — not just runtime API servers. n8n’s snapshot shows:

  1. One direct finding (turbo) maintainers can fix immediately from the root toolchain.
  2. Within-range transitive refresh (Babel plugin) that v1.19.1 surfaces correctly instead of suggesting a wrong parent upgrade.
  3. Integration-heavy transitive risk (MJML, DOMPurify, Nodemailer) where CVE IDs map to user-content safety, not devDependency noise.
  4. Non-npm tarball pins (xlsx from CDN) that scanners must still flag with explicit “unknown relationship” honesty.

For security engineers comparing platforms: n8n has more findings per package count than LangChain.js (13 / 2,174) but fewer than Storybook (92 / 3,008) — with a stronger direct-fix story than OpenAI Agents JS (0 direct).


Scan command

Run from the n8n repository root or from the examples/n8n directory in this repository:

cve-lite . --verbose --all

The example lockfile reflects n8n at revision e2e03948562e1c744be4ef7898b3b754fbdb6cf9. OSV advisory data changes over time — re-scanning may show different counts on the same revision.


Scan verification

Every number in this case study comes from a live scan of the committed fixture at examples/n8n/ in the CVE Lite CLI repository.

FieldValue
Scan date2026-06-02
CLI versionv1.19.1
CVE Lite commandnode dist/index.js examples/n8n --verbose --all --json
pnpm audit commandpnpm audit / pnpm audit --json (Node.js 22+, pnpm 10.14.0)
Advisory sourceOSV (https://api.osv.dev) — online mode
Lockfile sourceexamples/n8n/pnpm-lock.yaml from n8n-io/n8n@e2e0394
Packages parsed (CVE Lite)3,746
Unique vulnerable packages (CVE Lite)32
Vulnerability entries (pnpm audit metadata)51
Fix command groups (CVE Lite)4
First-pass covered findings (CVE Lite)4
Skipped findings with reason (CVE Lite)28

Reproduce CVE Lite locally from the repository root:

npm install
npm run build
node dist/index.js examples/n8n --verbose --all

Reproduce pnpm audit from the example directory (Node.js 22+ recommended):

cd examples/n8n
pnpm audit
pnpm audit --json

Both tools were run against the same pnpm-lock.yaml on the same machine on 2026-06-02.


Remaining risk

All 32 baseline findings remain open at the time of this study. No remediation was applied.

  • 13 high: Babel plugin, html-minifier, three minimatch versions, two rollup versions, serialize-javascript, storybook, svgo, tmp, vite, CDN xlsx
  • 14 medium: turbo (direct), dompurify, element-plus, file-type, ip-address, markdown-it, mjml, nodemailer, two postcss versions, prismjs, qs, showdown, uuid
  • 5 low: two @eslint/plugin-kit versions, two @tootallnate/once versions, elliptic

4 findings have first-pass commands (including partial @tootallnate/once coverage via jest-environment-jsdom); 28 require parent upgrades, upstream releases, or CDN packaging changes.


Baseline findings

Full vulnerable package list from the verified scan on 2026-06-02 (revision e2e0394):

PackageVersionSeverityRelationshipFix hintAdvisory IDs
@babel/plugin-transform-modules-systemjs7.29.0hightransitive7.29.4CVE-2026-44728
html-minifier4.0.0hightransitiveCVE-2022-37620
minimatch8.0.4hightransitive8.0.6CVE-2026-27904, CVE-2026-26996, CVE-2026-27903
minimatch9.0.1hightransitive9.0.7CVE-2026-27904, CVE-2026-26996, CVE-2026-27903
minimatch9.0.3hightransitive9.0.7CVE-2026-27904, CVE-2026-26996, CVE-2026-27903
rollup2.79.2hightransitive2.80.0CVE-2026-27606
rollup4.52.4hightransitive4.59.0CVE-2026-27606
serialize-javascript6.0.2hightransitive7.0.5CVE-2026-34043
storybook10.1.11hightransitive10.2.10CVE-2026-27148
svgo3.3.2hightransitive3.3.3CVE-2026-29074
tmp0.2.4hightransitive0.2.6CVE-2026-44705
vite8.0.2hightransitive8.0.5CVE-2026-39365, CVE-2026-39363, CVE-2026-39364
xlsxhttps://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgzhighunknownCVE-2023-30533, CVE-2024-22363
dompurify3.1.7mediumtransitive3.4.0CVE-2026-41239, CVE-2026-41240, CVE-2026-0540… (+3)
element-plus2.4.3mediumtransitive2.11.1CVE-2025-57665
file-type16.5.4mediumtransitive21.3.1CVE-2026-31808
ip-address9.0.5mediumtransitive10.1.1CVE-2026-42338
markdown-it13.0.2mediumtransitive14.1.1CVE-2026-2327
mjml4.15.3mediumtransitive5.0.0CVE-2025-67898
nodemailer7.0.11mediumtransitive8.0.5GHSA-c7w3-x93f-qmm8, GHSA-vvjj-xcjg-gr5g
postcss8.4.31mediumtransitive8.5.10CVE-2026-41305
postcss8.5.8mediumtransitive8.5.10CVE-2026-41305
prismjs1.29.0mediumtransitive1.30.0CVE-2024-53382
qs6.14.2mediumtransitive6.15.2CVE-2026-8723
showdown2.1.0mediumtransitiveCVE-2024-1899
turbo2.9.4mediumdirect2.9.14CVE-2026-45772, CVE-2026-45773
uuid10.0.0mediumtransitive11.1.1CVE-2026-41907
@eslint/plugin-kit0.2.8lowtransitive0.3.4GHSA-xffm-g5w8-qvg7
@eslint/plugin-kit0.3.2lowtransitive0.3.4GHSA-xffm-g5w8-qvg7
@tootallnate/once1.1.2lowtransitive2.0.1CVE-2026-3449
@tootallnate/once2.0.0lowtransitive2.0.1CVE-2026-3449
elliptic6.6.1lowtransitiveCVE-2025-14505

Want your project reviewed?

If you maintain an interesting JavaScript or TypeScript project and want CVE Lite CLI considered for a public case study, open an issue in the CVE Lite CLI repository.

Please include:

  • the repository link
  • why the project would make a useful case study
  • whether the dependency graph is publicly reproducible

Not every project will be selected. Preference will go to projects that are publicly useful, technically interesting, and strong examples of realistic dependency remediation workflows.