Skip to main content

Gatsby Case Study

Verified baseline scan — CVE Lite CLI v1.18.1 · 2026-05-29

Gatsby logo

Summary

  • Project: Gatsby — React-based static site generator and open-source framework ecosystem (core, plugins, starters, and documentation tooling)
  • Revision: 1f38c85963fd6bcfa9ccee2f925e5e02b00eafbb
  • Lockfile: yarn.lock (3,568 resolved packages, Yarn Classic 1.22.19)
  • Baseline findings: 128 unique vulnerable packages (9 critical · 66 high · 42 medium · 11 low)
  • OSV advisory matches: 220 CVE/advisory entries deduplicated into 128 packages
  • Direct vs transitive: 5 direct / 123 transitive
  • Validated fix command groups generated: 2
  • First-pass coverage: 3 of 128 findings have confident copy-and-run commands
  • yarn audit (same lockfile): 281 vulnerability entries (25 critical · 123 high · 122 moderate · 11 low) across 1,629 audited packages
  • Remediation applied in this study: none — baseline scan and generated fix plan only

What this case study demonstrates

Gatsby is a long-running JavaScript monorepo that predates modern Yarn Berry workspaces and pnpm-first tooling. At 3,568 resolved packages on a Yarn Classic v1 lockfile, it is one of the largest snapshots in the CVE Lite CLI example set — larger than VS Code root (1,374), Turborepo (1,776), and Astro (2,228), and below Storybook-scale Berry graphs when those are present in the repo.

The direct/transitive split (5 direct, 123 transitive) shows where maintainers have immediate leverage versus where risk lives in legacy integration and build-tooling chains. CVE Lite surfaces Yarn Classic path limitations explicitly in coverage notes — dependency path reconstruction is limited compared to npm or pnpm lockfiles — yet still deduplicates 128 unique vulnerable packages with severity, relationship, and fix-target hints.

The nine critical findings are almost entirely transitive legacy packages typical of long-lived monorepos:

[email protected] — critical prototype pollution / RCE class advisories. Template compilation paths in older toolchain stacks.

[email protected], 2.1.4, 3.0.0 — critical unsafe random boundary generation. Multiple majors locked across HTTP client eras.

[email protected] — critical prototype pollution in webpack-era loader resolution.

@babel/[email protected] — critical compiler traversal advisory — deep in the Babel graph, not a root package.json direct dep.

[email protected], [email protected], [email protected] — critical legacy URL/XML/schema helpers buried in integration packages.

The five direct findings are where a maintainer can act from the root manifest without guessing parent chains:

CVE Lite validates [email protected] and [email protected] as high-severity direct upgrades and @babel/[email protected] as a medium direct upgrade. Additional direct js-yaml versions (3.7.0, 3.14.1, 4.1.0) appear as separate findings — a reminder that duplicate majors in Yarn Classic graphs can each carry advisories even when one upgrade path exists.


Comparison Note: CVE Lite CLI vs yarn audit

Both tools were run against the same yarn.lock on the same machine on 2026-05-29.

Metricyarn audit (1.22.19)CVE Lite CLI v1.18.1
Packages audited / parsed1,6293,568
Total reported findings281128
Critical259
High12366
Moderate / Medium12242
Low1111
Direct vs transitive breakdown✓ (5 / 123)
Deduplicated package view
Validated fix targets
Copy-and-run command groups✓ (2 groups)
Skipped findings with reason✓ (123 entries)

Why package counts differ: yarn audit reports 1,629 audited packages from its dependency tree walk. CVE Lite parses 3,568 resolved package entries from the lockfile graph — a broader resolved view of the same yarn.lock snapshot.

Why finding totals differ: yarn audit counts 281 vulnerability entries (advisory × path rows). CVE Lite counts 128 unique vulnerable package versions once each. Example: multiple form-data majors each appear as separate unique packages in CVE Lite; yarn audit may emit multiple rows per advisory path.

Severity mix: yarn audit reports 25 critical entries; CVE Lite reports 9 critical unique packages. Both flag the same underlying critical packages (handlebars, legacy form-data, loader-utils, etc.) — CVE Lite's critical column is per unique package version, not per audit row.

Fix guidance:

yarn audit does not produce validated, copy-and-run upgrade commands grouped by severity. CVE Lite generates:

…covering 3 of 128 findings on first pass. The remaining 123 are skipped with explicit reasons — mostly transitive chains without an auto-identified safe parent upgrade on Yarn Classic path reconstruction.


Before vs After

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

StageFindingsCriticalHighMediumLowDirectTransitiveCommand groups
Baseline (verified)128966421151232

Fix Journey

No commands were run for this study.

