guardvibe 3.26.0 → 3.28.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 CHANGED
@@ -5,6 +5,22 @@ All notable changes to GuardVibe are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.28.0] - 2026-06-25
9
+
10
+ ### Added — 1 rule from daily intel: i18next missing-key prototype pollution (450 → 451 rules)
11
+ - **VG1097 — i18next missing-key prototype pollution (CVE-2026-48713 / CVE-2026-48714, critical).** Two i18next missing-key handlers write attacker-supplied key segments onto `Object.prototype`: `i18next-fs-backend` before 2.6.6 (GHSA-2933-q333-qg83) persists `__proto__.polluted`-style keys, and `i18next-http-middleware` before 3.9.7 (GHSA-f49m-vf83-692w) blocks literal `__proto__` but not dotted variants that downstream backends split on `keySeparator`. Both published 2026-06-25. Distinct from the existing `i18next-http-backend` path-traversal rule (different package). 0-FP semver: a caret on the current major (^2 / ^3) and a tilde within the fixed minor resolve to the patched release, so only exact/= pins and ranges that stay in the vulnerable line are flagged. CVE version-pin rule count 77 → 78. 16 tests.
12
+
13
+ Gate green (build / lint / test / self-audit PASS / A / 0).
14
+
15
+ ## [3.27.0] - 2026-06-25
16
+
17
+ ### Improved — AST engine: multi-hop SQL-injection taint (no rule/tool count change: 450 rules / 39 tools)
18
+ - **Multi-hop bare-variable SQL sinks.** Dataflow analysis now catches the case where a user-tainted SQL string is built into a *variable* and that bare variable is passed to a query sink (`const q = "SELECT ... " + req.body.x; db.sequelize.query(q)`). The inline taint patterns only match the dangerous string when it appears literally in the sink call, so they missed the variable-indirection (multi-hop) shape; the AST locates sinks whose first argument is a bare identifier and confirms it is a tainted SQL string before reporting.
19
+ - **High precision / zero-FP guarding:** reports only when the variable is user-tainted *and* its definition is provably a SQL string (carries SQL keywords) — a parameterized query (`db.query(q, [userVal])`) stays silent (the SQL string has no tainted source; the user value rides the bind array), as does a non-SQL `.query(opts)` or a sanitizer-wrapped service-layer build. Deterministic (bundled TypeScript parser).
20
+ - Corpus delta: 1 real SQL-injection caught that the inline patterns missed, zero false positives, zero drift on other rules. 7 new tests.
21
+
22
+ Gate green (build / lint / test / self-audit PASS / A / 0).
23
+
8
24
  ## [3.26.0] - 2026-06-25
9
25
 
10
26
  ### Improved — AST engine: inter-procedural & nested ownership for BOLA/IDOR (no rule/tool count change: 450 rules / 39 tools)
package/README.md CHANGED
@@ -9,13 +9,13 @@
9
9
  > **Security infrastructure your AI can't be.**
10
10
  > No matter how good your coding agent gets, it can't know the CVE published after its training cutoff, it can't deterministically guarantee the same check every run, it can't hold your whole repo in context, and it can't objectively review its own code. GuardVibe does all four — the deterministic, post-cutoff-current, whole-repo, author-independent verification layer for AI-written code.
11
11
 
12
- - **🗓️ Knows what your AI doesn't.** CVE rules refreshed **daily** from GHSA / OSV.dev / CISA KEV — GuardVibe flags vulnerable dependencies published *after* your model's training cutoff. (77 CVE rules, `npm run intel` daily triage.)
12
+ - **🗓️ Knows what your AI doesn't.** CVE rules refreshed **daily** from GHSA / OSV.dev / CISA KEV — GuardVibe flags vulnerable dependencies published *after* your model's training cutoff. (78 CVE rules, `npm run intel` daily triage.)
13
13
  - **🎯 Deterministic, not probabilistic.** Same code = same result, every run (content-hashed). Your AI guesses; GuardVibe doesn't.
14
14
  - **🗺️ Sees the whole repo.** Cross-file taint + auth-coverage across every route — catches the unprotected endpoint your agent's narrow context missed.
15
15
  - **🔍 An independent second pair of eyes.** The thing that wrote the code can't review itself. GuardVibe is the outside checker on AI-written code — in the loop *while* your AI codes (real-time edit hook), not after.
