fullshield 0.0.1 → 0.1.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +155 -1
  4. package/dist/agent.js +5737 -0
  5. package/dist/cli/index.js +8540 -0
  6. package/dist/compliance.js +126 -0
  7. package/dist/confirm.js +146 -0
  8. package/dist/dashboard.js +121 -0
  9. package/dist/iac.js +84 -0
  10. package/dist/incremental.js +13 -0
  11. package/dist/index.d.ts +334 -0
  12. package/dist/index.js +6180 -0
  13. package/dist/llm.js +105 -0
  14. package/dist/mcp.js +5831 -0
  15. package/dist/runtime/auto.js +1163 -0
  16. package/dist/runtime/express.js +229 -0
  17. package/dist/runtime/fastify.js +241 -0
  18. package/dist/runtime/index.js +216 -0
  19. package/dist/runtime/rasp/loader.js +14 -0
  20. package/dist/runtime/rasp.js +1339 -0
  21. package/dist/runtime/register.js +1171 -0
  22. package/dist/supply.js +228 -0
  23. package/dist/threat.js +63 -0
  24. package/dist/workspaces.js +23 -0
  25. package/package.json +85 -8
  26. package/rules/CONFIG-BODYLIMIT-001.md +9 -0
  27. package/rules/CONFIG-CORS-001.md +9 -0
  28. package/rules/CONFIG-DOCKER-ENV-001.md +9 -0
  29. package/rules/CONFIG-DOCKER-LATEST-001.md +9 -0
  30. package/rules/CONFIG-DOCKER-ROOT-001.md +9 -0
  31. package/rules/CONFIG-ERRSTACK-001.md +9 -0
  32. package/rules/CONFIG-HELMET-001.md +9 -0
  33. package/rules/CONFIG-INSTALLSCRIPT-001.md +9 -0
  34. package/rules/CONFIG-RATELIMIT-001.md +9 -0
  35. package/rules/DEPS-DEPRECATED-001.md +9 -0
  36. package/rules/DEPS-NOLOCK-001.md +9 -0
  37. package/rules/DEPS-TYPOSQUAT-001.md +9 -0
  38. package/rules/DEPS-VULN-001.md +9 -0
  39. package/rules/README.md +60 -0
  40. package/rules/SAST-AUTH-001.md +9 -0
  41. package/rules/SAST-CMDI-001.md +9 -0
  42. package/rules/SAST-CRYPTO-001.md +9 -0
  43. package/rules/SAST-EVAL-001.md +9 -0
  44. package/rules/SAST-JWT-001.md +9 -0
  45. package/rules/SAST-NOSQLI-001.md +9 -0
  46. package/rules/SAST-PATH-001.md +9 -0
  47. package/rules/SAST-PROTO-001.md +9 -0
  48. package/rules/SAST-REDIRECT-001.md +9 -0
  49. package/rules/SAST-SQLI-001.md +9 -0
  50. package/rules/SAST-SSRF-001.md +9 -0
  51. package/rules/SAST-XSS-001.md +9 -0
  52. package/rules/SECRET-AIKEY-001.md +9 -0
  53. package/rules/SECRET-AWS-001.md +9 -0
  54. package/rules/SECRET-DBURL-001.md +9 -0
  55. package/rules/SECRET-ENTROPY-001.md +9 -0
  56. package/rules/SECRET-ENVFILE-001.md +9 -0
  57. package/rules/SECRET-GITHUB-001.md +9 -0
  58. package/rules/SECRET-GOOGLE-001.md +9 -0
  59. package/rules/SECRET-JWT-001.md +9 -0
  60. package/rules/SECRET-PRIVKEY-001.md +9 -0
  61. package/rules/SECRET-SLACK-001.md +9 -0
  62. package/rules/SECRET-STRIPE-001.md +9 -0
  63. package/templates/fullshield.config.json +7 -0
  64. package/templates/github-watch.yml +15 -0
  65. package/templates/github-workflow.yml +19 -0
  66. package/templates/gitlab-ci.yml +11 -0
  67. package/templates/pre-commit.sh +11 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,77 @@
