fullshield 1.7.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  All notable changes to FullShield are documented here.
4
4
 
5
+ ## 2.0.1 — 2026-10-26
6
+
7
+ ### Experimental
8
+
9
+ - Phase 532: `SAST-CRLF-001` behind `FULLSHIELD_EXPERIMENTAL_CRLF` (`scan --experimental-crlf`). Request data used as an HTTP header value. A literal value does not fire. Off by default.
10
+ - Phase 533: `SAST-MAIL-001` behind `FULLSHIELD_EXPERIMENTAL_MAIL` (`scan --experimental-mail`). Request data in a nodemailer, SendGrid, or Mailgun field. A literal field does not fire. Off by default.
11
+ - Phase 534: `SAST-FORMULA-001` behind `FULLSHIELD_EXPERIMENTAL_FORMULA` (`scan --experimental-formula`). Request data written through a csv package or to a `.csv` path. A literal row does not fire. Off by default.
12
+ - Phase 535: `SAST-BROWSER-001` behind `FULLSHIELD_EXPERIMENTAL_BROWSER` (`scan --experimental-browser`). Request data passed to Puppeteer or Playwright `goto`, `setContent`, or `pdf`. The flag is the existing phase 101 flag. A literal URL or HTML body does not fire. Off by default.
13
+ - Phase 536: `SAST-DYNIMPORT-001` behind `FULLSHIELD_EXPERIMENTAL_DYNIMPORT` (`scan --experimental-dynimport`). `import()` called with request data. A string-literal specifier does not fire. Off by default.
14
+
15
+ ## 1.8.0 — 2026-10-25
16
+
17
+ ### Fixes
18
+
19
+ - Phase 529: a `package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `yarn.lock`, or the same file in a workspace, that cannot be parsed does not abort the scan. Secrets, SAST, and config still run. A lockfile that parses keeps the same findings.
20
+ - Phase 531: the dev installs of `express` and `@modelcontextprotocol/sdk` resolve `body-parser` at 1.20.9 and 2.4.0, outside GHSA-27r3-jxmh-p828. No new runtime dependency. The scanner does not open a server.
21
+
5
22
  ## 1.7.0 — 2026-10-25
6
23
 
7
24
  ### New/changed stable findings — may change CI results; use --update-baseline
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # FullShield
2
2
 
3
- **v1.7.0.** One install for Node.js/TypeScript backends: detect → classify → report → notify → fix → gate (CI `--fail-on` + runtime monitor). It does not stop attacks by itself.
3
+ **v2.0.1.** One install for Node.js/TypeScript backends: detect → classify → report → notify → fix → gate (CI `--fail-on` + runtime monitor). It does not stop attacks by itself.
4
4
 
5
5
  **Headline: dependency reachability.** A lockfile CVE is not the same as an unused package. FullShield classifies each OSV hit as `reachable` (imported and called), `imported-not-called` (−1), `reachable-via-dependency` (lockfile path from an imported direct dep — **severity kept**, path shown, e.g. `express > body-parser > qs`), `not-imported` (−2, only when no such path exists), or `reachability-unknown` (severity kept) when the lockfile format has no parsed dependency edges. DevDependency-only vulns are `info` with a `dev-only` note unless production sources import the package. Pair it with `fullshield sbom --format cyclonedx`.
6
6
 
@@ -10,7 +10,7 @@ npx fullshield scan --json --fail-on high
10
10
  npx fullshield scan --sarif fullshield.sarif
11
11
  ```
12
12
 
13
- 1.7.0 is the version of this tree. The stable contract is [docs/stability.md](docs/stability.md). The 1.0.1 release moved values that only experimental flags produce out of Stable. Experimental flags stay off unless you set them. Do not treat a scan as a penetration test. Reviewed recall for untouched apps is not published. The stored Next.js cold scan is 71.7 seconds, above the 60-second target.
13
+ 2.0.1 is the version of this tree. The stable contract is [docs/stability.md](docs/stability.md). The 1.0.1 release moved values that only experimental flags produce out of Stable. Experimental flags stay off unless you set them. Do not treat a scan as a penetration test. Reviewed recall for untouched apps is not published. The stored Next.js cold scan is 71.7 seconds, above the 60-second target.
14
14
 
