ghostpatch 1.0.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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/__tests__/detectors.test.ts +224 -0
  4. package/__tests__/rules.test.ts +117 -0
  5. package/__tests__/scanner.test.ts +222 -0
  6. package/dist/ai/anthropic.d.ts +11 -0
  7. package/dist/ai/anthropic.d.ts.map +1 -0
  8. package/dist/ai/anthropic.js +76 -0
  9. package/dist/ai/anthropic.js.map +1 -0
  10. package/dist/ai/huggingface.d.ts +12 -0
  11. package/dist/ai/huggingface.d.ts.map +1 -0
  12. package/dist/ai/huggingface.js +95 -0
  13. package/dist/ai/huggingface.js.map +1 -0
  14. package/dist/ai/openai.d.ts +11 -0
  15. package/dist/ai/openai.d.ts.map +1 -0
  16. package/dist/ai/openai.js +71 -0
  17. package/dist/ai/openai.js.map +1 -0
  18. package/dist/ai/prompts.d.ts +5 -0
  19. package/dist/ai/prompts.d.ts.map +1 -0
  20. package/dist/ai/prompts.js +101 -0
  21. package/dist/ai/prompts.js.map +1 -0
  22. package/dist/ai/provider.d.ts +9 -0
  23. package/dist/ai/provider.d.ts.map +1 -0
  24. package/dist/ai/provider.js +66 -0
  25. package/dist/ai/provider.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +318 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/core/reporter.d.ts +7 -0
  31. package/dist/core/reporter.d.ts.map +1 -0
  32. package/dist/core/reporter.js +366 -0
  33. package/dist/core/reporter.js.map +1 -0
  34. package/dist/core/rules.d.ts +8 -0
  35. package/dist/core/rules.d.ts.map +1 -0
  36. package/dist/core/rules.js +1077 -0
  37. package/dist/core/rules.js.map +1 -0
  38. package/dist/core/scanner.d.ts +6 -0
  39. package/dist/core/scanner.d.ts.map +1 -0
  40. package/dist/core/scanner.js +217 -0
  41. package/dist/core/scanner.js.map +1 -0
  42. package/dist/core/severity.d.ts +100 -0
  43. package/dist/core/severity.d.ts.map +1 -0
  44. package/dist/core/severity.js +52 -0
  45. package/dist/core/severity.js.map +1 -0
  46. package/dist/detectors/auth.d.ts +3 -0
  47. package/dist/detectors/auth.d.ts.map +1 -0
  48. package/dist/detectors/auth.js +138 -0
  49. package/dist/detectors/auth.js.map +1 -0
  50. package/dist/detectors/crypto.d.ts +3 -0
  51. package/dist/detectors/crypto.d.ts.map +1 -0
  52. package/dist/detectors/crypto.js +128 -0
  53. package/dist/detectors/crypto.js.map +1 -0
  54. package/dist/detectors/dependency.d.ts +4 -0
  55. package/dist/detectors/dependency.d.ts.map +1 -0
  56. package/dist/detectors/dependency.js +267 -0
  57. package/dist/detectors/dependency.js.map +1 -0
  58. package/dist/detectors/deserialize.d.ts +3 -0
  59. package/dist/detectors/deserialize.d.ts.map +1 -0
  60. package/dist/detectors/deserialize.js +107 -0
  61. package/dist/detectors/deserialize.js.map +1 -0
  62. package/dist/detectors/injection.d.ts +3 -0
  63. package/dist/detectors/injection.d.ts.map +1 -0
  64. package/dist/detectors/injection.js +158 -0
  65. package/dist/detectors/injection.js.map +1 -0
  66. package/dist/detectors/misconfig.d.ts +3 -0
  67. package/dist/detectors/misconfig.d.ts.map +1 -0
  68. package/dist/detectors/misconfig.js +153 -0
  69. package/dist/detectors/misconfig.js.map +1 -0
  70. package/dist/detectors/pathtraversal.d.ts +3 -0
  71. package/dist/detectors/pathtraversal.d.ts.map +1 -0
  72. package/dist/detectors/pathtraversal.js +90 -0
  73. package/dist/detectors/pathtraversal.js.map +1 -0
  74. package/dist/detectors/prototype.d.ts +3 -0
  75. package/dist/detectors/prototype.d.ts.map +1 -0
  76. package/dist/detectors/prototype.js +79 -0
  77. package/dist/detectors/prototype.js.map +1 -0
  78. package/dist/detectors/secrets.d.ts +4 -0
  79. package/dist/detectors/secrets.d.ts.map +1 -0
  80. package/dist/detectors/secrets.js +137 -0
  81. package/dist/detectors/secrets.js.map +1 -0
  82. package/dist/detectors/ssrf.d.ts +3 -0
  83. package/dist/detectors/ssrf.d.ts.map +1 -0
  84. package/dist/detectors/ssrf.js +78 -0
  85. package/dist/detectors/ssrf.js.map +1 -0
  86. package/dist/detectors/zeroday.d.ts +9 -0
  87. package/dist/detectors/zeroday.d.ts.map +1 -0
  88. package/dist/detectors/zeroday.js +77 -0
  89. package/dist/detectors/zeroday.js.map +1 -0
  90. package/dist/index.d.ts +10 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +42 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/mcp/server.d.ts +2 -0
  95. package/dist/mcp/server.d.ts.map +1 -0
  96. package/dist/mcp/server.js +358 -0
  97. package/dist/mcp/server.js.map +1 -0
  98. package/dist/utils/config.d.ts +4 -0
  99. package/dist/utils/config.d.ts.map +1 -0
  100. package/dist/utils/config.js +97 -0
  101. package/dist/utils/config.js.map +1 -0
  102. package/dist/utils/fingerprint.d.ts +5 -0
  103. package/dist/utils/fingerprint.d.ts.map +1 -0
  104. package/dist/utils/fingerprint.js +55 -0
  105. package/dist/utils/fingerprint.js.map +1 -0
  106. package/dist/utils/languages.d.ts +8 -0
  107. package/dist/utils/languages.d.ts.map +1 -0
  108. package/dist/utils/languages.js +128 -0
  109. package/dist/utils/languages.js.map +1 -0
  110. package/package.json +53 -0
  111. package/src/ai/anthropic.ts +82 -0
  112. package/src/ai/huggingface.ts +111 -0
  113. package/src/ai/openai.ts +75 -0
  114. package/src/ai/prompts.ts +100 -0
  115. package/src/ai/provider.ts +68 -0
  116. package/src/cli/index.ts +314 -0
  117. package/src/core/reporter.ts +356 -0
  118. package/src/core/rules.ts +1089 -0
  119. package/src/core/scanner.ts +201 -0
  120. package/src/core/severity.ts +140 -0
  121. package/src/detectors/auth.ts +152 -0
  122. package/src/detectors/crypto.ts +128 -0
  123. package/src/detectors/dependency.ts +240 -0
  124. package/src/detectors/deserialize.ts +106 -0
  125. package/src/detectors/injection.ts +172 -0
  126. package/src/detectors/misconfig.ts +152 -0
  127. package/src/detectors/pathtraversal.ts +89 -0
  128. package/src/detectors/prototype.ts +77 -0
  129. package/src/detectors/secrets.ts +138 -0
  130. package/src/detectors/ssrf.ts +77 -0
  131. package/src/detectors/zeroday.ts +93 -0
  132. package/src/index.ts +24 -0
  133. package/src/mcp/server.ts +379 -0
  134. package/src/utils/config.ts +64 -0
  135. package/src/utils/fingerprint.ts +21 -0
  136. package/src/utils/languages.ts +95 -0
  137. package/tsconfig.json +20 -0
  138. package/vitest.config.ts +8 -0
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detect = detect;
4
+ exports.detectSecretsOnly = detectSecretsOnly;
5
+ const severity_1 = require("../core/severity");
6
+ const fingerprint_1 = require("../utils/fingerprint");
7
+ const PATTERNS = [
8
+ {
9
+ id: 'SEC-AWS-KEY', name: 'AWS Access Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
10
+ cwe: 'CWE-798', pattern: /(?:AKIA|ASIA)[A-Z0-9]{16}/,
11
+ antiPattern: /(?:example|sample|test|fake|dummy|placeholder|xxx|EXAMPLE)/i,
12
+ description: 'AWS access key ID found.', remediation: 'Rotate key immediately. Use IAM roles or env vars.',
13
+ },
14
+ {
15
+ id: 'SEC-AWS-SECRET', name: 'AWS Secret Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
16
+ cwe: 'CWE-798', pattern: /(?:aws_secret|AWS_SECRET)\w*\s*[:=]\s*['"][A-Za-z0-9/+=]{40}['"]/,
17
+ description: 'AWS secret access key found.', remediation: 'Rotate immediately. Use AWS Secrets Manager.',
18
+ },
19
+ {
20
+ id: 'SEC-GITHUB-TOKEN', name: 'GitHub Token', severity: severity_1.Severity.CRITICAL, confidence: 'high',
21
+ cwe: 'CWE-798', pattern: /(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}/,
22
+ description: 'GitHub personal access token found.', remediation: 'Rotate immediately. Use env vars.',
23
+ },
24
+ {
25
+ id: 'SEC-GOOGLE-KEY', name: 'Google API Key', severity: severity_1.Severity.HIGH, confidence: 'high',
26
+ cwe: 'CWE-798', pattern: /AIza[A-Za-z0-9_\\-]{35}/,
27
+ description: 'Google API key found.', remediation: 'Rotate and restrict key scope. Use env vars.',
28
+ },
29
+ {
30
+ id: 'SEC-SLACK-TOKEN', name: 'Slack Token', severity: severity_1.Severity.CRITICAL, confidence: 'high',
31
+ cwe: 'CWE-798', pattern: /xox[bpors]-[A-Za-z0-9\-]{10,}/,
32
+ description: 'Slack API token found.', remediation: 'Rotate immediately. Use env vars.',
33
+ },
34
+ {
35
+ id: 'SEC-STRIPE-KEY', name: 'Stripe API Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
36
+ cwe: 'CWE-798', pattern: /(?:sk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/,
37
+ description: 'Stripe API key found.', remediation: 'Rotate immediately. Use env vars.',
38
+ },
39
+ {
40
+ id: 'SEC-PRIVATE-KEY', name: 'Private Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
41
+ cwe: 'CWE-321', pattern: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/,
42
+ description: 'Private key embedded in source.', remediation: 'Remove from source. Use key management service.',
43
+ },
44
+ {
45
+ id: 'SEC-GENERIC-API-KEY', name: 'Generic API Key', severity: severity_1.Severity.HIGH, confidence: 'medium',
46
+ cwe: 'CWE-798', pattern: /(?:api[-_]?key|apikey|API[-_]?KEY)\s*[:=]\s*['"][a-zA-Z0-9_\-]{20,}['"]/i,
47
+ antiPattern: /(?:example|sample|test|fake|dummy|placeholder|xxx|your_|process\.env|os\.environ|config\.|env\[)/i,
48
+ description: 'Hardcoded API key found.', remediation: 'Store API keys in env vars or secrets manager.',
49
+ },
50
+ {
51
+ id: 'SEC-GENERIC-SECRET', name: 'Generic Secret/Password', severity: severity_1.Severity.HIGH, confidence: 'medium',
52
+ cwe: 'CWE-798', pattern: /(?:secret|token|password|passwd|credentials?)\s*[:=]\s*['"][a-zA-Z0-9!@#$%^&*()\-_+=]{12,}['"]/i,
53
+ antiPattern: /(?:example|sample|test|fake|dummy|placeholder|xxx|your_|process\.env|os\.environ|config\.|env\[|<|TODO|CHANGE|REPLACE|type|interface|const\s+\w+:\s*string)/i,
54
+ description: 'Potential hardcoded secret.', remediation: 'Use env vars or secrets manager.',
55
+ },
56
+ {
57
+ id: 'SEC-DB-CONN-STRING', name: 'Database Connection String', severity: severity_1.Severity.HIGH, confidence: 'high',
58
+ cwe: 'CWE-798', pattern: /['"](?:mongodb(?:\+srv)?|postgres(?:ql)?|mysql|mssql|redis|amqp):\/\/[^:]+:[^@]+@[^'"]+['"]/i,
59
+ antiPattern: /(?:localhost|127\.0\.0\.1|example\.com|process\.env|os\.environ)/i,
60
+ description: 'Database connection string with credentials.', remediation: 'Use env vars for connection strings.',
61
+ },
62
+ {
63
+ id: 'SEC-SENDGRID', name: 'SendGrid API Key', severity: severity_1.Severity.HIGH, confidence: 'high',
64
+ cwe: 'CWE-798', pattern: /SG\.[A-Za-z0-9_\-]{22}\.[A-Za-z0-9_\-]{43}/,
65
+ description: 'SendGrid API key found.', remediation: 'Rotate immediately. Use env vars.',
66
+ },
67
+ {
68
+ id: 'SEC-TWILIO', name: 'Twilio Credentials', severity: severity_1.Severity.HIGH, confidence: 'medium',
69
+ cwe: 'CWE-798', pattern: /(?:AC[a-z0-9]{32}|SK[a-z0-9]{32})/,
70
+ description: 'Twilio Account SID or API key found.', remediation: 'Rotate immediately. Use env vars.',
71
+ },
72
+ {
73
+ id: 'SEC-FIREBASE', name: 'Firebase Config Exposed', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
74
+ cwe: 'CWE-798', pattern: /(?:firebase|FIREBASE).*(?:apiKey|authDomain|databaseURL)\s*[:=]\s*['"]/i,
75
+ description: 'Firebase configuration in source.', remediation: 'Use env vars. Secure with Firebase Security Rules.',
76
+ },
77
+ {
78
+ id: 'SEC-HARDCODED-DB-PASS', name: 'Hardcoded Database Password', severity: severity_1.Severity.CRITICAL, confidence: 'high',
79
+ cwe: 'CWE-798', pattern: /(?:(?:db|database|mysql|postgres|mongo|redis)[-_.]?(?:password|passwd|pass|pwd))\s*[:=]\s*['"][^'"]{4,}['"]/i,
80
+ antiPattern: /(?:process\.env|os\.environ|config\.|env\[|example|sample|test|your_|placeholder)/i,
81
+ description: 'Database password hardcoded.', remediation: 'Use env vars or secrets manager.',
82
+ },
83
+ {
84
+ id: 'SEC-OPENAI-KEY', name: 'OpenAI API Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
85
+ cwe: 'CWE-798', pattern: /sk-[A-Za-z0-9]{32,}/,
86
+ antiPattern: /(?:example|sample|test|fake|placeholder|xxx)/i,
87
+ description: 'OpenAI API key found.', remediation: 'Rotate immediately. Use env vars.',
88
+ },
89
+ {
90
+ id: 'SEC-ANTHROPIC-KEY', name: 'Anthropic API Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
91
+ cwe: 'CWE-798', pattern: /sk-ant-[A-Za-z0-9\-]{32,}/,
92
+ description: 'Anthropic API key found.', remediation: 'Rotate immediately. Use env vars.',
93
+ },
94
+ ];
95
+ // All languages — secrets can appear anywhere
96
+ const ALL_LANGS = ['javascript', 'typescript', 'python', 'java', 'go', 'rust', 'c', 'cpp', 'csharp', 'php', 'ruby', 'swift', 'kotlin', 'shell', 'sql'];
97
+ function detect(content, filePath, _language) {
98
+ const findings = [];
99
+ const lines = content.split('\n');
100
+ for (const pat of PATTERNS) {
101
+ for (let i = 0; i < lines.length; i++) {
102
+ const line = lines[i];
103
+ if (pat.pattern.test(line)) {
104
+ if (pat.antiPattern && pat.antiPattern.test(line))
105
+ continue;
106
+ findings.push({
107
+ id: `${pat.id}-${filePath}:${i + 1}`,
108
+ ruleId: pat.id,
109
+ title: pat.name,
110
+ description: pat.description,
111
+ severity: pat.severity,
112
+ confidence: pat.confidence,
113
+ filePath, line: i + 1,
114
+ codeSnippet: getSnippet(lines, i),
115
+ cwe: pat.cwe, owasp: 'A02',
116
+ remediation: pat.remediation,
117
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
118
+ });
119
+ }
120
+ }
121
+ }
122
+ return findings;
123
+ }
124
+ function detectSecretsOnly(content, filePath) {
125
+ return detect(content, filePath, 'generic');
126
+ }
127
+ function getSnippet(lines, index, context = 2) {
128
+ const start = Math.max(0, index - context);
129
+ const end = Math.min(lines.length, index + context + 1);
130
+ return lines.slice(start, end)
131
+ .map((l, i) => {
132
+ const lineNum = start + i + 1;
133
+ const marker = (start + i === index) ? '>' : ' ';
134
+ return `${marker} ${lineNum} | ${l}`;
135
+ }).join('\n');
136
+ }
137
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/detectors/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Finding } from '../core/severity';
2
+ export declare function detect(content: string, filePath: string, language: string): Finding[];
3
+ //# sourceMappingURL=ssrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrf.d.ts","sourceRoot":"","sources":["../../src/detectors/ssrf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAmCrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA8BrF"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detect = detect;
4
+ const severity_1 = require("../core/severity");
5
+ const fingerprint_1 = require("../utils/fingerprint");
6
+ const PATTERNS = [
7
+ {
8
+ id: 'SSRF-USER-URL', name: 'SSRF via User-Controlled URL', severity: severity_1.Severity.HIGH, confidence: 'medium',
9
+ cwe: 'CWE-918',
10
+ pattern: /(?:fetch|axios|http\.get|https\.get|request|urllib|requests\.(?:get|post|put|delete|head)|HttpClient|http\.NewRequest)\s*\(\s*(?:req\.|request\.|input|user|param|query|body|args)/i,
11
+ description: 'HTTP request URL from user input — SSRF risk.',
12
+ remediation: 'Validate URLs against an allowlist. Block internal/private IP ranges.',
13
+ },
14
+ {
15
+ id: 'SSRF-URL-PARAM', name: 'URL From Query Parameter', severity: severity_1.Severity.HIGH, confidence: 'medium',
16
+ cwe: 'CWE-918',
17
+ pattern: /(?:url|uri|endpoint|target|destination|redirect|callback|webhook)\s*[:=]\s*(?:req\.query|req\.params|request\.args|request\.GET|params\[)/i,
18
+ description: 'URL taken from query parameter.',
19
+ remediation: 'Validate URL scheme, host, and resolved IP. Use allowlist.',
20
+ },
21
+ {
22
+ id: 'SSRF-IMAGE-FETCH', name: 'Image/File Fetch from URL', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
23
+ cwe: 'CWE-918',
24
+ pattern: /(?:download|fetch|grab|load|import)(?:Image|File|URL|Resource|Content)\s*\(\s*(?:url|uri|src|href|link)/i,
25
+ antiPattern: /(?:allowlist|whitelist|validateUrl|isAllowed|checkUrl|blockPrivate|isExternal)/i,
26
+ description: 'File/image download from variable URL.',
27
+ remediation: 'Validate URL and block internal IP ranges before fetching.',
28
+ },
29
+ {
30
+ id: 'SSRF-WEBHOOK', name: 'Webhook URL from User', severity: severity_1.Severity.HIGH, confidence: 'medium',
31
+ cwe: 'CWE-918',
32
+ pattern: /(?:webhook|callback|notify)(?:Url|URL|_url|Uri|URI)\s*[:=]\s*(?:req\.|request\.|body\.|input|user)/i,
33
+ description: 'Webhook URL from user input — can probe internal services.',
34
+ remediation: 'Validate webhook URLs. Block private IP ranges and localhost.',
35
+ },
36
+ ];
37
+ function detect(content, filePath, language) {
38
+ const findings = [];
39
+ const lines = content.split('\n');
40
+ const backendLangs = ['javascript', 'typescript', 'python', 'java', 'go', 'php', 'ruby', 'csharp', 'kotlin'];
41
+ if (!backendLangs.includes(language))
42
+ return findings;
43
+ for (const pat of PATTERNS) {
44
+ for (let i = 0; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ if (pat.pattern.test(line)) {
47
+ if (pat.antiPattern) {
48
+ const cs = Math.max(0, i - 3);
49
+ const ce = Math.min(lines.length, i + 4);
50
+ if (pat.antiPattern.test(lines.slice(cs, ce).join('\n')))
51
+ continue;
52
+ }
53
+ findings.push({
54
+ id: `${pat.id}-${filePath}:${i + 1}`,
55
+ ruleId: pat.id, title: pat.name, description: pat.description,
56
+ severity: pat.severity, confidence: pat.confidence,
57
+ filePath, line: i + 1,
58
+ codeSnippet: getSnippet(lines, i),
59
+ cwe: pat.cwe, owasp: 'A10',
60
+ remediation: pat.remediation,
61
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
62
+ });
63
+ }
64
+ }
65
+ }
66
+ return findings;
67
+ }
68
+ function getSnippet(lines, index, context = 2) {
69
+ const start = Math.max(0, index - context);
70
+ const end = Math.min(lines.length, index + context + 1);
71
+ return lines.slice(start, end)
72
+ .map((l, i) => {
73
+ const lineNum = start + i + 1;
74
+ const marker = (start + i === index) ? '>' : ' ';
75
+ return `${marker} ${lineNum} | ${l}`;
76
+ }).join('\n');
77
+ }
78
+ //# sourceMappingURL=ssrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrf.js","sourceRoot":"","sources":["../../src/detectors/ssrf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Finding, AIFinding } from '../core/severity';
2
+ export interface AIProvider {
3
+ name: string;
4
+ analyze(code: string, context: string): Promise<AIFinding[]>;
5
+ isAvailable(): boolean;
6
+ }
7
+ export declare function detectSuspiciousPatterns(content: string, filePath: string, language: string): Finding[];
8
+ export declare function analyzeWithAI(code: string, filePath: string, language: string, provider: AIProvider): Promise<Finding[]>;
9
+ //# sourceMappingURL=zeroday.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zeroday.d.ts","sourceRoot":"","sources":["../../src/detectors/zeroday.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGhE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7D,WAAW,IAAI,OAAO,CAAC;CACxB;AAaD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAyBvG;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CA8BpB"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectSuspiciousPatterns = detectSuspiciousPatterns;
4
+ exports.analyzeWithAI = analyzeWithAI;
5
+ const severity_1 = require("../core/severity");
6
+ const fingerprint_1 = require("../utils/fingerprint");
7
+ const SUSPICIOUS_PATTERNS = [
8
+ { pattern: /(?:setTimeout|setInterval)\s*\(\s*\w+\s*,\s*0\s*\)/, reason: 'Potential race condition with zero-delay timer' },
9
+ { pattern: /(?:await|async).*(?:parallel|all|race).*(?:db|database|write|update|delete|remove)/i, reason: 'Concurrent database operations may cause race conditions' },
10
+ { pattern: /if\s*\(\s*!?\s*(?:req|request)\.(?:user|session|auth)\s*\)\s*\{?\s*(?:return|throw|next)?[^}]*\}?\s*(?:\/\/|$)/i, reason: 'Authentication check may have bypass logic' },
11
+ { pattern: /(?:try\s*\{[^}]*(?:throw|error|reject)[^}]*\}\s*catch\s*\(\s*\w+\s*\)\s*\{[^}]*\})/i, reason: 'Error handling may silently swallow security exceptions' },
12
+ { pattern: /(?:\.then\s*\([^)]*\)\s*\.catch\s*\(\s*(?:\(\s*\)\s*=>|function\s*\(\s*\))\s*\{?\s*\}?\s*\))/i, reason: 'Empty catch handler silences errors' },
13
+ { pattern: /(?:Object\.keys|for\s*\(\s*(?:let|var|const)\s+\w+\s+(?:in|of)\s+).*(?:req\.|request\.|body|query|params)/i, reason: 'Iterating over user input keys without validation' },
14
+ { pattern: /(?:async\s+function|=>\s*\{)(?:(?!(?:try|catch|finally)).)*(?:await\s+)(?:(?!(?:try|catch|finally)).)*$/im, reason: 'Async function without error handling' },
15
+ { pattern: /(?:password|secret|token|key).*(?:===?|!==?|==).*(?:undefined|null|''|"")/i, reason: 'Null/empty check on credential may allow bypass' },
16
+ ];
17
+ function detectSuspiciousPatterns(content, filePath, language) {
18
+ const findings = [];
19
+ const lines = content.split('\n');
20
+ for (const { pattern, reason } of SUSPICIOUS_PATTERNS) {
21
+ for (let i = 0; i < lines.length; i++) {
22
+ if (pattern.test(lines[i])) {
23
+ findings.push({
24
+ id: `ZDAY-PATTERN-${filePath}:${i + 1}`,
25
+ ruleId: 'ZDAY-SUSPICIOUS',
26
+ title: 'Suspicious Pattern (AI Analysis Recommended)',
27
+ description: reason,
28
+ severity: severity_1.Severity.LOW,
29
+ confidence: 'low',
30
+ filePath, line: i + 1,
31
+ codeSnippet: getSnippet(lines, i),
32
+ cwe: 'CWE-691',
33
+ remediation: 'Enable AI analysis (--ai) for deeper investigation of this pattern.',
34
+ fingerprint: (0, fingerprint_1.generateFingerprint)('ZDAY', filePath, lines[i].trim()),
35
+ });
36
+ }
37
+ }
38
+ }
39
+ return findings;
40
+ }
41
+ async function analyzeWithAI(code, filePath, language, provider) {
42
+ if (!provider.isAvailable())
43
+ return [];
44
+ try {
45
+ const context = `File: ${filePath}\nLanguage: ${language}\n\nAnalyze this code for security vulnerabilities including:\n- Logic bugs that could lead to authorization bypass\n- Race conditions in concurrent operations\n- Business logic vulnerabilities\n- Novel attack vectors not caught by pattern matching\n- Time-of-check-to-time-of-use (TOCTOU) issues\n- Integer overflow/underflow\n- Null pointer dereference\n- Information leakage`;
46
+ const aiFindings = await provider.analyze(code, context);
47
+ return aiFindings.map((af, index) => ({
48
+ id: `ZDAY-AI-${filePath}:${index}`,
49
+ ruleId: 'ZDAY-AI',
50
+ title: af.title,
51
+ description: af.description,
52
+ severity: af.severity,
53
+ confidence: af.confidence,
54
+ filePath,
55
+ line: af.line || 1,
56
+ codeSnippet: code.split('\n').slice(Math.max(0, (af.line || 1) - 3), (af.line || 1) + 2).join('\n'),
57
+ cwe: af.cwe,
58
+ owasp: 'A04',
59
+ remediation: af.remediation,
60
+ aiEnhanced: true,
61
+ fingerprint: (0, fingerprint_1.generateFingerprint)('ZDAY-AI', filePath, af.title),
62
+ }));
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ function getSnippet(lines, index, context = 2) {
69
+ const start = Math.max(0, index - context);
70
+ const end = Math.min(lines.length, index + context + 1);
71
+ return lines.slice(start, end).map((l, i) => {
72
+ const lineNum = start + i + 1;
73
+ const marker = (start + i === index) ? '>' : ' ';
74
+ return `${marker} ${lineNum} | ${l}`;
75
+ }).join('\n');
76
+ }
77
+ //# sourceMappingURL=zeroday.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zeroday.js","sourceRoot":"","sources":["../../src/detectors/zeroday.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { scan, scanFile, scanWithAI } from './core/scanner';
2
+ export { generateReport, reportJSON, reportSARIF, reportHTML, reportTerminal } from './core/reporter';
3
+ export { Finding, AIFinding, ScanResult, ScanSummary, ScanOptions, Rule, GhostPatchConfig, Severity, SEVERITY_ORDER, meetsMinSeverity, severityFromString, } from './core/severity';
4
+ export { ALL_RULES, getRulesForLanguage, getRuleById, getRulesByOwasp, getRulesBySeverity, getEnabledRules } from './core/rules';
5
+ export { getAvailableProvider, AIProvider } from './ai/provider';
6
+ export { loadConfig, getDefaultConfig } from './utils/config';
7
+ export { detectLanguage, isSupportedFile, SUPPORTED_LANGUAGES } from './utils/languages';
8
+ export { generateFingerprint, deduplicateFindings } from './utils/fingerprint';
9
+ export { startMCPServer } from './mcp/server';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtG,OAAO,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjI,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // GhostPatch — AI-Powered Security Vulnerability Scanner
3
+ // Library API
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.startMCPServer = exports.deduplicateFindings = exports.generateFingerprint = exports.SUPPORTED_LANGUAGES = exports.isSupportedFile = exports.detectLanguage = exports.getDefaultConfig = exports.loadConfig = exports.getAvailableProvider = exports.getEnabledRules = exports.getRulesBySeverity = exports.getRulesByOwasp = exports.getRuleById = exports.getRulesForLanguage = exports.ALL_RULES = exports.severityFromString = exports.meetsMinSeverity = exports.SEVERITY_ORDER = exports.Severity = exports.reportTerminal = exports.reportHTML = exports.reportSARIF = exports.reportJSON = exports.generateReport = exports.scanWithAI = exports.scanFile = exports.scan = void 0;
6
+ var scanner_1 = require("./core/scanner");
7
+ Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scanner_1.scan; } });
8
+ Object.defineProperty(exports, "scanFile", { enumerable: true, get: function () { return scanner_1.scanFile; } });
9
+ Object.defineProperty(exports, "scanWithAI", { enumerable: true, get: function () { return scanner_1.scanWithAI; } });
10
+ var reporter_1 = require("./core/reporter");
11
+ Object.defineProperty(exports, "generateReport", { enumerable: true, get: function () { return reporter_1.generateReport; } });
12
+ Object.defineProperty(exports, "reportJSON", { enumerable: true, get: function () { return reporter_1.reportJSON; } });
13
+ Object.defineProperty(exports, "reportSARIF", { enumerable: true, get: function () { return reporter_1.reportSARIF; } });
14
+ Object.defineProperty(exports, "reportHTML", { enumerable: true, get: function () { return reporter_1.reportHTML; } });
15
+ Object.defineProperty(exports, "reportTerminal", { enumerable: true, get: function () { return reporter_1.reportTerminal; } });
16
+ var severity_1 = require("./core/severity");
17
+ Object.defineProperty(exports, "Severity", { enumerable: true, get: function () { return severity_1.Severity; } });
18
+ Object.defineProperty(exports, "SEVERITY_ORDER", { enumerable: true, get: function () { return severity_1.SEVERITY_ORDER; } });
19
+ Object.defineProperty(exports, "meetsMinSeverity", { enumerable: true, get: function () { return severity_1.meetsMinSeverity; } });
20
+ Object.defineProperty(exports, "severityFromString", { enumerable: true, get: function () { return severity_1.severityFromString; } });
21
+ var rules_1 = require("./core/rules");
22
+ Object.defineProperty(exports, "ALL_RULES", { enumerable: true, get: function () { return rules_1.ALL_RULES; } });
23
+ Object.defineProperty(exports, "getRulesForLanguage", { enumerable: true, get: function () { return rules_1.getRulesForLanguage; } });
24
+ Object.defineProperty(exports, "getRuleById", { enumerable: true, get: function () { return rules_1.getRuleById; } });
25
+ Object.defineProperty(exports, "getRulesByOwasp", { enumerable: true, get: function () { return rules_1.getRulesByOwasp; } });
26
+ Object.defineProperty(exports, "getRulesBySeverity", { enumerable: true, get: function () { return rules_1.getRulesBySeverity; } });
27
+ Object.defineProperty(exports, "getEnabledRules", { enumerable: true, get: function () { return rules_1.getEnabledRules; } });
28
+ var provider_1 = require("./ai/provider");
29
+ Object.defineProperty(exports, "getAvailableProvider", { enumerable: true, get: function () { return provider_1.getAvailableProvider; } });
30
+ var config_1 = require("./utils/config");
31
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
32
+ Object.defineProperty(exports, "getDefaultConfig", { enumerable: true, get: function () { return config_1.getDefaultConfig; } });
33
+ var languages_1 = require("./utils/languages");
34
+ Object.defineProperty(exports, "detectLanguage", { enumerable: true, get: function () { return languages_1.detectLanguage; } });
35
+ Object.defineProperty(exports, "isSupportedFile", { enumerable: true, get: function () { return languages_1.isSupportedFile; } });
36
+ Object.defineProperty(exports, "SUPPORTED_LANGUAGES", { enumerable: true, get: function () { return languages_1.SUPPORTED_LANGUAGES; } });
37
+ var fingerprint_1 = require("./utils/fingerprint");
38
+ Object.defineProperty(exports, "generateFingerprint", { enumerable: true, get: function () { return fingerprint_1.generateFingerprint; } });
39
+ Object.defineProperty(exports, "deduplicateFindings", { enumerable: true, get: function () { return fingerprint_1.deduplicateFindings; } });
40
+ var server_1 = require("./mcp/server");
41
+ Object.defineProperty(exports, "startMCPServer", { enumerable: true, get: function () { return server_1.startMCPServer; } });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,cAAc;;;AAEd,0CAA4D;AAAnD,+FAAA,IAAI,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,qGAAA,UAAU,OAAA;AACnC,4CAAsG;AAA7F,0GAAA,cAAc,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,0GAAA,cAAc,OAAA;AAC5E,4CAYyB;AAJvB,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,4GAAA,gBAAgB,OAAA;AAChB,8GAAA,kBAAkB,OAAA;AAEpB,sCAAiI;AAAxH,kGAAA,SAAS,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAC1G,0CAAiE;AAAxD,gHAAA,oBAAoB,OAAA;AAC7B,yCAA8D;AAArD,oGAAA,UAAU,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AACrC,+CAAyF;AAAhF,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAC7D,mDAA+E;AAAtE,kHAAA,mBAAmB,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AACjD,uCAA8C;AAArC,wGAAA,cAAc,OAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function startMCPServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAqSA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAqFpD"}