1
+ # Changelog
2
+
3
+ All notable changes to FullShield are documented here.
4
+
5
+ ## Unreleased
6
+
7
+ - Runtime requirement is Node.js **>= 22.13** (Node 20 is EOL). CI matrix is Node 22 and 24 on Linux, macOS, and Windows. `node:sqlite` is unflagged from 22.13.0 and is loaded only when history/confirm actually open a database — `node --import fullshield/runtime/register -e "1"` must not emit a SQLite `ExperimentalWarning`.
8
+ - Dashboard `HistoryDb.close()` releases `history.db` (Windows cannot unlink an open SQLite handle).
9
+ - Remediation agent runs `npm.cmd` on Windows and restores untracked files without `git checkout --`.
10
+
11
+ ## 0.1.0 — 2026-10-14
12
+
13
+ First public alpha (Core 1–10, Pro 11–16, Frontier 17–24 behind flags, harden-1–6).
14
+
15
+ **Shipped (stable):** scan (deps + reachability, secrets, SAST, config), reports, baseline, fix, runtime guard, watch, edge, SBOM, CI gate.
16
+
17
+ **Experimental flags (off by default):**
18
+ - `scan --ai explain` and `fix --ai` only. Explain never shows a verdict. `--ai triage` and `--ai logic` are not a CLI surface. Live Ollama is `FULLSHIELD_AI_LIVE=1` (never CI).
19
+ - `FULLSHIELD_EXPERIMENTAL_RASP=1` — structure-change sink hooks (`--import fullshield/runtime/register` or `import 'fullshield/runtime/auto'`).
20
+ - `FULLSHIELD_EXPERIMENTAL_VPATCH=1` — `scan --emit-virtual-patches`.
21
+ - `FULLSHIELD_EXPERIMENTAL_HONEY=1` — `honey init`.
22
+ - `FULLSHIELD_EXPERIMENTAL_SUPPLY=1` — `fullshield install` (static only).
23
+ - `FULLSHIELD_EXPERIMENTAL_CONFIRM=1` — localhost / 127.0.0.1 / FullShield-started container only.
24
+ - `FULLSHIELD_EXPERIMENTAL_MCP=1` — read-only MCP (`propose_fix` returns diffs only).
25
+ - `FULLSHIELD_EXPERIMENTAL_LLM=1` — `LLM-001`–`LLM-005`.
26
+ - `FULLSHIELD_EXPERIMENTAL_PLATFORM=1` — threat-model, `--changed`/`--since`, workspaces, local dashboard.
27
+ - `FULLSHIELD_EXPERIMENTAL_COMPLIANCE=1` — `report --compliance` (not a certification or audit).
28
+ - `FULLSHIELD_EXPERIMENTAL_IAC=1` — light IaC rules.
29
+ - `FULLSHIELD_EXPERIMENTAL_AGENT=1` — remediation agent (localhost mock API + local git only).
30
+
31
+ **Publishing:** npm trusted publishing (OIDC) stages with `--provenance`; a maintainer approves with 2FA. No `NPM_TOKEN`.
32
+
33
+ ### harden-5
34
+
35
+ - SSRF host normalization: IPv6 brackets, IPv4-mapped, decimal/octal/hex/short IPv4, trailing dots, resolve-at-connect, fetch redirect re-check.
36
+ - Attack corpus from PayloadsAllTheThings (vendored, attributed). Benign corpus ≥ 300. Per-category rates printed in verify.
37
+ - `RASP-SINKS.md` inventory. Async ALS tests (fs/promises, exec/spawn, sqlite, fetch, http). pg/mysql2 mocked query hooks.
38
+
39
+ ### harden-6
40
+
41
+ - `DEPS-MALICIOUS-001` for OSV `MAL-` / malicious classification: always critical, never downgraded by reachability or dev-only.
42
+ - Honeytokens: decoy-route hits are low + aggregated; only canary credential use is critical. Threat auto-block is opt-in with a max duration (shared-IP / NAT risk). `honey init` writes fake values that secrets do not flag and appends them to `.gitignore`.
43
+ - Official MCP SDK stdio (`fullshield mcp --stdio`) plus SDK-client tests.
44
+
45
+ ### Frontier (experimental)
46
+
47
+ - **Phase 24:** remediation agent (`FULLSHIELD_EXPERIMENTAL_AGENT=1`). Opens PRs via a localhost mock API against a local bare repo only. Never merges, never pushes to protected branches, stops on test failure.
48
+ - **Phase 23:** compliance mapping (OWASP/CWE/ASVS/PCI; every report says not a certification or audit) and light IaC (`FULLSHIELD_EXPERIMENTAL_COMPLIANCE=1` / `FULLSHIELD_EXPERIMENTAL_IAC=1`).
49
+ - **Phase 22:** threat-model, incremental `--changed`/`--since`, workspaces, local dashboard (`FULLSHIELD_EXPERIMENTAL_PLATFORM=1`). Dashboard binds 127.0.0.1 and validates Host.
50
+ - **Phase 21:** MCP server (`FULLSHIELD_EXPERIMENTAL_MCP=1`, read-only; `propose_fix` returns diffs only) and LLM-app rules `LLM-001`–`LLM-005` (`FULLSHIELD_EXPERIMENTAL_LLM=1`).
51
+ - **Phase 20:** exploit confirm (`FULLSHIELD_EXPERIMENTAL_CONFIRM=1`). Scope lock: localhost / 127.0.0.1 / FullShield-started container only (refuses public DNS names and IPv6). Harmless canaries for SQLi / CMDi / path / IDOR.
52
+ - **Phase 19:** supply-chain defense + `fullshield install` (`FULLSHIELD_EXPERIMENTAL_SUPPLY=1`). Static only (never executes packages). Seeded install-script + `.npmrc`/network heuristic, version-diff behavior change, cooldown, lockfile host, dependency confusion, provenance drop. Registry locked to `registry.npmjs.org`.
53
+ - **Phase 18:** virtual patches (`scan --emit-virtual-patches`, `FULLSHIELD_EXPERIMENTAL_VPATCH=1`), egress allowlist, `honey init` (`FULLSHIELD_EXPERIMENTAL_HONEY=1`), threat score log→challenge→block.
54
+ - **Phase 17 RASP:** structure-change sink hooks (`node:sqlite`, `child_process`, `fs`, `http(s)`/`fetch`, plus load-time wraps for `pg`/`mysql2`/…). Off unless `FULLSHIELD_EXPERIMENTAL_RASP=1`. Default `monitor`. Fail-open on hook errors. Activate with `--import fullshield/runtime/register` or `import 'fullshield/runtime/auto'`.
55
+
56
+ ### harden-4
57
+
58
+ - Live Ollama path behind `FULLSHIELD_AI_LIVE=1`; `npm run test:live-ai` is never CI. Honest results in `benchmarks/AI-REPORT.md`.
59
+ - Yarn/pnpm lockfile edges; `reachability-unknown` keeps severity when edges are missing.
60
+ - LRU caps on the rate-limiter IP map and anomaly route/param maps.
61
+ - Mutation-smoke covers EDGE-*, AI-INJECT-001, DEPS-NOLOCK-001, and interproc taint.
62
+ - README: `--ai` experimental; AI-INJECT-001 is a three-phrase heuristic.
63
+
64
+ ### Pro (11–16)
65
+
66
+ - `watch` alerts only on new OSV hits.
67
+ - `edge` GET/HEAD posture (CDN/WAF headers, HTTPS, security headers, exposure probes).
68
+ - AI provider layer (off by default). `AI-INJECT-001` phrase heuristic.
69
+ - Runtime anomaly baselines (no LLM).
70
+
71
+ ### Core (1–10) and harden-1–3
72
+
73
+ - Secrets, deps (OSV + typosquat), SAST taint (intra + interproc depth 5), config.
74
+ - Reachability: reachable / imported-not-called (−1) / reachable-via-dependency (kept) / not-imported (−2). Dev-only overlay.
75
+ - Reports: console, JSON, SARIF 2.1.0, Markdown, HTML.
76
+ - `fix --apply` snapshot restore; helmet/secret-env are `safe: false`.
77
+ - Runtime Express + Fastify guards. `init` and `notify`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FullShield contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1 +1,155 @@
1
- # fullshield - in development
1
+ # FullShield
2
+
3
+ **v0.1.0 / alpha.** 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
+
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
+
7
+ ```bash
8
+ npx fullshield scan
9
+ npx fullshield scan --json --fail-on high
10
+ npx fullshield scan --sarif fullshield.sarif
11
+ ```
12
+
13
+ This is a `0.x` release. APIs may change. Do not treat it as a penetration test.
14
+
15
+ **Requires Node.js >= 22.13.** `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
+
17
+ ## Coverage map
18
+
19
+ | Layer | Covered by |
20
+ |---|---|
21
+ | Code vulnerabilities | `sast` (intra-function + cross-file taint, depth 5) |
22
+ | Dependencies (now + new CVEs later) | `deps` (OSV + **reachability**) + `watch` |
23
+ | Secrets | `secrets` + `scan --staged` / pre-commit hook |
24
+ | App/server config | `config` |
25
+ | Live app-layer signals | `runtime` (`fullshield/runtime/express` or `/fastify`) in **monitor** mode; **experimental** RASP sink hooks via `--import fullshield/runtime/register` (fail-open; not a prevention guarantee) |
26
+ | Edge/DDoS layer | `edge` checks that a CDN/WAF **exists** (headers only). Actual DDoS mitigation is the CDN. |
27
+ | AI assist (opt-in, **experimental**) | `scan --ai explain` and `fix --ai` only. Off by default: zero AI network calls. Explain never shows a verdict. Triage and logic hunter are not shipped. |
28
+ | LLM-app code (opt-in, **experimental**) | `LLM-001`–`LLM-005` (`FULLSHIELD_EXPERIMENTAL_LLM=1`). Phrase/AST heuristics, not a jailbreak defense. |
29
+ | Supply-chain install (opt-in, **experimental**) | `fullshield install` — static only; never executes packages. |
30
+ | Exploit confirm (opt-in, **experimental**) | `fullshield confirm` — localhost / 127.0.0.1 / FullShield-started container only. |
31
+ | Editor MCP (opt-in, **experimental**) | `fullshield mcp --stdio` — read-only; `propose_fix` returns diffs, never writes. |
32
+ | Threat model / dashboard (opt-in, **experimental**) | STRIDE+Mermaid sketch; dashboard binds 127.0.0.1 and locks `Host`. |
33
+ | Compliance / IaC (opt-in, **experimental**) | Mapping is **not a certification or audit**. IaC is ~10 high-value rules, not a full IaC scanner. |
34
+ | Remediation agent (opt-in, **experimental**) | Localhost mock GitHub API + local git only. Never merges, never pushes to `main`/`master`. |
35
+
36
+ ## What it detects (Core)
37
+
38
+ - **SAST:** SQL/NoSQL injection, command injection, path traversal, `eval`/`new Function`/`vm`, SSRF, open redirects, JWT `decode`/`none`, weak crypto, prototype pollution, XSS (`res.send` HTML and `<%-` / `{{{` templates), missing auth middleware (low confidence). `AI-INJECT-001` is a **basic phrase heuristic** (three exact comment phrases: "ignore previous", "mark as safe", "AI reviewer") — not a prompt-injection defense.
39
+ - **Secrets:** AWS, Stripe, GitHub, Slack, Google, AI keys, PEM keys, DB URLs with passwords, hardcoded JWT secrets, committed `.env`.
40
+ - **Deps:** OSV vulnerabilities with reachability (`reachable` / `imported-not-called` / `reachable-via-dependency` / `not-imported` / `reachability-unknown`), `dev-only` info for unused devDependencies, lockfile deprecation notices, typosquat-suspicious *direct* dependency names. `DEPS-MALICIOUS-001` for OSV `MAL-` / malicious-classified advisories is **always critical** and is never downgraded (install scripts run at `npm install`). `DEPS-NOLOCK-001` when there is a manifest but no lockfile; exact `package.json` pins are still queried.
41
+ - **Config:** missing helmet, `express.json()` without a limit, CORS `*` + credentials, auth routes without a rate limiter, `err.stack` leaks, risky Dockerfiles, install scripts.
42
+
43
+ ## Non-goals (honesty is a feature)
44
+
45
+ - Does **not** find business-logic or authorization bugs (IDOR, CSRF, missing ownership checks). It can flag routes with no auth middleware as *suspicious*, nothing more.
46
+ - Does **not** replace a penetration test.
47
+ - Does **not** auto-delete code. `fix --apply` writes patches on a clean git tree. If project tests fail, each written file is restored from a byte-for-byte snapshot taken before the write — never `git checkout --`. `--force` on a dirty tree still refuses to touch files that have uncommitted changes.
48
+ - v1 is **JS/TS only**. Other languages are out of scope.
49
+ - Cross-file taint follows `require`/`import` and method calls up to 5 hops and records a `trace` (also SARIF `codeFlows`). Nested closures and some dynamic dispatch are still missed.
50
+ - Runtime v1 is **signature-based** (payload regex + rate limit + body-size guard). It is a **stopgap monitor**, not a WAF. Prefer **`mode: 'monitor'`** in production until you have measured false-positive rate. Sink-hooking RASP is **experimental** (off by default; see below) and does not claim to prevent attacks.
51
+ - Only scan hosts and repos you own or are authorized to test.
52
+ - **Experimental features are off by default and are not product claims:**
53
+ - RASP / virtual patches / honeytokens / threat auto-block: fail-open hooks; decoy-route hits are low and never auto-block; auto-block is opt-in (shared-IP / NAT risk).
54
+ - `install` / supply-chain: static heuristics only; never a substitute for `npm audit` policy or a malware sandbox.
55
+ - `confirm`: harmless canaries on localhost only; fail-open (`unconfirmed` is not a pass).
56
+ - MCP / LLM-app rules: editor glue and shallow AST/phrase checks. Not a prompt-injection or tool-abuse guarantee.
57
+ - Threat-model / incremental / dashboard: a route sketch and a local history UI. Not a STRIDE workshop or a hosted SOC.
58
+ - `report --compliance` / `iac`: evidence-style mapping and a short IaC ruleset. **Not a certification or audit.**
59
+ - `agent`: opens PRs against a **mock/localhost API and a local git remote**. It never talks to real GitHub, never merges, never pushes to protected branches.
60
+
61
+ ## Known limitations
62
+
63
+ Experimental RASP structure-change scoring on the vendored PayloadsAllTheThings corpus (not a claim that live attacks are blocked):
64
+
65
+ - **SQL 42/42.** Quote-breakouts inside `'…'` (`' OR 1=1 --`, `'; DROP TABLE x; --`) are detected. Payloads `"-"`, `" "`, `"&"`, `"^"` were moved to the benign set: they stay inside one single-quoted string token and are not exploitable in that sink.
66
+ - **Shell 45/45.** Quote-breakouts that close a quoted `ls` argument (`'; id; '`, `"; id; "`) are detected. Payloads `";id;"`, `';id;'`, `"|id|"`, `'|id|'` were moved to the benign set: `;` / `|` stay inside one quoted word.
67
+
68
+ Path 51/51 and SSRF 39/39 on the same corpus. Benign corpus stays 0 blocked. Prefer `mode: 'monitor'`.
69
+
70
+ These fixtures are self-authored and cover **string-concatenation sinks only**. Untested contexts include numeric SQL (`WHERE id = ` + input), ORM raw queries, and template-literal shell calls.
71
+
72
+ ## Quick start
73
+
74
+ ```bash
75
+ npm i -D fullshield
76
+ npx fullshield init
77
+ npx fullshield scan --fail-on high
78
+ ```
79
+
80
+ Library:
81
+
82
+ ```ts
83
+ import { scan } from 'fullshield';
84
+ const result = await scan({ cwd: process.cwd() });
85
+ ```
86
+
87
+ Runtime (does not load the scanner). **Signature-based stopgap — monitor mode recommended.**
88
+
89
+ ```ts
90
+ import express from 'express';
91
+ import { shieldGuard } from 'fullshield/runtime/express';
92
+
93
+ const app = express();
94
+ app.use(shieldGuard({ mode: 'monitor', authRoutes: ['/login'] }));
95
+ ```
96
+
97
+ **Experimental Frontier (off by default):** `FULLSHIELD_EXPERIMENTAL_VPATCH=1` + `scan --emit-virtual-patches`; `FULLSHIELD_EXPERIMENTAL_HONEY=1` + `fullshield honey init`.
98
+
99
+ **Experimental RASP** (Frontier, off by default): structure-change sink hooks via `node --import fullshield/runtime/register app.js` or `import 'fullshield/runtime/auto'` as the first import. Enable only with `FULLSHIELD_EXPERIMENTAL_RASP=1`. Default mode is `monitor` (events only). `FULLSHIELD_RASP_MODE=block` throws on structure-changing SQL/shell/path/NoSQL/SSRF/prototype input. Hooks **fail open**: a hook error logs `RASP-FAIL-OPEN-001` and the original call proceeds. Do not use block mode in production until you have measured the benign corpus on your app.
100
+
101
+ `npm run bench` reports `inspect()` p50/p95 (must stay under 1ms) and full Express request overhead p50/p95 with the middleware on the stack.
102
+
103
+ ## Commands
104
+
105
+ | Command | Purpose |
106
+ |---|---|
107
+ | `scan` | Run deps, secrets, sast, config. `--json`, `--sarif`, `--markdown`, `--html`, `--fail-on`, `--offline`, `--staged`, `--update-baseline`. `--ai explain` is **experimental** (off by default; explanation text only, never a verdict) |
108
+ | `fix` | Dry-run patches (unsafe suggestions included). `--apply` writes only `safe: true` patches on a clean git tree. `--unsafe` is required for `helmet()` insertion and secret → `process.env` replacement. `--force` skips files with uncommitted changes. `--ai` is **experimental**: drafts a verified, reviewable diff for findings without a rule-based fix (never auto-merged). |
109
+ | `init` | Config + GitHub/GitLab CI + pre-commit hook |
110
+ | `notify` | Slack / generic webhook / SMTP summary of the last scan |
111
+ | `sbom` | CycloneDX 1.5 JSON (`--format cyclonedx`, `--out file`) |
112
+ | `watch` | Rescan dependencies; alert (webhook / exit 1) only on **new** OSV hits vs last scan. `init` writes a daily GitHub Action. |
113
+ | `edge` | GET/HEAD posture check on a URL you pass: CDN/WAF, HTTPS redirect, security headers, `/.env` / `/.git` exposure. No crawl, no payloads. |
114
+ | `install` | **Experimental** install-guard (`FULLSHIELD_EXPERIMENTAL_SUPPLY=1`). Static analysis only; never runs package scripts. Registry reads are `registry.npmjs.org` only. |
115
+ | `confirm` | **Experimental** exploit confirm (`FULLSHIELD_EXPERIMENTAL_CONFIRM=1`). localhost / 127.0.0.1 / FullShield-started container only. Harmless canaries only. |
116
+ | `mcp` | **Experimental** MCP server (`FULLSHIELD_EXPERIMENTAL_MCP=1`). Official `@modelcontextprotocol/sdk` stdio: `fullshield mcp --stdio`. Read-only tools: `scan`, `get_findings`, `explain_finding`, `propose_fix` (diff only, never writes), `verify_fix` (temp copy). |
117
+ | `honey init` | **Experimental** honeytokens (`FULLSHIELD_EXPERIMENTAL_HONEY=1`). Decoy routes are **low** severity and aggregated per IP; only use of a canary **credential** is critical. Auto-block is off unless `threatAutoBlock` is set (shared-IP / NAT risk; max duration applies). Decoys are fake values added to `.gitignore`. |
118
+ | `threat-model` | **Experimental** STRIDE + Mermaid (`FULLSHIELD_EXPERIMENTAL_PLATFORM=1`). |
119
+ | `report --serve` | **Experimental** local dashboard (`FULLSHIELD_EXPERIMENTAL_PLATFORM=1`). Binds **127.0.0.1 only** and rejects any `Host` other than localhost/127.0.0.1 (DNS rebinding). No state-changing GET. |
120
+ | `report --compliance pci` | **Experimental** evidence-style mapping (`FULLSHIELD_EXPERIMENTAL_COMPLIANCE=1`). **Not a certification or audit.** |
121
+ | `iac` | **Experimental** light IaC (`FULLSHIELD_EXPERIMENTAL_IAC=1`): GHA, Terraform, Kubernetes, docker-compose. Not a full IaC scanner. |
122
+ | `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). |
123
+ | `scan --changed` / `--since` | **Experimental** incremental scan (`FULLSHIELD_EXPERIMENTAL_PLATFORM=1`). |
124
+
125
+ Inline ignore (reason required): `// fullshield-ignore SAST-SQLI-001: reviewed`
126
+
127
+ ## Rule docs
128
+
129
+ See [`rules/README.md`](rules/README.md).
130
+
131
+ ## Benchmarks
132
+
133
+ Honest NodeGoat / DVNA results (what we found and what we missed) live in [`benchmarks/REPORT.md`](benchmarks/REPORT.md). Live Ollama smoke results (not CI) live in [`benchmarks/AI-REPORT.md`](benchmarks/AI-REPORT.md).
134
+
135
+ ### Cursor MCP (`mcp.json`)
136
+
137
+ ```json
138
+ {
139
+ "mcpServers": {
140
+ "fullshield": {
141
+ "command": "npx",
142
+ "args": ["fullshield", "mcp", "--stdio"],
143
+ "env": { "FULLSHIELD_EXPERIMENTAL_MCP": "1" }
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ `propose_fix` returns a diff only. It never writes your tree.
150
+
151
+ See [`SECURITY.md`](SECURITY.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), and [`RELEASING.md`](RELEASING.md).
152
+
153
+ ## License
154
+
155
+ MIT