15
15
  **Supported runtime is Node.js >= 22.13.** `package.json` `engines` and `doctor` enforce that floor. `node:sqlite` runs without `--experimental-sqlite` from 22.13.0 (the module is still experimental and is loaded only by history/confirm, not by `--import` register).
16
16
 
@@ -243,6 +243,11 @@ app.use(shieldGuard({ mode: 'monitor', authRoutes: ['/login'] }));
243
243
  | `scan --experimental-markup` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_MARKUP=1`). `SAST-MARKUP-001`: `markdown-it` is constructed with `html: true` and `render` is called with request data, or `marked` / `marked.parse` is called with request data. The file must import that package. Literal markdown does not fire. Off by default. |
244
244
  | `scan --experimental-trust-host` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_TRUSTHOST=1`). `SAST-TRUSTHOST-001`: a file that mentions `next-auth`, `@auth/`, or `NextAuth` sets `trustHost: true`. `false` or omitted does not fire. Off by default. |
245
245
  | `scan --experimental-deep` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_DEEP=1`). Extra matches on the existing rules: `res.end` when the body contains HTML, `http.request` / `https.request` option objects, `Bun.file` and `fs` `glob` / `opendir`, `location`, `jwt.verify` with an empty or non-literal algorithm list, and `Object.assign` / `assign`. Off by default. Default `scan --json` is unchanged for these. |
246
+ | `scan --experimental-crlf` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_CRLF=1`). `SAST-CRLF-001`: request data used as the value of `setHeader`, `append`, `header`, `set`, or a `writeHead` header object. A literal value does not fire. A status code alone does not fire. Off by default. |
247
+ | `scan --experimental-mail` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_MAIL=1`). `SAST-MAIL-001`: `nodemailer`, `@sendgrid/mail`, or `mailgun.js` copies request data into `to`, `cc`, `bcc`, `subject`, `from`, `replyTo`, `html`, or `text`. A literal field does not fire. Off by default. |
248
+ | `scan --experimental-formula` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_FORMULA=1`). `SAST-FORMULA-001`: request data passed to `stringify`, `write`, `writeToPath`, or `format` from `csv-stringify`, `fast-csv`, `json2csv`, or `csv`, or written to a `.csv` path. A literal row does not fire. Off by default. |
249
+ | `scan --experimental-browser` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_BROWSER=1`). Sets the existing browser flag. `SAST-BROWSER-001`: `puppeteer`, `puppeteer-core`, `playwright`, or `@playwright/test` passes request data to `goto`, `setContent`, or `pdf`. A literal URL or HTML body does not fire. Phase 101 browser rules stay on this same flag. Off by default. |
250
+ | `scan --experimental-dynimport` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_DYNIMPORT=1`). `SAST-DYNIMPORT-001`: `import()` called with request data. A string-literal specifier does not fire. Off by default. |
246
251
  | `scan --experimental-frameworks` | **Experimental** Next.js / NestJS / Hono / Koa taint sources and AUTH (`FULLSHIELD_EXPERIMENTAL_FRAMEWORKS=1`). Default `scan` is unchanged. Runtime adapters: `fullshield/runtime/koa`, `fullshield/runtime/hono` (optional peers). |
247
252
  | `scan --experimental-classes` | **Experimental** extra vuln classes: ReDoS, deser, XXE, upload, cookies, CSRF, mass assignment, timing compare, hash cost, GraphQL, trust-proxy (`FULLSHIELD_EXPERIMENTAL_CLASSES=1`). Default `scan` is unchanged. |
248
253
  | `scan` crypto v2 | **Experimental** (`FULLSHIELD_EXPERIMENTAL_CRYPTO2=1`). `SAST-CIPHER-001`, `SAST-CIPHER-002`, `SAST-RSA-001`, and `SAST-JWT-002`: ECB and deprecated ciphers, literal IVs, literal symmetric keys, short RSA or secp192 keys, and JWTs with no expiry or a short HMAC secret. Off by default. |