fullshield 1.3.1 → 1.5.0
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 +19 -0
- package/README.md +8 -4
- package/dist/agent.js +45 -43
- package/dist/cli/index.js +100 -98
- package/dist/compliance.js +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.js +72 -70
- package/dist/mcp.js +44 -42
- package/models/index.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to FullShield are documented here.
|
|
4
4
|
|
|
5
|
+
## 1.5.0 — 2026-10-24
|
|
6
|
+
|
|
7
|
+
### New/changed stable findings — may change CI results; use --update-baseline
|
|
8
|
+
|
|
9
|
+
- Phase 503: one object field and one nested function are part of the default scan. The nested function carries request data, not `process.argv`. A field counts on a read after the assignment. `FULLSHIELD_EXPERIMENTAL_FLOW2` and `scan --experimental-flow2` stay accepted and do not turn this off. Against 1.4.0, NodeGoat gains `SAST-XSS-001` at `app/views/allocations.html:15` and `app/views/login.html:110`. vulnerable-app stays 38, clean-app stays 0, and juice-shop, dvna, goof, and vulnerable-node stay the same.
|
|
10
|
+
- Phase 504: ORM raw queries, `` exec(`…${x}`) ``, `spawn` of `sh -c`, execa `shell: true`, and zx `$.raw` are part of the default scan. `FULLSHIELD_EXPERIMENTAL_SAST_GAPS` and `scan --experimental-sast-gaps` stay accepted and do not turn this off. No new rule id.
|
|
11
|
+
|
|
12
|
+
### Experimental
|
|
13
|
+
|
|
14
|
+
- Phase 505: `SAST-LDAP-001` behind `FULLSHIELD_EXPERIMENTAL_LDAP` (`scan --experimental-ldap`). A string-literal filter does not fire. Off by default.
|
|
15
|
+
- Phase 506: `CONFIG-CORS-002` behind `FULLSHIELD_EXPERIMENTAL_CORSREFLECT` (`scan --experimental-cors-reflect`). A fixed origin does not fire. `origin: '*'` with credentials stays `CONFIG-CORS-001`. Off by default.
|
|
16
|
+
|
|
17
|
+
## 1.4.0 — 2026-10-24
|
|
18
|
+
|
|
19
|
+
### Experimental
|
|
20
|
+
|
|
21
|
+
- Phase 501: `scan --diff` behind `FULLSHIELD_EXPERIMENTAL_DIFFSCAN`. The scan reads the changed file, one relative-literal import, and the files that import the changed file. A request value returned from the changed file still reaches a sink in the importer. A git failure is `FS-E018` and does not scan the rest of the tree. Default scan output is unchanged.
|
|
22
|
+
- Phase 502: one object field and one nested function behind `FULLSHIELD_EXPERIMENTAL_FLOW2`. Existing injection rules use that path. `JSON.parse` does not clear the value. Default scan output is unchanged.
|
|
23
|
+
|
|
5
24
|
## 1.3.1 — 2026-10-24
|
|
6
25
|
|
|
7
26
|
### Dev
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FullShield
|
|
2
2
|
|
|
3
|
-
**v1.
|
|
3
|
+
**v1.5.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.
|
|
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.
|
|
13
|
+
1.5.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.
|
|
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
|
|
|
@@ -85,7 +85,7 @@ Experimental RASP structure-change scoring on the vendored PayloadsAllTheThings
|
|
|
85
85
|
|
|
86
86
|
Path 51/51 and SSRF 39/39 on the same corpus. Benign corpus stays 0 blocked. Prefer `mode: 'monitor'`.
|
|
87
87
|
|
|
88
|
-
These fixtures are self-authored. Numeric SQL (`WHERE id = ` + input), ORM raw-query APIs (Prisma/Sequelize/Knex/TypeORM/Drizzle/`$where`), and template-literal shell (`exec(\`…${x}\`)`, `spawn('sh', ['-c', …])`, execa `shell: true`, zx `$.raw`) are covered in the attack corpus.
|
|
88
|
+
These fixtures are self-authored. Numeric SQL (`WHERE id = ` + input), ORM raw-query APIs (Prisma/Sequelize/Knex/TypeORM/Drizzle/`$where`), and template-literal shell (`exec(\`…${x}\`)`, `spawn('sh', ['-c', …])`, execa `shell: true`, zx `$.raw`) are covered in the attack corpus. Those ORM and shell sinks are part of the default scan. `FULLSHIELD_EXPERIMENTAL_SAST_GAPS` and `scan --experimental-sast-gaps` stay accepted and do not turn them off. Mongo `$where` strings are **stable** SAST (Juice Shop track-order / reviews).
|
|
89
89
|
|
|
90
90
|
In-scope public-bench patterns we still do not claim (one line each):
|
|
91
91
|
|
|
@@ -225,8 +225,12 @@ app.use(shieldGuard({ mode: 'monitor', authRoutes: ['/login'] }));
|
|
|
225
225
|
| `iac` | **Experimental** light IaC (`FULLSHIELD_EXPERIMENTAL_IAC=1`): GHA, Terraform, Kubernetes, docker-compose. Not a full IaC scanner. |
|
|
226
226
|
| `agent` | **Experimental** remediation agent (`FULLSHIELD_EXPERIMENTAL_AGENT=1`). Mock/localhost GitHub API + local git remote only — never a real network. Never merges, never pushes to `main`/`master`. `--max-prs` (default 3). |
|
|
227
227
|
| `scan --changed` / `--since` | **Experimental** incremental scan (`FULLSHIELD_EXPERIMENTAL_PLATFORM=1`). |
|
|
228
|
+
| `scan --diff` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_DIFFSCAN=1` or `--experimental-diffscan`). Scans git-changed JS/TS files, the files they import by a relative literal, and the files that import them the same way. One hop. A sink in an unchanged importer still reports when the changed file returns the request value. A git failure is `FS-E018` and does not scan the rest of the tree. Off, or `scan` without `--diff`, matches today's scan. |
|
|
229
|
+
| `scan --experimental-flow2` | **Stable.** One object field (`obj.a`) and one nested function are part of the default scan. `FULLSHIELD_EXPERIMENTAL_FLOW2` and this flag stay accepted and do not turn that off. `obj.b` stays clean. `JSON.parse` does not clear taint. Handlebars `{{ }}`, `res.json`, and a `url.includes` allowlist helper stay unflagged. |
|
|
228
230
|
| `dev` | **Experimental** save loop (`FULLSHIELD_EXPERIMENTAL_DEV=1`). Watches the project and prints only new and resolved findings. |
|
|
229
|
-
| `scan --experimental-sast-gaps` | **
|
|
231
|
+
| `scan --experimental-sast-gaps` | **Stable.** ORM raw SQL, `spawn('sh', ['-c'])`, execa `shell: true`, and zx `$.raw` are part of the default scan. `FULLSHIELD_EXPERIMENTAL_SAST_GAPS` and this flag stay accepted and do not turn that off. |
|
|
232
|
+
| `scan --experimental-ldap` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_LDAP=1`). `SAST-LDAP-001`: `search`, `compare`, `modify`, or `bind` on an LDAP client when the filter or DN is request data. A string-literal filter does not fire. Off by default. |
|
|
233
|
+
| `scan --experimental-cors-reflect` | **Experimental** (`FULLSHIELD_EXPERIMENTAL_CORSREFLECT=1`). `CONFIG-CORS-002`: `Access-Control-Allow-Origin` is the request `Origin` and credentials are allowed on that response. A fixed origin does not fire. `origin: '*'` with credentials stays `CONFIG-CORS-001`. Off by default. |
|
|
230
234
|
| `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). |
|
|
231
235
|
| `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. |
|
|
232
236
|
| `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. |
|