guardvibe 0.4.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/LICENSE +21 -0
- package/README.md +205 -0
- package/build/cli.d.ts +3 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +118 -0
- package/build/cli.js.map +1 -0
- package/build/data/framework-guides.d.ts +8 -0
- package/build/data/framework-guides.d.ts.map +1 -0
- package/build/data/framework-guides.js +500 -0
- package/build/data/framework-guides.js.map +1 -0
- package/build/data/owasp-rules.d.ts +12 -0
- package/build/data/owasp-rules.d.ts.map +1 -0
- package/build/data/owasp-rules.js +469 -0
- package/build/data/owasp-rules.js.map +1 -0
- package/build/data/rules/core.d.ts +3 -0
- package/build/data/rules/core.d.ts.map +1 -0
- package/build/data/rules/core.js +245 -0
- package/build/data/rules/core.js.map +1 -0
- package/build/data/rules/go.d.ts +3 -0
- package/build/data/rules/go.d.ts.map +1 -0
- package/build/data/rules/go.js +64 -0
- package/build/data/rules/go.js.map +1 -0
- package/build/data/rules/index.d.ts +3 -0
- package/build/data/rules/index.d.ts.map +1 -0
- package/build/data/rules/index.js +13 -0
- package/build/data/rules/index.js.map +1 -0
- package/build/data/rules/java.d.ts +3 -0
- package/build/data/rules/java.d.ts.map +1 -0
- package/build/data/rules/java.js +64 -0
- package/build/data/rules/java.js.map +1 -0
- package/build/data/rules/php.d.ts +3 -0
- package/build/data/rules/php.d.ts.map +1 -0
- package/build/data/rules/php.js +54 -0
- package/build/data/rules/php.js.map +1 -0
- package/build/data/rules/ruby.d.ts +3 -0
- package/build/data/rules/ruby.d.ts.map +1 -0
- package/build/data/rules/ruby.js +54 -0
- package/build/data/rules/ruby.js.map +1 -0
- package/build/data/rules/types.d.ts +11 -0
- package/build/data/rules/types.d.ts.map +1 -0
- package/build/data/rules/types.js +2 -0
- package/build/data/rules/types.js.map +1 -0
- package/build/data/secret-patterns.d.ts +9 -0
- package/build/data/secret-patterns.d.ts.map +1 -0
- package/build/data/secret-patterns.js +87 -0
- package/build/data/secret-patterns.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +117 -0
- package/build/index.js.map +1 -0
- package/build/tools/check-code.d.ts +9 -0
- package/build/tools/check-code.d.ts.map +1 -0
- package/build/tools/check-code.js +125 -0
- package/build/tools/check-code.js.map +1 -0
- package/build/tools/check-deps.d.ts +8 -0
- package/build/tools/check-deps.d.ts.map +1 -0
- package/build/tools/check-deps.js +57 -0
- package/build/tools/check-deps.js.map +1 -0
- package/build/tools/check-project.d.ts +7 -0
- package/build/tools/check-project.d.ts.map +1 -0
- package/build/tools/check-project.js +134 -0
- package/build/tools/check-project.js.map +1 -0
- package/build/tools/get-security-docs.d.ts +2 -0
- package/build/tools/get-security-docs.d.ts.map +1 -0
- package/build/tools/get-security-docs.js +61 -0
- package/build/tools/get-security-docs.js.map +1 -0
- package/build/tools/scan-dependencies.d.ts +2 -0
- package/build/tools/scan-dependencies.d.ts.map +1 -0
- package/build/tools/scan-dependencies.js +69 -0
- package/build/tools/scan-dependencies.js.map +1 -0
- package/build/tools/scan-directory.d.ts +2 -0
- package/build/tools/scan-directory.d.ts.map +1 -0
- package/build/tools/scan-directory.js +120 -0
- package/build/tools/scan-directory.js.map +1 -0
- package/build/tools/scan-secrets.d.ts +11 -0
- package/build/tools/scan-secrets.d.ts.map +1 -0
- package/build/tools/scan-secrets.js +150 -0
- package/build/tools/scan-secrets.js.map +1 -0
- package/build/utils/manifest-parser.d.ts +7 -0
- package/build/utils/manifest-parser.d.ts.map +1 -0
- package/build/utils/manifest-parser.js +102 -0
- package/build/utils/manifest-parser.js.map +1 -0
- package/build/utils/osv-client.d.ts +37 -0
- package/build/utils/osv-client.d.ts.map +1 -0
- package/build/utils/osv-client.js +78 -0
- package/build/utils/osv-client.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const secretPatterns = [
|
|
2
|
+
{
|
|
3
|
+
provider: "AWS Access Key",
|
|
4
|
+
pattern: /AKIA[0-9A-Z]{16}/g,
|
|
5
|
+
severity: "critical",
|
|
6
|
+
fix: "Remove the key and rotate it in AWS IAM console. Use environment variables or AWS SSM Parameter Store.",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
provider: "AWS Secret Key",
|
|
10
|
+
pattern: /(?:aws)?_?secret_?(?:access)?_?key['"]?\s*[:=]\s*['"][A-Za-z0-9/+=]{40}['"]/gi,
|
|
11
|
+
severity: "critical",
|
|
12
|
+
fix: "Remove and rotate immediately. Use IAM roles or environment variables.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
provider: "GitHub Token",
|
|
16
|
+
pattern: /(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}/g,
|
|
17
|
+
severity: "critical",
|
|
18
|
+
fix: "Revoke the token at github.com/settings/tokens and create a new one with minimal scopes.",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
provider: "OpenAI API Key",
|
|
22
|
+
pattern: /sk-[A-Za-z0-9]{20,}/g,
|
|
23
|
+
severity: "critical",
|
|
24
|
+
fix: "Rotate the key at platform.openai.com/api-keys. Use environment variables.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
provider: "Stripe Live Key",
|
|
28
|
+
pattern: /sk_live_[A-Za-z0-9]{20,}/g,
|
|
29
|
+
severity: "critical",
|
|
30
|
+
fix: "Rotate the key in the Stripe Dashboard. Never expose live keys in code.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
provider: "Stripe Publishable Live Key",
|
|
34
|
+
pattern: /pk_live_[A-Za-z0-9]{20,}/g,
|
|
35
|
+
severity: "medium",
|
|
36
|
+
fix: "Publishable keys are less sensitive but should still be in environment variables.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
provider: "Google API Key",
|
|
40
|
+
pattern: /AIza[0-9A-Za-z_-]{35}/g,
|
|
41
|
+
severity: "high",
|
|
42
|
+
fix: "Restrict the key in Google Cloud Console. Use environment variables.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
provider: "Slack Token",
|
|
46
|
+
pattern: /xox[baprs]-[A-Za-z0-9-]{10,}/g,
|
|
47
|
+
severity: "critical",
|
|
48
|
+
fix: "Revoke the token in Slack workspace settings. Use environment variables.",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
provider: "Twilio API Key",
|
|
52
|
+
pattern: /SK[0-9a-fA-F]{32}/g,
|
|
53
|
+
severity: "high",
|
|
54
|
+
fix: "Rotate the key in the Twilio Console.",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
provider: "SendGrid API Key",
|
|
58
|
+
pattern: /SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}/g,
|
|
59
|
+
severity: "critical",
|
|
60
|
+
fix: "Revoke and recreate the key in SendGrid settings.",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
provider: "Private Key",
|
|
64
|
+
pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g,
|
|
65
|
+
severity: "critical",
|
|
66
|
+
fix: "Never commit private keys. Use a secrets manager or mount as a volume.",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
provider: "NEXT_PUBLIC_ Secret Exposure",
|
|
70
|
+
pattern: /NEXT_PUBLIC_[A-Z_]*(?:SECRET|KEY|TOKEN|PASSWORD|CREDENTIAL)[A-Z_]*\s*=/gi,
|
|
71
|
+
severity: "high",
|
|
72
|
+
fix: "Remove NEXT_PUBLIC_ prefix — it exposes the value to the browser. Use server-side environment variables instead.",
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
export function calculateEntropy(str) {
|
|
76
|
+
const freq = new Map();
|
|
77
|
+
for (const ch of str) {
|
|
78
|
+
freq.set(ch, (freq.get(ch) || 0) + 1);
|
|
79
|
+
}
|
|
80
|
+
let entropy = 0;
|
|
81
|
+
for (const count of freq.values()) {
|
|
82
|
+
const p = count / str.length;
|
|
83
|
+
entropy -= p * Math.log2(p);
|
|
84
|
+
}
|
|
85
|
+
return entropy;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=secret-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-patterns.js","sourceRoot":"","sources":["../../src/data/secret-patterns.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C;QACE,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,wGAAwG;KAC9G;IACD;QACE,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,+EAA+E;QACxF,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,wEAAwE;KAC9E;IACD;QACE,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,0FAA0F;KAChG;IACD;QACE,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,4EAA4E;KAClF;IACD;QACE,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,2BAA2B;QACpC,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,yEAAyE;KAC/E;IACD;QACE,QAAQ,EAAE,6BAA6B;QACvC,OAAO,EAAE,2BAA2B;QACpC,QAAQ,EAAE,QAAQ;QAClB,GAAG,EAAE,mFAAmF;KACzF;IACD;QACE,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,sEAAsE;KAC5E;IACD;QACE,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,+BAA+B;QACxC,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,0EAA0E;KAChF;IACD;QACE,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,uCAAuC;KAC7C;IACD;QACE,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,2CAA2C;QACpD,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,mDAAmD;KACzD;IACD;QACE,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,gDAAgD;QACzD,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,wEAAwE;KAC9E;IACD;QACE,QAAQ,EAAE,8BAA8B;QACxC,OAAO,EAAE,0EAA0E;QACnF,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,kHAAkH;KACxH;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { checkCode } from "./tools/check-code.js";
|
|
6
|
+
import { checkProject } from "./tools/check-project.js";
|
|
7
|
+
import { getSecurityDocs } from "./tools/get-security-docs.js";
|
|
8
|
+
import { checkDependencies } from "./tools/check-deps.js";
|
|
9
|
+
import { scanDirectory } from "./tools/scan-directory.js";
|
|
10
|
+
import { scanDependencies } from "./tools/scan-dependencies.js";
|
|
11
|
+
import { scanSecrets } from "./tools/scan-secrets.js";
|
|
12
|
+
const server = new McpServer({
|
|
13
|
+
name: "guardvibe",
|
|
14
|
+
version: "0.4.0",
|
|
15
|
+
});
|
|
16
|
+
// Tool 1: Analyze code for security vulnerabilities
|
|
17
|
+
server.tool("check_code", "Analyze code for security vulnerabilities (OWASP Top 10, XSS, SQL injection, insecure patterns). Use this when reviewing or writing code to catch security issues early.", {
|
|
18
|
+
code: z.string().describe("The code snippet to analyze"),
|
|
19
|
+
language: z
|
|
20
|
+
.enum(["javascript", "typescript", "python", "go", "java", "php", "ruby", "html", "sql", "shell"])
|
|
21
|
+
.describe("Programming language of the code"),
|
|
22
|
+
framework: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Framework context (e.g. express, nextjs, fastapi, react, django)"),
|
|
26
|
+
}, async ({ code, language, framework }) => {
|
|
27
|
+
const results = checkCode(code, language, framework);
|
|
28
|
+
return {
|
|
29
|
+
content: [{ type: "text", text: results }],
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
// Tool 2: Scan entire project for security vulnerabilities
|
|
33
|
+
server.tool("check_project", "Scan multiple files for security vulnerabilities and generate a project-wide security report with a security score. Use this for comprehensive security audits.", {
|
|
34
|
+
files: z
|
|
35
|
+
.array(z.object({
|
|
36
|
+
path: z.string().describe("Relative file path (e.g. src/app.ts)"),
|
|
37
|
+
content: z.string().describe("File source code"),
|
|
38
|
+
}))
|
|
39
|
+
.describe("List of files to scan: [{path, content}]"),
|
|
40
|
+
}, async ({ files }) => {
|
|
41
|
+
const results = checkProject(files);
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: results }],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
// Tool 3: Get security documentation and best practices (renumbered from Tool 2)
|
|
47
|
+
server.tool("get_security_docs", "Get security best practices and guidance for a specific topic, framework, or vulnerability type. Use this to learn how to write secure code.", {
|
|
48
|
+
topic: z
|
|
49
|
+
.string()
|
|
50
|
+
.describe('Security topic to look up (e.g. "express authentication", "sql injection prevention", "nextjs csrf", "react xss", "owasp top 10")'),
|
|
51
|
+
}, async ({ topic }) => {
|
|
52
|
+
const docs = getSecurityDocs(topic);
|
|
53
|
+
return {
|
|
54
|
+
content: [{ type: "text", text: docs }],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
// Tool 4: Check dependencies for known vulnerabilities
|
|
58
|
+
const packageSchema = z.object({
|
|
59
|
+
name: z.string().describe("Package name (e.g. lodash, express, django)"),
|
|
60
|
+
version: z.string().describe("Package version (e.g. 4.17.20)"),
|
|
61
|
+
ecosystem: z
|
|
62
|
+
.enum(["npm", "PyPI", "Go", "crates.io", "Maven", "NuGet", "RubyGems"])
|
|
63
|
+
.default("npm")
|
|
64
|
+
.describe("Package ecosystem"),
|
|
65
|
+
});
|
|
66
|
+
server.tool("check_dependencies", "Check npm/python packages for known security vulnerabilities (CVEs) using the OSV database. Use this before adding new dependencies or to audit existing ones.", {
|
|
67
|
+
packages: z.preprocess((val) => {
|
|
68
|
+
if (typeof val === "string") {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(val);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return val;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return val;
|
|
77
|
+
}, z.array(packageSchema)).describe("List of packages to check: [{name, version, ecosystem}]"),
|
|
78
|
+
}, async ({ packages }) => {
|
|
79
|
+
const results = await checkDependencies(packages);
|
|
80
|
+
return {
|
|
81
|
+
content: [{ type: "text", text: results }],
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
// Tool 5: Scan directory for security vulnerabilities (filesystem-native)
|
|
85
|
+
server.tool("scan_directory", "Scan an entire project directory for security vulnerabilities. Reads files directly from the filesystem — no need to pass file contents. Returns a security score (A-F) and detailed findings.", {
|
|
86
|
+
path: z.string().describe("Directory path to scan (e.g. './src', '.')"),
|
|
87
|
+
recursive: z.boolean().optional().default(true).describe("Scan subdirectories"),
|
|
88
|
+
exclude: z.array(z.string()).optional().default([]).describe("Additional directories to exclude"),
|
|
89
|
+
}, async ({ path, recursive, exclude }) => {
|
|
90
|
+
const results = scanDirectory(path, recursive, exclude);
|
|
91
|
+
return { content: [{ type: "text", text: results }] };
|
|
92
|
+
});
|
|
93
|
+
// Tool 6: Scan manifest/lockfile for dependency vulnerabilities
|
|
94
|
+
server.tool("scan_dependencies", "Parse a lockfile or manifest (package.json, requirements.txt, go.mod, Gemfile.lock, Cargo.lock) and check all dependencies for known CVEs via the OSV database. Reads the file directly.", {
|
|
95
|
+
manifest_path: z.string().describe("Path to manifest file (e.g. 'package.json', 'requirements.txt', 'go.mod')"),
|
|
96
|
+
}, async ({ manifest_path }) => {
|
|
97
|
+
const results = await scanDependencies(manifest_path);
|
|
98
|
+
return { content: [{ type: "text", text: results }] };
|
|
99
|
+
});
|
|
100
|
+
// Tool 7: Scan for leaked secrets, API keys, and credentials
|
|
101
|
+
server.tool("scan_secrets", "Scan files and directories for leaked secrets, API keys, tokens, and credentials. Checks .env files, config files, and source code. Verifies .gitignore coverage.", {
|
|
102
|
+
path: z.string().describe("File or directory path to scan"),
|
|
103
|
+
recursive: z.boolean().optional().default(true).describe("Scan subdirectories"),
|
|
104
|
+
}, async ({ path, recursive }) => {
|
|
105
|
+
const results = scanSecrets(path, recursive);
|
|
106
|
+
return { content: [{ type: "text", text: results }] };
|
|
107
|
+
});
|
|
108
|
+
async function main() {
|
|
109
|
+
const transport = new StdioServerTransport();
|
|
110
|
+
await server.connect(transport);
|
|
111
|
+
console.error("GuardVibe Security MCP server running on stdio");
|
|
112
|
+
}
|
|
113
|
+
main().catch((error) => {
|
|
114
|
+
console.error("Fatal error:", error);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SecurityRule } from "../data/rules/index.js";
|
|
2
|
+
export interface Finding {
|
|
3
|
+
rule: SecurityRule;
|
|
4
|
+
match: string;
|
|
5
|
+
line: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function analyzeCode(code: string, language: string, framework?: string): Finding[];
|
|
8
|
+
export declare function checkCode(code: string, language: string, framework?: string): string;
|
|
9
|
+
//# sourceMappingURL=check-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-code.d.ts","sourceRoot":"","sources":["../../src/tools/check-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,EAAE,CAyBX;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAQR"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { owaspRules } from "../data/rules/index.js";
|
|
2
|
+
function parseSuppressionsFromCode(lines) {
|
|
3
|
+
const suppressions = [];
|
|
4
|
+
const pattern = /(?:\/\/|#|<!--)\s*guardvibe-ignore(?:-next-line)?\s*(VG\d+)?\s*(?:-->)?/i;
|
|
5
|
+
for (let i = 0; i < lines.length; i++) {
|
|
6
|
+
const match = pattern.exec(lines[i]);
|
|
7
|
+
if (!match)
|
|
8
|
+
continue;
|
|
9
|
+
const ruleId = match[1] || null;
|
|
10
|
+
const isNextLine = lines[i].includes("guardvibe-ignore-next-line");
|
|
11
|
+
if (isNextLine) {
|
|
12
|
+
suppressions.push({ line: i + 2, ruleId }); // next line (1-indexed)
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
suppressions.push({ line: i + 1, ruleId }); // same line (1-indexed)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return suppressions;
|
|
19
|
+
}
|
|
20
|
+
function isLineSuppressed(suppressions, line, ruleId) {
|
|
21
|
+
return suppressions.some(s => s.line === line && (s.ruleId === null || s.ruleId === ruleId));
|
|
22
|
+
}
|
|
23
|
+
export function analyzeCode(code, language, framework) {
|
|
24
|
+
const findings = [];
|
|
25
|
+
const lines = code.split("\n");
|
|
26
|
+
const suppressions = parseSuppressionsFromCode(lines);
|
|
27
|
+
for (const rule of owaspRules) {
|
|
28
|
+
if (!rule.languages.includes(language))
|
|
29
|
+
continue;
|
|
30
|
+
rule.pattern.lastIndex = 0;
|
|
31
|
+
let match;
|
|
32
|
+
while ((match = rule.pattern.exec(code)) !== null) {
|
|
33
|
+
const beforeMatch = code.substring(0, match.index);
|
|
34
|
+
const lineNumber = beforeMatch.split("\n").length;
|
|
35
|
+
if (isLineSuppressed(suppressions, lineNumber, rule.id))
|
|
36
|
+
continue;
|
|
37
|
+
findings.push({
|
|
38
|
+
rule,
|
|
39
|
+
match: match[0].substring(0, 80),
|
|
40
|
+
line: lineNumber,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return findings;
|
|
45
|
+
}
|
|
46
|
+
export function checkCode(code, language, framework) {
|
|
47
|
+
const findings = analyzeCode(code, language, framework);
|
|
48
|
+
if (findings.length === 0) {
|
|
49
|
+
return formatCleanReport(language, framework);
|
|
50
|
+
}
|
|
51
|
+
return formatReport(findings, language, framework);
|
|
52
|
+
}
|
|
53
|
+
function formatCleanReport(language, framework) {
|
|
54
|
+
const ctx = framework ? ` (${framework})` : "";
|
|
55
|
+
return [
|
|
56
|
+
`# GuardVibe Security Report`,
|
|
57
|
+
``,
|
|
58
|
+
`**Language:** ${language}${ctx}`,
|
|
59
|
+
`**Status:** No security issues detected`,
|
|
60
|
+
``,
|
|
61
|
+
`The code looks clean! Here are some general tips:`,
|
|
62
|
+
`- Keep dependencies updated (\`npm audit\`)`,
|
|
63
|
+
`- Validate all user input with schemas (zod, joi)`,
|
|
64
|
+
`- Use environment variables for secrets`,
|
|
65
|
+
`- Add rate limiting to API endpoints`,
|
|
66
|
+
].join("\n");
|
|
67
|
+
}
|
|
68
|
+
function formatReport(findings, language, framework) {
|
|
69
|
+
const ctx = framework ? ` (${framework})` : "";
|
|
70
|
+
// Severity ordering
|
|
71
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
|
|
72
|
+
// Group findings by rule.id
|
|
73
|
+
const grouped = new Map();
|
|
74
|
+
for (const finding of findings) {
|
|
75
|
+
const existing = grouped.get(finding.rule.id);
|
|
76
|
+
if (existing) {
|
|
77
|
+
existing.push(finding);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
grouped.set(finding.rule.id, [finding]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Sort groups by severity (critical first)
|
|
84
|
+
const sortedGroups = Array.from(grouped.entries()).sort(([, aFindings], [, bFindings]) => {
|
|
85
|
+
return severityOrder[aFindings[0].rule.severity] - severityOrder[bFindings[0].rule.severity];
|
|
86
|
+
});
|
|
87
|
+
// Count total findings (deduplicated groups count as 1 issue each for summary)
|
|
88
|
+
const allFindings = findings;
|
|
89
|
+
const criticalCount = allFindings.filter((f) => f.rule.severity === "critical").length;
|
|
90
|
+
const highCount = allFindings.filter((f) => f.rule.severity === "high").length;
|
|
91
|
+
const mediumCount = allFindings.filter((f) => f.rule.severity === "medium").length;
|
|
92
|
+
const lines = [
|
|
93
|
+
`# GuardVibe Security Report`,
|
|
94
|
+
``,
|
|
95
|
+
`**Language:** ${language}${ctx}`,
|
|
96
|
+
`**Issues found:** ${allFindings.length}`,
|
|
97
|
+
`**Breakdown:** ${criticalCount} critical, ${highCount} high, ${mediumCount} medium`,
|
|
98
|
+
``,
|
|
99
|
+
`---`,
|
|
100
|
+
``,
|
|
101
|
+
];
|
|
102
|
+
for (const [, groupFindings] of sortedGroups) {
|
|
103
|
+
const first = groupFindings[0];
|
|
104
|
+
const icon = first.rule.severity === "critical"
|
|
105
|
+
? "CRITICAL"
|
|
106
|
+
: first.rule.severity === "high"
|
|
107
|
+
? "HIGH"
|
|
108
|
+
: first.rule.severity === "medium"
|
|
109
|
+
? "MEDIUM"
|
|
110
|
+
: "LOW";
|
|
111
|
+
if (groupFindings.length > 2) {
|
|
112
|
+
// Deduplicated grouped format
|
|
113
|
+
const lineList = groupFindings.map((f) => `~${f.line}`).join(", ");
|
|
114
|
+
lines.push(`## [${icon}] ${first.rule.name} (${first.rule.id})`, ``, `**OWASP:** ${first.rule.owasp}`, `**Occurrences:** ${groupFindings.length} (lines: ${lineList})`, `**Example match:** \`${first.match}\``, ``, first.rule.description, ``, `**Fix:** ${first.rule.fix}`, ``, `---`, ``);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Individual format for 1-2 matches
|
|
118
|
+
for (const finding of groupFindings) {
|
|
119
|
+
lines.push(`## [${icon}] ${finding.rule.name} (${finding.rule.id})`, ``, `**OWASP:** ${finding.rule.owasp}`, `**Line:** ~${finding.line}`, `**Match:** \`${finding.match}\``, ``, finding.rule.description, ``, `**Fix:** ${finding.rule.fix}`, ``, `---`, ``);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=check-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-code.js","sourceRoot":"","sources":["../../src/tools/check-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-deps.d.ts","sourceRoot":"","sources":["../../src/tools/check-deps.ts"],"names":[],"mappings":"AAEA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { queryOsv, formatVulnerability } from "../utils/osv-client.js";
|
|
2
|
+
export async function checkDependencies(packages) {
|
|
3
|
+
const results = [
|
|
4
|
+
`# GuardVibe Dependency Security Report`,
|
|
5
|
+
``,
|
|
6
|
+
`**Packages checked:** ${packages.length}`,
|
|
7
|
+
`**Database:** OSV (Google Open Source Vulnerabilities)`,
|
|
8
|
+
``,
|
|
9
|
+
`---`,
|
|
10
|
+
``,
|
|
11
|
+
];
|
|
12
|
+
let totalVulns = 0;
|
|
13
|
+
let criticalPackages = [];
|
|
14
|
+
for (const pkg of packages) {
|
|
15
|
+
try {
|
|
16
|
+
const vulns = await queryOsv(pkg.name, pkg.version, pkg.ecosystem);
|
|
17
|
+
if (vulns.length === 0) {
|
|
18
|
+
results.push(`## ${pkg.name}@${pkg.version} (${pkg.ecosystem})`);
|
|
19
|
+
results.push(`No known vulnerabilities found.`);
|
|
20
|
+
results.push(``);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
totalVulns += vulns.length;
|
|
24
|
+
criticalPackages.push(`${pkg.name}@${pkg.version}`);
|
|
25
|
+
results.push(`## ${pkg.name}@${pkg.version} (${pkg.ecosystem}) - ${vulns.length} vulnerabilities found`);
|
|
26
|
+
results.push(``);
|
|
27
|
+
for (const vuln of vulns) {
|
|
28
|
+
results.push(formatVulnerability(vuln));
|
|
29
|
+
results.push(``);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
35
|
+
results.push(`## ${pkg.name}@${pkg.version} (${pkg.ecosystem})`);
|
|
36
|
+
results.push(`Error checking package: ${message}`);
|
|
37
|
+
results.push(``);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Summary
|
|
41
|
+
results.push(`---`);
|
|
42
|
+
results.push(``);
|
|
43
|
+
results.push(`## Summary`);
|
|
44
|
+
if (totalVulns === 0) {
|
|
45
|
+
results.push(`All ${packages.length} packages are clean. No known vulnerabilities found.`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
results.push(`**${totalVulns} vulnerabilities** found in ${criticalPackages.length} packages:`);
|
|
49
|
+
for (const pkg of criticalPackages) {
|
|
50
|
+
results.push(`- ${pkg}`);
|
|
51
|
+
}
|
|
52
|
+
results.push(``);
|
|
53
|
+
results.push(`**Action:** Update affected packages to their fixed versions.`);
|
|
54
|
+
}
|
|
55
|
+
return results.join("\n");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=check-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-deps.js","sourceRoot":"","sources":["../../src/tools/check-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-project.d.ts","sourceRoot":"","sources":["../../src/tools/check-project.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAwCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAgJvD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { analyzeCode } from "./check-code.js";
|
|
2
|
+
const extensionMap = {
|
|
3
|
+
".js": "javascript",
|
|
4
|
+
".jsx": "javascript",
|
|
5
|
+
".ts": "typescript",
|
|
6
|
+
".tsx": "typescript",
|
|
7
|
+
".py": "python",
|
|
8
|
+
".go": "go",
|
|
9
|
+
".java": "java",
|
|
10
|
+
".php": "php",
|
|
11
|
+
".rb": "ruby",
|
|
12
|
+
".html": "html",
|
|
13
|
+
".sql": "sql",
|
|
14
|
+
".sh": "shell",
|
|
15
|
+
".bash": "shell",
|
|
16
|
+
};
|
|
17
|
+
function detectLanguage(filePath) {
|
|
18
|
+
const ext = filePath.match(/\.[^.]+$/)?.[0]?.toLowerCase();
|
|
19
|
+
return ext ? extensionMap[ext] ?? null : null;
|
|
20
|
+
}
|
|
21
|
+
function calculateScore(critical, high, medium) {
|
|
22
|
+
return Math.max(0, Math.min(100, 100 - critical * 25 - high * 10 - medium * 5));
|
|
23
|
+
}
|
|
24
|
+
function scoreToGrade(score) {
|
|
25
|
+
if (score >= 90)
|
|
26
|
+
return "A";
|
|
27
|
+
if (score >= 75)
|
|
28
|
+
return "B";
|
|
29
|
+
if (score >= 60)
|
|
30
|
+
return "C";
|
|
31
|
+
if (score >= 40)
|
|
32
|
+
return "D";
|
|
33
|
+
return "F";
|
|
34
|
+
}
|
|
35
|
+
export function checkProject(files) {
|
|
36
|
+
const results = [];
|
|
37
|
+
const skippedFiles = [];
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const language = detectLanguage(file.path);
|
|
40
|
+
if (!language) {
|
|
41
|
+
skippedFiles.push(file.path);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const findings = analyzeCode(file.content, language);
|
|
45
|
+
if (findings.length > 0) {
|
|
46
|
+
results.push({ path: file.path, findings });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const scannedCount = files.length - skippedFiles.length;
|
|
50
|
+
const allFindings = results.flatMap((r) => r.findings);
|
|
51
|
+
const totalCritical = allFindings.filter((f) => f.rule.severity === "critical").length;
|
|
52
|
+
const totalHigh = allFindings.filter((f) => f.rule.severity === "high").length;
|
|
53
|
+
const totalMedium = allFindings.filter((f) => f.rule.severity === "medium").length;
|
|
54
|
+
const totalIssues = totalCritical + totalHigh + totalMedium;
|
|
55
|
+
const score = calculateScore(totalCritical, totalHigh, totalMedium);
|
|
56
|
+
const grade = scoreToGrade(score);
|
|
57
|
+
const lines = [
|
|
58
|
+
`# GuardVibe Project Security Report`,
|
|
59
|
+
``,
|
|
60
|
+
`Files scanned: ${scannedCount}`,
|
|
61
|
+
`Total issues: ${totalIssues}`,
|
|
62
|
+
`Security Score: ${grade} (${score}/100)`,
|
|
63
|
+
``,
|
|
64
|
+
];
|
|
65
|
+
if (totalIssues > 0) {
|
|
66
|
+
lines.push(`## Summary`, ``);
|
|
67
|
+
lines.push(`| Severity | Count |`);
|
|
68
|
+
lines.push(`|----------|-------|`);
|
|
69
|
+
if (totalCritical > 0)
|
|
70
|
+
lines.push(`| Critical | ${totalCritical} |`);
|
|
71
|
+
if (totalHigh > 0)
|
|
72
|
+
lines.push(`| High | ${totalHigh} |`);
|
|
73
|
+
if (totalMedium > 0)
|
|
74
|
+
lines.push(`| Medium | ${totalMedium} |`);
|
|
75
|
+
lines.push(``);
|
|
76
|
+
// Top issues sorted by severity
|
|
77
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
|
|
78
|
+
const allIssues = results.flatMap((r) => r.findings.map((f) => ({
|
|
79
|
+
severity: f.rule.severity,
|
|
80
|
+
order: severityOrder[f.rule.severity] ?? 99,
|
|
81
|
+
text: `[${f.rule.severity.toUpperCase()}] ${f.rule.name} in ${r.path} (${f.rule.id})`,
|
|
82
|
+
})));
|
|
83
|
+
allIssues.sort((a, b) => a.order - b.order);
|
|
84
|
+
if (allIssues.length > 0) {
|
|
85
|
+
lines.push(`## Top Issues`);
|
|
86
|
+
const topN = allIssues.slice(0, 10);
|
|
87
|
+
topN.forEach((issue, i) => {
|
|
88
|
+
lines.push(`${i + 1}. ${issue.text}`);
|
|
89
|
+
});
|
|
90
|
+
lines.push(``);
|
|
91
|
+
}
|
|
92
|
+
lines.push(`---`, ``);
|
|
93
|
+
// Per-file details
|
|
94
|
+
for (const r of results) {
|
|
95
|
+
const fileIssueCount = r.findings.length;
|
|
96
|
+
lines.push(`## File: ${r.path} (${fileIssueCount} issues)`, ``);
|
|
97
|
+
// Group findings by rule.id to match check-code formatting
|
|
98
|
+
const grouped = new Map();
|
|
99
|
+
for (const finding of r.findings) {
|
|
100
|
+
const existing = grouped.get(finding.rule.id);
|
|
101
|
+
if (existing) {
|
|
102
|
+
existing.push(finding);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
grouped.set(finding.rule.id, [finding]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const sortedGroups = Array.from(grouped.entries()).sort(([, aFindings], [, bFindings]) => {
|
|
109
|
+
return (severityOrder[aFindings[0].rule.severity] ?? 99) - (severityOrder[bFindings[0].rule.severity] ?? 99);
|
|
110
|
+
});
|
|
111
|
+
for (const [, groupFindings] of sortedGroups) {
|
|
112
|
+
const first = groupFindings[0];
|
|
113
|
+
const icon = first.rule.severity.toUpperCase();
|
|
114
|
+
if (groupFindings.length > 2) {
|
|
115
|
+
const lineList = groupFindings.map((f) => `~${f.line}`).join(", ");
|
|
116
|
+
lines.push(`## [${icon}] ${first.rule.name} (${first.rule.id})`, ``, `**OWASP:** ${first.rule.owasp}`, `**Occurrences:** ${groupFindings.length} (lines: ${lineList})`, `**Example match:** \`${first.match}\``, ``, first.rule.description, ``, `**Fix:** ${first.rule.fix}`, ``, `---`, ``);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
for (const finding of groupFindings) {
|
|
120
|
+
lines.push(`## [${icon}] ${finding.rule.name} (${finding.rule.id})`, ``, `**OWASP:** ${finding.rule.owasp}`, `**Line:** ~${finding.line}`, `**Match:** \`${finding.match}\``, ``, finding.rule.description, ``, `**Fix:** ${finding.rule.fix}`, ``, `---`, ``);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
lines.push(`## No Issues Found`, ``, `All ${scannedCount} files passed security checks. Great job!`, ``, `**Tips to stay secure:**`, `- Keep dependencies updated`, `- Validate all user input with schemas`, `- Use environment variables for secrets`, `- Add rate limiting to API endpoints`);
|
|
128
|
+
}
|
|
129
|
+
if (skippedFiles.length > 0) {
|
|
130
|
+
lines.push(``, `*Skipped ${skippedFiles.length} files with unsupported extensions.*`);
|
|
131
|
+
}
|
|
132
|
+
return lines.join("\n");
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=check-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-project.js","sourceRoot":"","sources":["../../src/tools/check-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-security-docs.d.ts","sourceRoot":"","sources":["../../src/tools/get-security-docs.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoErD"}
|