The first instinct on 9 critical findings is to run a bulk upgrade. CVE Lite's output makes the constraint visible: only 3 findings have confident first-pass commands from this lockfile-only snapshot. Critical packages like [email protected] and legacy [email protected] require parent-chain or upstream package maintainer decisions — not root yarn add guesses.

For [email protected] and [email protected], the direct upgrade path is immediate and validated.

For @babel/[email protected], CVE Lite scans 18 versions and notes 17 still known vulnerable on the advisory path — the command targets 7.26.10 as the validated non-vulnerable choice for this direct constraint.


Why this matters

Gatsby represents a large class of real-world repositories: Yarn Classic monorepos with years of integration packages, webpack-era tooling, and plugin ecosystems. Security teams still need to triage these graphs even as greenfield projects move to pnpm and Yarn Berry.

CVE Lite's value on this snapshot is triage at scale without pretending paths are complete: 128 deduplicated packages, explicit Yarn Classic limitations, 5 direct levers, and 123 skipped findings with reasons — versus 281 yarn audit rows without remediation grouping.


Scan command

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

cve-lite . --verbose --all

The example lockfile reflects Gatsby at revision 1f38c85963fd6bcfa9ccee2f925e5e02b00eafbb. 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/gatsby/ in the CVE Lite CLI repository.