16
16
  - **⬅️ NEW: Starts before the first line of code.** Every scanner on earth — including your agent reviewing itself — acts *after* the code exists. [`secure_prompt`](#prompt-level-security-shift-left) acts *before*: it analyzes the coding prompt itself, detects the stack and attack surfaces it implies, and embeds severity-ranked GuardVibe requirements into the prompt your AI executes. The vulnerability is prevented, not caught. Deterministic, zero LLM calls — and if the prompt is already secure, it passes through untouched.
17
17
 
18
- **The security MCP built for vibe coding.** 450 security rules, 39 tools covering the entire AI-generated code journey — from the prompt itself to production deployment.
18
+ **The security MCP built for vibe coding.** 451 security rules, 39 tools covering the entire AI-generated code journey — from the prompt itself to production deployment.
19
19
 
20
20
  Works with **Claude Code, Cursor, Gemini CLI, Codex, VS Code (Copilot), Windsurf**, and any MCP-compatible coding agent.
21
21
 
@@ -27,11 +27,11 @@ Works with **Claude Code, Cursor, Gemini CLI, Codex, VS Code (Copilot), Windsurf
27
27
 
28
28
  Most security tools are built for enterprise security teams. GuardVibe is built for **you** — the developer using AI to build and ship web apps fast.
29
29
 
30
- - **450 security rules, 39 tools** purpose-built for the stacks AI agents generate
30
+ - **451 security rules, 39 tools** purpose-built for the stacks AI agents generate
31
31
  - **Zero setup friction** — `npx guardvibe` and you're scanning
32
32
  - **No account required** — runs 100% locally, no API keys, no cloud
33
33
  - **Understands your stack** — not generic SAST, but rules that know Next.js, Supabase, Stripe, Clerk, and the tools you actually use
34
- - **CVE version intelligence** — detects 77 known vulnerable package versions in package.json, refreshed every day from GHSA / OSV.dev / CISA KEV
34
+ - **CVE version intelligence** — detects 78 known vulnerable package versions in package.json, refreshed every day from GHSA / OSV.dev / CISA KEV
35
35
  - **AI agent & MCP security** — detects MCP server vulnerabilities, tool-description prompt injection (OWASP MCP Top 10), model-controlled sandbox-disable flags, excessive AI permissions, indirect prompt injection
36
36
  - **Auto-fix suggestions** — `fix_code` tool returns concrete patches and structured edits the AI agent can apply mechanically. Coverage: hardcoded credentials → env-var migration; public-prefix LLM keys (`NEXT_PUBLIC_/VITE_/EXPO_PUBLIC_/REACT_APP_`) → prefix removal; CORS wildcards → env allowlist; `dangerouslyAllowBrowser` flags → drop; sandbox bypass flags (`unsafe`/`noSandbox`/`allowEval`) → drop; agent loops → add `maxSteps`; raw-HTML React props → `<ReactMarkdown>`; missing auth checks → insert auth guard; SQL injection → parameterized queries; missing rate limiters / CSRF / security headers → snippet templates.
37
37
  - **Pre-commit hook** — block insecure code before it reaches your repo
@@ -62,10 +62,10 @@ GuardVibe is purpose-built for the AI coding workflow. Traditional tools are exc
62
62
  | AI/LLM security (prompt injection, MCP, tool abuse) | 68 rules | Experimental/None | None |
63
63
  | AI host security (CVE-2025-59536, CVE-2026-21852) | `guardvibe doctor` | Not supported | Not supported |
64
64
  | Auto-fix suggestions for AI agents | `fix_code` tool | CLI autofix | Not supported |
65
- | CVE version detection | 77 packages, refreshed daily | Extensive | Extensive |
65
+ | CVE version detection | 78 packages, refreshed daily | Extensive | Extensive |
66
66
  | Compliance mapping (SOC2, PCI-DSS, HIPAA) | Built-in | Paid tier | None |
67
67
  | SARIF CI/CD export | Yes | Yes | Limited |
68
- | Rule count | 450 (focused, 68 AI-native) | 5000+ (broad) | N/A |
68
+ | Rule count | 451 (focused, 68 AI-native) | 5000+ (broad) | N/A |
69
69
 
70
70
  **When to use GuardVibe:** You're building with AI agents and want security scanning integrated into your coding workflow — no dashboard, no account, no CI setup.
71
71
 
@@ -190,7 +190,7 @@ React Native, Expo — AsyncStorage secrets, deep link token exposure, hardcoded
190
190
  ### Firebase
191
191
  Firestore security rules, Firebase Admin SDK exposure, storage rules, custom token validation
192
192
 
193
- ### CVE Version Intelligence (77 CVEs, refreshed daily)
193
+ ### CVE Version Intelligence (78 CVEs, refreshed daily)
194
194
  **Frameworks:** Next.js (CVE-2024-34351, CVE-2024-46982, CVE-2025-29927, CVE-2026-23869, CVE-2026-44573 / 44574 / 44575 / 44578 / 44579 / 45109 May 2026 cluster), React + react-server-dom-* (CVE-2025-55182, CVE-2026-23870), Express, Hono pre-4.12.18 cluster, @vitejs/plugin-rsc, Strapi content-type-builder (CVE-2026-22599)
195
195
  **Auth:** Clerk middleware bypass (GHSA-vqx2), Clerk `has()` org/billing/reverification bypass (GHSA-w24r), Clerk `clerkFrontendApiProxy` SSRF (CVE-2026-34076), NextAuth.js (2 CVEs), jsonwebtoken
196
196
  **ORMs / SQL:** Drizzle SQL identifier injection (CVE-2026-39356) + Drizzle `sql.raw` interpolation (VG1073), MikroORM SQL injection (CVE-2026-44680), Prisma raw-query call-form, Kysely JSON-path traversal (CVE-2026-44635)
@@ -302,7 +302,7 @@ The offline tier is also a `full_audit` section (online never runs inside the au
302
302
  { "slopscan": { "online": true, "allow": ["@myorg/internal-pkg"] } }
303
303
  ```
304
304
 
305
- ## Security Rules (450 rules across 25 modules)
305
+ ## Security Rules (451 rules across 25 modules)
306
306
 
307
307
  | Category | Rules | Coverage |
308
308
  |----------|-------|----------|
@@ -321,7 +321,7 @@ The offline tier is also a `full_audit` section (online never runs inside the au
321
321
  | AI / LLM Security | 33 | Prompt injection, MCP SSRF, excessive agency, indirect injection |
322
322
  | **AI Host Security** | **14** | **CVE-2025-59536 hook injection, CVE-2026-21852 base URL hijack, MCP config audit** |
323
323
  | **AI Tool Runtime** | **14** | **MCP tool output sanitization, obfuscated descriptions, safety bypass** |
324
- | CVE Version Intelligence | 75 | Known vulnerable versions in package.json — incl. Vite dev-server cmd injection (CVE-2024-52011), React Router 7 cluster (CVE-2026-33245/42211/42342), DOMPurify XSS (CVE-2026-47423), Better Auth bypass (CVE-2026-45337), Axios supply-chain backdoor |
324
+ | CVE Version Intelligence | 76 | Known vulnerable versions in package.json — incl. Vite dev-server cmd injection (CVE-2024-52011), React Router 7 cluster (CVE-2026-33245/42211/42342), DOMPurify XSS (CVE-2026-47423), Better Auth bypass (CVE-2026-45337), Axios supply-chain backdoor |
325
325
  | Shell / Bash | 5 | Pipe to bash, chmod 777, rm -rf, sudo password |
326
326
  | SQL | 4 | DROP/DELETE without WHERE, stacked queries, GRANT ALL |
327
327
  | Supply Chain | 19 | Malicious install scripts, lockfile integrity, dependency confusion, typosquat detection |
@@ -901,4 +901,16 @@ export const cveVersionRules = [
901
901
  fixCode: '// package.json\n"@clerk/nextjs": "^4.29.3" // legacy 4.x; prefer migrating to ^6 / ^7\n\n// Defence-in-depth — bind the action to the authed user, never a client-supplied id\nimport { auth } from "@clerk/nextjs/server";\nexport async function GET() {\n const { userId } = await auth();\n if (!userId) return new Response("Unauthorized", { status: 401 });\n const data = await db.record.findFirst({ where: { ownerId: userId } });\n}',
902
902
  compliance: ["SOC2:CC6.1", "PCI-DSS:Req6.5.10", "HIPAA:§164.312(a)"],
903
903
  },
904
+ {
905
+ id: "VG1097",
906
+ name: "i18next missing-key Prototype Pollution (CVE-2026-48713 / CVE-2026-48714)",
907
+ severity: "critical",
908
+ owasp: "A03:2025 Injection",
909
+ description: "Two i18next missing-key handlers are vulnerable to prototype pollution via crafted key strings. i18next-fs-backend before 2.6.6 (CVE-2026-48713 / GHSA-2933-q333-qg83), when persisting missing translation keys, writes attacker-supplied segments like '__proto__.polluted' onto Object.prototype. i18next-http-middleware before 3.9.7 (CVE-2026-48714 / GHSA-f49m-vf83-692w) blocks literal __proto__/constructor/prototype keys but not dotted variants, which downstream backends split on keySeparator and write to the prototype — remote prototype pollution wherever the missing-key handler accepts untrusted input. Fixed in 2.6.6 and 3.9.7 respectively. 0-FP semver: a caret range on the current major (^2 / ^3) and a tilde within the fixed minor resolve to the patched release, so only exact/= pins (and tilde/exact within the still-vulnerable lines, plus any range on an older major) are flagged.",
910
+ pattern: /["']i18next-fs-backend["']\s*:\s*["'](?:(?:\^|~|>=?)?\s*[01]\.\d+\.\d+|(?:~|=)?\s*2\.[0-5]\.\d+|=?\s*2\.6\.[0-5](?![0-9]))["']|["']i18next-http-middleware["']\s*:\s*["'](?:(?:\^|~|>=?)?\s*[0-2]\.\d+\.\d+|(?:~|=)?\s*3\.[0-8]\.\d+|=?\s*3\.9\.[0-6](?![0-9]))["']/g,
911
+ languages: ["json"],
912
+ fix: "Upgrade i18next-fs-backend to 2.6.6+ and i18next-http-middleware to 3.9.7+: npm install i18next-fs-backend@latest i18next-http-middleware@latest. As defence-in-depth, reject any incoming translation key whose segments include __proto__, constructor, or prototype before passing it to a missing-key handler.",
913
+ fixCode: '// package.json\n"i18next-fs-backend": "^2.6.6", // or latest\n"i18next-http-middleware": "^3.9.7" // or latest',
914
+ compliance: ["SOC2:CC6.1", "PCI-DSS:Req6.5.1", "HIPAA:§164.312(a)"],
915
+ },
904
916
  ];
@@ -26,6 +26,18 @@ export declare function bolaOwnershipGuarded(code: string, filePath: string | un
26
26
  * false on uncertainty so a genuinely unguarded mutation keeps firing.
27
27
  */
28
28
  export declare function bolaMutationGuarded(code: string, filePath: string | undefined, line: number): boolean;
29
+ /**
30
+ * Find SQL-sink calls whose first argument is a BARE identifier (the multi-hop shape
31
+ * the inline regex can't see). Returns the 1-based sink line and the variable name so
32
+ * the taint engine can confirm the variable is a user-tainted SQL string before
33
+ * reporting. Empty (no suppression of other paths) when TypeScript is unavailable or
34
+ * the parse fails. The first argument must be a plain identifier — an inline
35
+ * string/template/concat is already covered by the regex sinks and is skipped here.
36
+ */
37
+ export declare function bareVarSqlSinks(code: string, filePath?: string): Array<{
38
+ line: number;
39
+ varName: string;
40
+ }>;
29
41
  /**
30
42
  * True when the argument to a `new RegExp(...)` at `line` is PROVABLY a constant
31
43
  * (a string literal, a variable assigned from a string literal, or the callback
@@ -348,6 +348,45 @@ export function bolaMutationGuarded(code, filePath, line) {
348
348
  return true;
349
349
  return hasInterProceduralOwnershipGuard(ts, sf, target);
350
350
  }
351
+ // SQL sink methods whose FIRST argument is the query string. The inline taint regex
352
+ // only fires when that string is written literally in the sink call (backtick / `+`),
353
+ // so it misses the case where the SQL string was built into a VARIABLE and the bare
354
+ // variable is passed in (`db.sequelize.query(query)`). `.raw`/`$…Unsafe` are always
355
+ // raw SQL; `query`/`execute` are overloaded, so taint.ts gates them on the variable
356
+ // actually being a user-tainted SQL string.
357
+ const SQL_RAW_SINK_METHODS = new Set(["query", "execute", "raw", "$queryRawUnsafe", "$executeRawUnsafe"]);
358
+ /**
359
+ * Find SQL-sink calls whose first argument is a BARE identifier (the multi-hop shape
360
+ * the inline regex can't see). Returns the 1-based sink line and the variable name so
361
+ * the taint engine can confirm the variable is a user-tainted SQL string before
362
+ * reporting. Empty (no suppression of other paths) when TypeScript is unavailable or
363
+ * the parse fails. The first argument must be a plain identifier — an inline
364
+ * string/template/concat is already covered by the regex sinks and is skipped here.
365
+ */
366
+ export function bareVarSqlSinks(code, filePath) {
367
+ const ts = getTs();
368
+ if (!ts)
369
+ return [];
370
+ let sf;
371
+ try {
372
+ sf = ts.createSourceFile(filePath ?? "file.ts", code, ts.ScriptTarget.Latest, true, scriptKindFor(ts, filePath));
373
+ }
374
+ catch {
375
+ return [];
376
+ }
377
+ const sinks = [];
378
+ const visit = (node) => {
379
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)
380
+ && SQL_RAW_SINK_METHODS.has(node.expression.name.text)
381
+ && node.arguments.length > 0 && ts.isIdentifier(node.arguments[0])) {
382
+ const line = sf.getLineAndCharacterOfPosition(node.arguments[0].getStart(sf)).line + 1;
383
+ sinks.push({ line, varName: node.arguments[0].text });
384
+ }
385
+ ts.forEachChild(node, visit);
386
+ };
387
+ visit(sf);
388
+ return sinks;
389
+ }
351
390
  const ITER_METHODS = new Set(["map", "forEach", "some", "every", "filter", "find", "findIndex", "reduce", "flatMap"]);
352
391
  /** First `const NAME = <initializer>` for NAME anywhere in the file (file-scope-ish). */
353
392
  function findVarInit(ts, sf, name) {
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { isRuleDefinitionFile } from "./check-code.js";
7
7
  import { looksMinified } from "../utils/constants.js";
8
+ import { bareVarSqlSinks } from "./ast-engine.js";
8
9
  // User input sources (tainted data entry points)
9
10
  const TAINT_SOURCES = [
10
11
  { pattern: /(?:req|request)\.(?:body|query|params|headers|cookies)\b/g, type: "http-input" },
@@ -300,6 +301,44 @@ export function analyzeTaint(code, language, filePath) {
300
301
  });
301
302
  }
302
303
  }
304
+ // Multi-hop SQL injection: a user-tainted SQL string built into a VARIABLE and then
305
+ // passed BARE to a SQL sink (`const q = "SELECT ... " + req.body.x; db.query(q)`).
306
+ // The inline sink regexes only match the dangerous string in the sink call itself, so
307
+ // they miss the variable-indirection case. The AST locates sinks whose first argument
308
+ // is a bare identifier; we report only when that identifier is a tainted variable
309
+ // whose definition is provably a SQL string (contains SQL keywords) — high precision,
310
+ // and a parameterized query (`db.query(q, [userVal])`) stays silent because the SQL
311
+ // string `q` has no tainted source and the user value rides the bind array.
312
+ const SQL_KEYWORDS = /\b(?:SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|UNION|DROP|INTO|JOIN)\b/i;
313
+ const hasSqlSinkCandidate = /\.\s*(?:query|execute|raw|\$queryRawUnsafe|\$executeRawUnsafe)\s*\(\s*[A-Za-z_$]/.test(code);
314
+ if (hasSqlSinkCandidate && SQL_KEYWORDS.test(code)) {
315
+ for (const site of bareVarSqlSinks(code, filePath)) {
316
+ const tv = taintedVars.find(v => v.name === site.varName);
317
+ if (!tv)
318
+ continue;
319
+ // The variable must provably hold a SQL string built from user input — its
320
+ // defining assignment line carries SQL keywords (so a non-SQL `.query(opts)` or a
321
+ // bind-parameter value never qualifies).
322
+ const def = lines[tv.line - 1] ?? "";
323
+ if (!SQL_KEYWORDS.test(def))
324
+ continue;
325
+ if (SANITIZERS.some(s => s.test(def)))
326
+ continue;
327
+ if (findings.some(f => f.sink.line === site.line && f.sink.type === "sql-injection"))
328
+ continue;
329
+ findings.push({
330
+ source: { type: tv.sourceType ?? "propagated", line: tv.line, variable: tv.name },
331
+ sink: { type: "sql-injection", line: site.line, code: (lines[site.line - 1] ?? "").trim().substring(0, 100) },
332
+ chain: [
333
+ `[SOURCE] ${tv.sourceType ?? "propagated"} -> ${tv.name} (line ${tv.line})`,
334
+ `[SINK] sql-injection (line ${site.line})`,
335
+ ],
336
+ severity: "critical",
337
+ description: "A user-tainted SQL string is built into a variable and passed to a query sink, enabling SQL injection.",
338
+ fix: "Use parameterized queries with placeholder values (bind parameters); never concatenate user input into the SQL string.",
339
+ });
340
+ }
341
+ }
303
342
  return findings;
304
343
  }
305
344
  export function formatTaintFindings(findings, format) {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "guardvibe",
3
- "version": "3.26.0",
3
+ "version": "3.28.0",
4
4
  "mcpName": "io.github.goklab/guardvibe",
5
- "description": "Security infrastructure your AI can't be — deterministic, current past your model's training cutoff, whole-repo-aware, author-independent. Security MCP for vibe coding. 450 rules, 39 tools, CLI + doctor. Prompt-level shift-left security (secure_prompt — embed security requirements BEFORE code generation), host security, auth coverage mapping, LLM-powered deep scan (IDOR/business logic), taint analysis. 77 CVE rules refreshed daily from GHSA/OSV/CISA KEV — js-cookie cookie-attribute injection, PostCSS </style> stringify XSS, Axios proxy prototype-pollution gadget, Vite dev-server RCE, React Router 7 cluster, DOMPurify XSS, Better Auth bypass, Miasma @redhat-cloud-services compromise, Next.js May 2026 13-advisory cluster, Drizzle/MikroORM/Kysely SQL injection, Axios proxy-auth redirect leak, Hono setCookie attribute injection, Clerk SSRF, tRPC prototype pollution, @tanstack supply-chain, node-ipc protestware, OpenClaude sandbox bypass, plus the full AI-generated stack (Supabase, Stripe, Prisma, Hono, GraphQL, Convex, Turso, Uploadthing, AI SDK). 68 AI-native rules including OWASP MCP Top 10 tool-description prompt injection (VG1068), model-controlled sandbox-disable flag detection (VG1063), Session messenger exfil endpoint IOC (VG1075), and CI/CD supply-chain hardening (VG1070 npm --expect-provenance / --ignore-scripts enforcement).",
5
+ "description": "Security infrastructure your AI can't be — deterministic, current past your model's training cutoff, whole-repo-aware, author-independent. Security MCP for vibe coding. 451 rules, 39 tools, CLI + doctor. Prompt-level shift-left security (secure_prompt — embed security requirements BEFORE code generation), host security, auth coverage mapping, LLM-powered deep scan (IDOR/business logic), taint analysis. 78 CVE rules refreshed daily from GHSA/OSV/CISA KEV — js-cookie cookie-attribute injection, PostCSS </style> stringify XSS, Axios proxy prototype-pollution gadget, Vite dev-server RCE, React Router 7 cluster, DOMPurify XSS, Better Auth bypass, Miasma @redhat-cloud-services compromise, Next.js May 2026 13-advisory cluster, Drizzle/MikroORM/Kysely SQL injection, Axios proxy-auth redirect leak, Hono setCookie attribute injection, Clerk SSRF, tRPC prototype pollution, @tanstack supply-chain, node-ipc protestware, OpenClaude sandbox bypass, plus the full AI-generated stack (Supabase, Stripe, Prisma, Hono, GraphQL, Convex, Turso, Uploadthing, AI SDK). 68 AI-native rules including OWASP MCP Top 10 tool-description prompt injection (VG1068), model-controlled sandbox-disable flag detection (VG1063), Session messenger exfil endpoint IOC (VG1075), and CI/CD supply-chain hardening (VG1070 npm --expect-provenance / --ignore-scripts enforcement).",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "guardvibe": "build/cli.js",