FieldValue
Scan date2026-05-29
CLI versionv1.18.1
CVE Lite commandnode dist/index.js examples/gatsby --verbose --all --json
yarn audit commandyarn audit / yarn audit --json (yarn 1.22.19)
Advisory sourceOSV (https://api.osv.dev) — online mode
Lockfile sourceexamples/gatsby/yarn.lock from gatsbyjs/gatsby@1f38c85
Packages parsed (CVE Lite)3,568
Unique vulnerable packages (CVE Lite)128
Vulnerability entries (yarn audit)281
Fix command groups (CVE Lite)2
First-pass covered findings (CVE Lite)3
Skipped findings with reason (CVE Lite)123

Reproduce CVE Lite locally from the repository root:

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

Reproduce yarn audit from the example directory:

cd examples/gatsby
yarn audit
yarn audit --json

Both tools were run against the same yarn.lock on the same machine on 2026-05-29.


Remaining risk

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

  • 9 critical: @babel/traverse, three form-data versions, handlebars, json-schema, loader-utils, parse-url, xmldom
  • 66 high: including 2 direct ([email protected], [email protected]), plus transitive toolchain packages (axios, lodash, five path-to-regexp versions, three semver versions, html-minifier and xlsx with no fix, parse-git-config with no fix)
  • 42 medium: including 3 direct (@babel/[email protected], [email protected], [email protected]), plus five postcss versions, three qs versions, three uuid versions, vue-template-compiler (no fix)
  • 11 low: cookie (three versions), webpack, send, serve-static, and other legacy HTTP/tooling packages

Only 3 findings have first-pass copy-and-run commands. The other 125 require parent upgrades, manual upstream bumps, or acceptance of Yarn Classic path-reconstruction limits documented in the scan output.


Baseline findings

Full vulnerable package list from the verified scan on 2026-05-29 (revision 1f38c85):

PackageVersionSeverityRelationshipFix hintAdvisory IDs
@babel/traverse7.20.13criticaltransitive7.23.2CVE-2023-45133
form-data2.1.4criticaltransitive2.5.4CVE-2025-7783
form-data2.3.3criticaltransitive2.5.4CVE-2025-7783
form-data3.0.0criticaltransitive3.0.4CVE-2025-7783
handlebars4.7.7criticaltransitive4.7.9CVE-2026-33916, CVE-2026-33937…
json-schema0.2.3criticaltransitive0.4.0CVE-2021-3918
loader-utils0.2.17criticaltransitive1.4.1CVE-2022-37601
parse-url6.0.0criticaltransitive8.1.0CVE-2022-0722, CVE-2022-2216…
xmldom0.1.27criticaltransitive0.5.0CVE-2026-41673, CVE-2021-32796…
@babel/plugin-transform-modules-systemjs7.20.11hightransitive7.29.4CVE-2026-44728
@hapi/hoek6.2.4hightransitive8.5.1CVE-2020-36604
@xmldom/xmldom0.7.10hightransitive0.8.13CVE-2026-41673, CVE-2026-41674…
@xmldom/xmldom0.8.6hightransitive0.8.13CVE-2026-41673, CVE-2026-41674…
ansi-html0.0.7hightransitive0.0.8CVE-2021-23424
ansi-regex4.1.0hightransitive4.1.1CVE-2021-3807
axios1.13.5hightransitive1.15.2CVE-2025-62718, CVE-2026-42044…
body-parser1.20.1hightransitive1.20.3CVE-2024-45590
body-parser1.20.2hightransitive1.20.3CVE-2024-45590
braces2.3.2hightransitive3.0.3CVE-2024-4068
cross-spawn5.1.0hightransitive6.0.6CVE-2024-21538
cross-spawn7.0.3hightransitive7.0.5CVE-2024-21538
fast-json-patch3.0.0-1hightransitive3.1.1CVE-2021-4279
flatted3.1.0hightransitive3.4.2CVE-2026-32141, CVE-2026-33228
glob10.4.5highdirect10.5.0CVE-2025-64756
hoek6.1.3hightransitive8.5.1CVE-2020-36604
html-minifier4.0.0hightransitive⚠ no fixCVE-2022-37620
http-cache-semantics3.8.1hightransitive4.1.1CVE-2022-25881
immutable3.7.6hightransitive3.8.3CVE-2026-29063
ip1.1.5hightransitive1.1.9CVE-2024-29415, CVE-2023-42282
js-yaml3.7.0highdirect3.14.2CVE-2025-64718
json50.5.1hightransitive1.0.2CVE-2022-46175
json51.0.1hightransitive1.0.2CVE-2022-46175
jsonwebtoken8.5.1hightransitive9.0.0CVE-2022-23539, CVE-2022-23541…
jws3.2.2hightransitive3.2.3CVE-2025-65945
loader-utils3.2.0hightransitive3.2.1CVE-2022-37603, CVE-2022-37599
lodash4.17.21hightransitive4.18.0CVE-2026-2950, CVE-2026-4800…
lodash-es4.17.23hightransitive4.18.0CVE-2026-2950, CVE-2026-4800
lodash.set4.3.2hightransitive4.17.19CVE-2020-8203
lodash.template4.5.0hightransitive4.18.0CVE-2021-23337, CVE-2026-4800
minimatch3.1.2hightransitive3.1.4CVE-2026-27904, CVE-2026-26996…
multer2.0.1hightransitive2.1.1CVE-2026-3520, CVE-2025-7338…
node-fetch2.1.2hightransitive2.6.7CVE-2022-0235, CVE-2020-15168
normalize-url4.5.0hightransitive4.5.1CVE-2021-33502
nth-check1.0.1hightransitive2.0.1CVE-2021-3803
parse-git-config2.0.3hightransitive⚠ no fixCVE-2025-25975
parse-path4.0.1hightransitive5.0.0CVE-2022-0624
path-to-regexp0.1.10hightransitive0.1.13CVE-2026-4867, CVE-2024-52798
path-to-regexp0.1.12hightransitive0.1.13CVE-2026-4867
path-to-regexp0.1.7hightransitive0.1.13CVE-2026-4867, CVE-2024-45296…
path-to-regexp1.7.0hightransitive1.9.0CVE-2024-45296
path-to-regexp6.2.0hightransitive6.3.0CVE-2024-45296
picomatch2.3.1hightransitive2.3.2CVE-2026-33672, CVE-2026-33671
qs6.5.2hightransitive6.14.1CVE-2025-15284, CVE-2022-24999
semver6.3.0hightransitive6.3.1CVE-2022-25883
semver7.5.0hightransitive7.5.2CVE-2022-25883
semver7.5.1hightransitive7.5.2CVE-2022-25883
serialize-javascript4.0.0hightransitive7.0.3
serialize-javascript5.0.1hightransitive7.0.5CVE-2026-34043
serialize-javascript6.0.2hightransitive7.0.5CVE-2026-34043
socket.io-parser4.2.4hightransitive4.2.6CVE-2026-33151
svgo2.8.0hightransitive2.8.1CVE-2026-29074
tar4.4.19hightransitive7.5.11CVE-2026-24842, CVE-2026-26960…
terser4.8.0hightransitive4.8.1CVE-2022-25858
tmp0.0.33hightransitive0.2.6CVE-2025-54798, CVE-2026-44705
tmp0.2.5hightransitive0.2.6CVE-2026-44705
trim0.0.1hightransitive0.0.3CVE-2020-7753
trim-newlines1.0.0hightransitive3.0.1CVE-2021-33623
trim-newlines2.0.0hightransitive3.0.1CVE-2021-33623
ua-parser-js0.7.31hightransitive0.7.33CVE-2022-25927
validator13.9.0hightransitive13.15.22CVE-2025-56200, CVE-2025-12758
websocket-extensions0.1.3hightransitive0.1.4CVE-2020-7662
ws7.5.5hightransitive7.5.10CVE-2024-37890
ws8.11.0hightransitive8.20.1CVE-2024-37890, CVE-2026-45736
xlsx0.18.3hightransitive⚠ no fixCVE-2023-30533, CVE-2024-22363
y18n4.0.0hightransitive4.0.1CVE-2020-7774
@babel/helpers7.20.7mediumtransitive7.26.10CVE-2025-27789
@babel/runtime7.23.7mediumdirect7.26.10CVE-2025-27789
@babel/runtime-corejs37.10.3mediumtransitive7.26.10CVE-2025-27789
@octokit/plugin-paginate-rest1.1.2mediumtransitive9.2.2CVE-2025-25288
@octokit/request5.4.9mediumtransitive8.4.1CVE-2025-25290
@octokit/request-error1.0.4mediumtransitive5.1.1CVE-2025-25289
@octokit/request-error2.0.2mediumtransitive5.1.1CVE-2025-25289
@parcel/reporter-dev-server2.8.3mediumtransitive2.16.4CVE-2025-56648
ajv8.12.0mediumtransitive8.18.0CVE-2025-69873
brace-expansion1.1.12mediumtransitive1.1.13CVE-2026-33750
brace-expansion2.0.2mediumtransitive2.0.3CVE-2026-33750
express4.18.2mediumtransitive4.20.0CVE-2024-43796, CVE-2024-29041
file-type16.5.4mediumtransitive21.3.1CVE-2026-31808
follow-redirects1.15.11mediumtransitive1.16.0
got6.7.1mediumtransitive11.8.5CVE-2022-33987
hosted-git-info2.8.4mediumtransitive2.8.9CVE-2021-23362
js-yaml3.14.1mediumdirect3.14.2CVE-2025-64718
js-yaml4.1.0mediumdirect4.1.1CVE-2025-64718
katex0.12.0mediumtransitive0.16.21CVE-2024-28246, CVE-2024-28243…
micromatch3.1.10mediumtransitive4.0.8CVE-2024-4067
postcss5.2.18mediumtransitive8.5.10CVE-2021-23382, CVE-2023-44270…
postcss6.0.1mediumtransitive8.5.10CVE-2021-23382, CVE-2023-44270…
postcss6.0.23mediumtransitive8.5.10CVE-2021-23382, CVE-2023-44270…
postcss7.0.36mediumtransitive8.5.10CVE-2023-44270, CVE-2026-41305
postcss8.4.24mediumtransitive8.5.10CVE-2023-44270, CVE-2026-41305
prismjs1.29.0mediumtransitive1.30.0CVE-2024-53382
qs6.11.0mediumtransitive6.14.2CVE-2025-15284, CVE-2026-2391
qs6.13.0mediumtransitive6.15.2CVE-2025-15284, CVE-2026-8723…
qs6.14.1mediumtransitive6.15.2CVE-2026-8723, CVE-2026-2391
react-devtools-core4.20.2mediumtransitive4.28.4CVE-2023-5654
request2.88.2mediumtransitive3.0.0CVE-2023-28155
tough-cookie2.5.0mediumtransitive4.1.3CVE-2023-26136
tough-cookie3.0.1mediumtransitive4.1.3CVE-2023-26136
trim-off-newlines1.0.1mediumtransitive1.0.3CVE-2021-23425
uuid3.4.0mediumtransitive11.1.1CVE-2026-41907
uuid8.3.2mediumtransitive11.1.1CVE-2026-41907
uuid9.0.0mediumtransitive11.1.1CVE-2026-41907
vue-template-compiler2.7.14mediumtransitive⚠ no fixCVE-2024-6783
word-wrap1.2.3mediumtransitive1.2.4CVE-2023-26115
ws8.17.1mediumtransitive8.20.1CVE-2026-45736
yaml1.10.0mediumtransitive1.10.3CVE-2026-33532
yaml2.8.2mediumtransitive2.8.3CVE-2026-33532
@tootallnate/once2.0.0lowtransitive2.0.1CVE-2026-3449
cookie0.4.2lowtransitive0.7.0CVE-2024-47764
cookie0.5.0lowtransitive0.7.0CVE-2024-47764
cookie0.6.0lowtransitive0.7.0CVE-2024-47764
diff4.0.1lowtransitive4.0.4CVE-2026-24001
es5-ext0.10.53lowtransitive0.10.63CVE-2024-27088
min-document2.19.0lowtransitive2.19.1CVE-2025-57352
on-headers1.0.2lowtransitive1.1.0CVE-2025-7339
send0.18.0lowtransitive0.19.0CVE-2024-43799
serve-static1.15.0lowtransitive1.16.0CVE-2024-43800
webpack5.98.0lowtransitive5.104.1CVE-2025-68157, CVE-2025-68458

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.