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,3 @@
1
+ import { Finding } from '../core/severity';
2
+ export declare function detect(content: string, filePath: string, language: string): Finding[];
3
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/detectors/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAkFrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAkCrF"}
@@ -0,0 +1,128 @@
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: 'CRYPTO-MD5', name: 'Weak Hash (MD5)', severity: severity_1.Severity.HIGH, confidence: 'high',
9
+ cwe: 'CWE-328', pattern: /(?:md5|MD5)\s*[\(.<]/,
10
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'php', 'ruby', 'csharp', 'c', 'cpp'],
11
+ description: 'MD5 is cryptographically broken.', remediation: 'Use SHA-256+ for integrity, bcrypt/argon2 for passwords.',
12
+ },
13
+ {
14
+ id: 'CRYPTO-SHA1', name: 'Weak Hash (SHA-1)', severity: severity_1.Severity.MEDIUM, confidence: 'high',
15
+ cwe: 'CWE-328', pattern: /(?:sha-?1|SHA-?1)\s*[\(.<'"]/,
16
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'php', 'ruby', 'csharp'],
17
+ description: 'SHA-1 is deprecated for security use.', remediation: 'Use SHA-256 or stronger.',
18
+ },
19
+ {
20
+ id: 'CRYPTO-WEAK-CIPHER', name: 'Weak Cipher Algorithm', severity: severity_1.Severity.HIGH, confidence: 'high',
21
+ cwe: 'CWE-327', pattern: /(?:createCipher(?:iv)?\s*\(\s*['"](?:des|rc4|rc2|blowfish)|DES(?:ede)?|RC4|Blowfish)\b/i,
22
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'csharp'],
23
+ description: 'Weak or broken cipher algorithm.', remediation: 'Use AES-256-GCM or ChaCha20-Poly1305.',
24
+ },
25
+ {
26
+ id: 'CRYPTO-ECB', name: 'ECB Mode', severity: severity_1.Severity.HIGH, confidence: 'high',
27
+ cwe: 'CWE-327', pattern: /(?:aes.*ecb|ECB|\.ECB|mode.*ecb|ecb.*mode)/i,
28
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'csharp'],
29
+ description: 'ECB mode does not provide semantic security.', remediation: 'Use GCM or CBC with HMAC.',
30
+ },
31
+ {
32
+ id: 'CRYPTO-MATH-RANDOM', name: 'Insecure Random (Math.random)', severity: severity_1.Severity.HIGH, confidence: 'high',
33
+ cwe: 'CWE-330', pattern: /Math\.random\s*\(\)/,
34
+ antiPattern: /(?:test|mock|sample|example|demo|shuffle|color|animation|ui|css|game|placeholder)/i,
35
+ languages: ['javascript', 'typescript'],
36
+ description: 'Math.random() is not cryptographically secure.', remediation: 'Use crypto.randomBytes() or crypto.getRandomValues().',
37
+ },
38
+ {
39
+ id: 'CRYPTO-HARDCODED-KEY', name: 'Hardcoded Encryption Key', severity: severity_1.Severity.CRITICAL, confidence: 'high',
40
+ cwe: 'CWE-321', pattern: /(?:(?:encryption|encrypt|cipher|aes|secret)[-_]?key)\s*[:=]\s*['"][^'"]{8,}['"]/i,
41
+ antiPattern: /(?:process\.env|os\.environ|config\.|env\[|example|placeholder|your_)/i,
42
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'php', 'ruby', 'csharp'],
43
+ description: 'Hardcoded encryption key in source code.', remediation: 'Use environment variables or key management service.',
44
+ },
45
+ {
46
+ id: 'CRYPTO-HARDCODED-IV', name: 'Hardcoded IV/Nonce', severity: severity_1.Severity.HIGH, confidence: 'medium',
47
+ cwe: 'CWE-329', pattern: /(?:iv|nonce|IV|NONCE)\s*[:=]\s*(?:['"][^'"]{8,}['"]|Buffer\.from\s*\(\s*['"])/,
48
+ languages: ['javascript', 'typescript', 'python', 'java', 'go'],
49
+ description: 'Hardcoded initialization vector.', remediation: 'Generate unique random IV per encryption operation.',
50
+ },
51
+ {
52
+ id: 'CRYPTO-TLS-DISABLED', name: 'TLS Verification Disabled', severity: severity_1.Severity.CRITICAL, confidence: 'high',
53
+ cwe: 'CWE-295', pattern: /(?:rejectUnauthorized\s*:\s*false|verify\s*=\s*False|InsecureSkipVerify\s*:\s*true|SSL_VERIFY_NONE|check_hostname\s*=\s*False)/,
54
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'ruby'],
55
+ description: 'TLS certificate verification disabled.', remediation: 'Always verify TLS certificates in production.',
56
+ },
57
+ {
58
+ id: 'CRYPTO-WEAK-PASS-HASH', name: 'Plain Hash for Password', severity: severity_1.Severity.HIGH, confidence: 'high',
59
+ cwe: 'CWE-916', pattern: /(?:createHash\s*\(\s*['"](?:md5|sha1|sha256)['"]|hashlib\.(?:md5|sha1|sha256))\s*[(.]/,
60
+ antiPattern: /(?:hmac|pbkdf2|checksum|file.*hash|integrity|verify)/i,
61
+ languages: ['javascript', 'typescript', 'python'],
62
+ description: 'Plain hash used for password storage.', remediation: 'Use bcrypt, scrypt, or argon2 for password hashing.',
63
+ },
64
+ {
65
+ id: 'CRYPTO-SMALL-KEY', name: 'Insufficient Key Length', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
66
+ cwe: 'CWE-326', pattern: /(?:generateKeyPair|RSA|keySize|modulusLength)\s*[:(]\s*(?:512|768|1024)\b/,
67
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'csharp'],
68
+ description: 'RSA key length below 2048 bits.', remediation: 'Use at least 2048-bit RSA keys.',
69
+ },
70
+ {
71
+ id: 'CRYPTO-HTTP', name: 'Unencrypted HTTP', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
72
+ cwe: 'CWE-319', pattern: /['"]http:\/\/(?!localhost|127\.0\.0\.1|0\.0\.0\.0|::1|example\.com)[^'"]+['"]/,
73
+ languages: ['javascript', 'typescript', 'python', 'java', 'go', 'php', 'ruby', 'csharp'],
74
+ description: 'Unencrypted HTTP URL for non-local endpoint.', remediation: 'Use HTTPS for all external communications.',
75
+ },
76
+ {
77
+ id: 'CRYPTO-TIMING', name: 'Timing Attack Vulnerable Comparison', severity: severity_1.Severity.MEDIUM, confidence: 'low',
78
+ cwe: 'CWE-208', pattern: /(?:===?\s*(?:password|token|secret|apiKey|hash)|(?:password|token|secret|apiKey|hash)\s*===?)/i,
79
+ antiPattern: /(?:timingSafe|constantTime|hmac\.compare|secrets\.compare_digest)/i,
80
+ languages: ['javascript', 'typescript', 'python', 'java', 'go'],
81
+ description: 'String comparison for secrets vulnerable to timing attacks.', remediation: 'Use crypto.timingSafeEqual() for secret comparison.',
82
+ },
83
+ ];
84
+ function detect(content, filePath, language) {
85
+ const findings = [];
86
+ const lines = content.split('\n');
87
+ for (const pat of PATTERNS) {
88
+ if (!pat.languages.includes(language))
89
+ continue;
90
+ for (let i = 0; i < lines.length; i++) {
91
+ const line = lines[i];
92
+ if (pat.pattern.test(line)) {
93
+ if (pat.antiPattern) {
94
+ const cs = Math.max(0, i - 3);
95
+ const ce = Math.min(lines.length, i + 4);
96
+ const ctx = lines.slice(cs, ce).join('\n');
97
+ if (pat.antiPattern.test(ctx))
98
+ continue;
99
+ }
100
+ findings.push({
101
+ id: `${pat.id}-${filePath}:${i + 1}`,
102
+ ruleId: pat.id,
103
+ title: pat.name,
104
+ description: pat.description,
105
+ severity: pat.severity,
106
+ confidence: pat.confidence,
107
+ filePath, line: i + 1,
108
+ codeSnippet: getSnippet(lines, i),
109
+ cwe: pat.cwe, owasp: 'A02',
110
+ remediation: pat.remediation,
111
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
112
+ });
113
+ }
114
+ }
115
+ }
116
+ return findings;
117
+ }
118
+ function getSnippet(lines, index, context = 2) {
119
+ const start = Math.max(0, index - context);
120
+ const end = Math.min(lines.length, index + context + 1);
121
+ return lines.slice(start, end)
122
+ .map((l, i) => {
123
+ const lineNum = start + i + 1;
124
+ const marker = (start + i === index) ? '>' : ' ';
125
+ return `${marker} ${lineNum} | ${l}`;
126
+ }).join('\n');
127
+ }
128
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/detectors/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Finding } from '../core/severity';
2
+ export declare function detect(content: string, filePath: string, _language: string): Finding[];
3
+ export declare function runNpmAudit(projectDir: string): Finding[];
4
+ //# sourceMappingURL=dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../src/detectors/dependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAMrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAiBtF;AA+JD,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,CAwCzD"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detect = detect;
37
+ exports.runNpmAudit = runNpmAudit;
38
+ const severity_1 = require("../core/severity");
39
+ const fingerprint_1 = require("../utils/fingerprint");
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const child_process_1 = require("child_process");
43
+ function detect(content, filePath, _language) {
44
+ const findings = [];
45
+ const basename = path.basename(filePath);
46
+ if (basename === 'package.json') {
47
+ findings.push(...checkPackageJson(content, filePath));
48
+ }
49
+ else if (basename === 'requirements.txt' || basename === 'Pipfile') {
50
+ findings.push(...checkPythonDeps(content, filePath));
51
+ }
52
+ else if (basename === 'pom.xml') {
53
+ findings.push(...checkMavenDeps(content, filePath));
54
+ }
55
+ else if (basename === 'go.mod') {
56
+ findings.push(...checkGoDeps(content, filePath));
57
+ }
58
+ else if (basename === 'Gemfile') {
59
+ findings.push(...checkRubyDeps(content, filePath));
60
+ }
61
+ return findings;
62
+ }
63
+ function checkPackageJson(content, filePath) {
64
+ const findings = [];
65
+ try {
66
+ const pkg = JSON.parse(content);
67
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
68
+ // Check for wildcard or latest versions
69
+ const lines = content.split('\n');
70
+ for (const [name, version] of Object.entries(allDeps)) {
71
+ const ver = version;
72
+ if (ver === '*' || ver === 'latest' || ver === '') {
73
+ const lineNum = findLine(lines, name);
74
+ findings.push({
75
+ id: `DEP-WILDCARD-${filePath}:${lineNum}`,
76
+ ruleId: 'DEP-WILDCARD',
77
+ title: `Wildcard Dependency: ${name}`,
78
+ description: `Package "${name}" uses wildcard version "${ver}". This can introduce breaking changes or vulnerabilities.`,
79
+ severity: severity_1.Severity.MEDIUM,
80
+ confidence: 'high',
81
+ filePath, line: lineNum,
82
+ codeSnippet: getSnippetFromLines(lines, lineNum - 1),
83
+ cwe: 'CWE-1104', owasp: 'A06',
84
+ remediation: 'Pin to a specific version range (e.g., ^1.2.3).',
85
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-WILDCARD', filePath, name),
86
+ });
87
+ }
88
+ }
89
+ // Check for known vulnerable packages
90
+ const knownVulnerable = {
91
+ 'lodash': { maxSafe: '4.17.21', cve: 'CVE-2021-23337', desc: 'Prototype pollution in lodash' },
92
+ 'minimist': { maxSafe: '1.2.6', cve: 'CVE-2021-44906', desc: 'Prototype pollution in minimist' },
93
+ 'node-fetch': { maxSafe: '2.6.7', cve: 'CVE-2022-0235', desc: 'Exposure of sensitive information' },
94
+ 'express': { maxSafe: '4.18.2', cve: 'CVE-2024-29041', desc: 'Open redirect in express' },
95
+ 'axios': { maxSafe: '1.6.0', cve: 'CVE-2023-45857', desc: 'CSRF in axios' },
96
+ 'jsonwebtoken': { maxSafe: '9.0.0', cve: 'CVE-2022-23529', desc: 'Insecure default algorithm' },
97
+ };
98
+ for (const [name, info] of Object.entries(knownVulnerable)) {
99
+ if (allDeps[name]) {
100
+ const lineNum = findLine(lines, name);
101
+ findings.push({
102
+ id: `DEP-VULN-${name}-${filePath}:${lineNum}`,
103
+ ruleId: 'DEP-KNOWN-VULN',
104
+ title: `Potentially Vulnerable: ${name}`,
105
+ description: `${info.desc} (${info.cve}). Check if version is below ${info.maxSafe}.`,
106
+ severity: severity_1.Severity.MEDIUM,
107
+ confidence: 'low',
108
+ filePath, line: lineNum,
109
+ codeSnippet: getSnippetFromLines(lines, lineNum - 1),
110
+ cwe: 'CWE-1035', owasp: 'A06',
111
+ remediation: `Update ${name} to version ${info.maxSafe} or later.`,
112
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-KNOWN-VULN', filePath, name),
113
+ });
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Invalid JSON — skip
119
+ }
120
+ return findings;
121
+ }
122
+ function checkPythonDeps(content, filePath) {
123
+ const findings = [];
124
+ const lines = content.split('\n');
125
+ const knownVuln = {
126
+ 'django': 'CVE-2023-46695',
127
+ 'flask': 'CVE-2023-30861',
128
+ 'requests': 'CVE-2023-32681',
129
+ 'pillow': 'CVE-2023-44271',
130
+ 'pyyaml': 'CVE-2020-14343',
131
+ 'jinja2': 'CVE-2024-22195',
132
+ };
133
+ for (let i = 0; i < lines.length; i++) {
134
+ const line = lines[i].trim();
135
+ if (!line || line.startsWith('#'))
136
+ continue;
137
+ const match = line.match(/^([a-zA-Z0-9_-]+)/);
138
+ if (match) {
139
+ const pkg = match[1].toLowerCase();
140
+ if (knownVuln[pkg]) {
141
+ findings.push({
142
+ id: `DEP-PY-${pkg}-${filePath}:${i + 1}`,
143
+ ruleId: 'DEP-PYTHON-VULN',
144
+ title: `Check Python Package: ${pkg}`,
145
+ description: `Package ${pkg} has known vulnerability ${knownVuln[pkg]}. Verify version.`,
146
+ severity: severity_1.Severity.MEDIUM, confidence: 'low',
147
+ filePath, line: i + 1,
148
+ codeSnippet: getSnippetFromLines(lines, i),
149
+ cwe: 'CWE-1035', owasp: 'A06',
150
+ remediation: `Update ${pkg} to the latest patched version.`,
151
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-PYTHON-VULN', filePath, pkg),
152
+ });
153
+ }
154
+ }
155
+ }
156
+ return findings;
157
+ }
158
+ function checkMavenDeps(content, filePath) {
159
+ const findings = [];
160
+ const lines = content.split('\n');
161
+ const knownVuln = ['log4j', 'commons-collections', 'struts', 'spring-core'];
162
+ for (let i = 0; i < lines.length; i++) {
163
+ const line = lines[i];
164
+ for (const pkg of knownVuln) {
165
+ if (line.includes(pkg)) {
166
+ findings.push({
167
+ id: `DEP-MAVEN-${pkg}-${filePath}:${i + 1}`,
168
+ ruleId: 'DEP-MAVEN-VULN',
169
+ title: `Check Maven Dependency: ${pkg}`,
170
+ description: `Package ${pkg} has a history of critical vulnerabilities. Verify version.`,
171
+ severity: severity_1.Severity.MEDIUM, confidence: 'low',
172
+ filePath, line: i + 1,
173
+ codeSnippet: getSnippetFromLines(lines, i),
174
+ cwe: 'CWE-1035', owasp: 'A06',
175
+ remediation: `Update ${pkg} to the latest patched version.`,
176
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-MAVEN-VULN', filePath, pkg),
177
+ });
178
+ }
179
+ }
180
+ }
181
+ return findings;
182
+ }
183
+ function checkGoDeps(content, filePath) {
184
+ return []; // Go module checking would require network access
185
+ }
186
+ function checkRubyDeps(content, filePath) {
187
+ const findings = [];
188
+ const lines = content.split('\n');
189
+ const knownVuln = ['rails', 'rack', 'actionpack', 'activesupport'];
190
+ for (let i = 0; i < lines.length; i++) {
191
+ const line = lines[i];
192
+ for (const pkg of knownVuln) {
193
+ if (line.includes(`'${pkg}'`) || line.includes(`"${pkg}"`)) {
194
+ findings.push({
195
+ id: `DEP-RUBY-${pkg}-${filePath}:${i + 1}`,
196
+ ruleId: 'DEP-RUBY-VULN',
197
+ title: `Check Ruby Gem: ${pkg}`,
198
+ description: `Gem ${pkg} has known vulnerabilities. Verify version.`,
199
+ severity: severity_1.Severity.MEDIUM, confidence: 'low',
200
+ filePath, line: i + 1,
201
+ codeSnippet: getSnippetFromLines(lines, i),
202
+ cwe: 'CWE-1035', owasp: 'A06',
203
+ remediation: `Update ${pkg} to the latest patched version.`,
204
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-RUBY-VULN', filePath, pkg),
205
+ });
206
+ }
207
+ }
208
+ }
209
+ return findings;
210
+ }
211
+ function runNpmAudit(projectDir) {
212
+ const findings = [];
213
+ try {
214
+ const lockPath = path.join(projectDir, 'package-lock.json');
215
+ if (!fs.existsSync(lockPath))
216
+ return findings;
217
+ const result = (0, child_process_1.execSync)('npm audit --json 2>/dev/null', {
218
+ cwd: projectDir,
219
+ timeout: 30000,
220
+ encoding: 'utf-8',
221
+ });
222
+ const audit = JSON.parse(result);
223
+ if (audit.vulnerabilities) {
224
+ for (const [name, info] of Object.entries(audit.vulnerabilities)) {
225
+ const severity = info.severity === 'critical' ? severity_1.Severity.CRITICAL
226
+ : info.severity === 'high' ? severity_1.Severity.HIGH
227
+ : info.severity === 'moderate' ? severity_1.Severity.MEDIUM
228
+ : severity_1.Severity.LOW;
229
+ findings.push({
230
+ id: `NPM-AUDIT-${name}`,
231
+ ruleId: 'DEP-NPM-AUDIT',
232
+ title: `Vulnerable Package: ${name}`,
233
+ description: `${info.via?.[0]?.title || 'Known vulnerability'} in ${name}@${info.range || 'unknown'}`,
234
+ severity, confidence: 'high',
235
+ filePath: path.join(projectDir, 'package.json'),
236
+ line: 1,
237
+ codeSnippet: `${name}: ${info.range || 'unknown version'}`,
238
+ cwe: info.via?.[0]?.cwe?.[0] || 'CWE-1035',
239
+ owasp: 'A06',
240
+ remediation: info.fixAvailable ? `Run: npm audit fix` : `Update ${name} manually.`,
241
+ fingerprint: (0, fingerprint_1.generateFingerprint)('DEP-NPM-AUDIT', name, info.range || ''),
242
+ });
243
+ }
244
+ }
245
+ }
246
+ catch {
247
+ // npm audit failed or not available
248
+ }
249
+ return findings;
250
+ }
251
+ function findLine(lines, searchTerm) {
252
+ for (let i = 0; i < lines.length; i++) {
253
+ if (lines[i].includes(searchTerm))
254
+ return i + 1;
255
+ }
256
+ return 1;
257
+ }
258
+ function getSnippetFromLines(lines, index, context = 2) {
259
+ const start = Math.max(0, index - context);
260
+ const end = Math.min(lines.length, index + context + 1);
261
+ return lines.slice(start, end).map((l, i) => {
262
+ const lineNum = start + i + 1;
263
+ const marker = (start + i === index) ? '>' : ' ';
264
+ return `${marker} ${lineNum} | ${l}`;
265
+ }).join('\n');
266
+ }
267
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/detectors/dependency.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=deserialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserialize.d.ts","sourceRoot":"","sources":["../../src/detectors/deserialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAkErD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA6BrF"}
@@ -0,0 +1,107 @@
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: 'DESER-JS', name: 'Insecure Deserialization (JS)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
9
+ cwe: 'CWE-502', languages: ['javascript', 'typescript'],
10
+ pattern: /(?:serialize|node-serialize|funcster|cryo)\s*\.\s*(?:unserialize|parse|deserialize)\s*\(/i,
11
+ description: 'Node.js deserialization of untrusted data can lead to RCE.',
12
+ remediation: 'Avoid native serialization. Use JSON for data exchange.',
13
+ },
14
+ {
15
+ id: 'DESER-YAML-JS', name: 'Unsafe YAML Loading (JS)', severity: severity_1.Severity.HIGH, confidence: 'high',
16
+ cwe: 'CWE-502', languages: ['javascript', 'typescript'],
17
+ pattern: /js-yaml\.load\s*\(/,
18
+ antiPattern: /(?:safeLoad|schema.*SAFE|JSON_SCHEMA|FAILSAFE)/i,
19
+ description: 'js-yaml.load() without safe schema can execute code.',
20
+ remediation: 'Use yaml.load(data, { schema: SAFE_SCHEMA }) or yaml.safeLoad().',
21
+ },
22
+ {
23
+ id: 'DESER-PICKLE', name: 'Insecure Deserialization (Python pickle)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
24
+ cwe: 'CWE-502', languages: ['python'],
25
+ pattern: /(?:pickle\.loads?|cPickle\.loads?|shelve\.open|dill\.loads?)\s*\(/,
26
+ description: 'Python pickle deserialization enables arbitrary code execution.',
27
+ remediation: 'Avoid pickle for untrusted data. Use JSON or protocol buffers.',
28
+ },
29
+ {
30
+ id: 'DESER-YAML-PY', name: 'Unsafe YAML Loading (Python)', severity: severity_1.Severity.HIGH, confidence: 'high',
31
+ cwe: 'CWE-502', languages: ['python'],
32
+ pattern: /yaml\.(?:load|unsafe_load)\s*\(/,
33
+ antiPattern: /(?:safe_load|SafeLoader|Loader\s*=\s*(?:yaml\.)?SafeLoader)/,
34
+ description: 'yaml.load() without SafeLoader enables code execution.',
35
+ remediation: 'Use yaml.safe_load() or yaml.load(data, Loader=SafeLoader).',
36
+ },
37
+ {
38
+ id: 'DESER-JAVA', name: 'Insecure Deserialization (Java)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
39
+ cwe: 'CWE-502', languages: ['java', 'kotlin'],
40
+ pattern: /(?:ObjectInputStream|readObject\s*\(|XMLDecoder|XStream|Kryo\.readObject|Hessian)\s*[\.(]/,
41
+ antiPattern: /(?:ObjectInputFilter|whitelist|allowlist|resolveClass)/i,
42
+ description: 'Java native deserialization enables RCE.',
43
+ remediation: 'Use allowlist-based ObjectInputFilter or avoid native serialization.',
44
+ },
45
+ {
46
+ id: 'DESER-PHP', name: 'Insecure Deserialization (PHP)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
47
+ cwe: 'CWE-502', languages: ['php'],
48
+ pattern: /(?:unserialize|phpunserialize)\s*\(\s*\$/,
49
+ description: 'PHP unserialize() with user input enables object injection.',
50
+ remediation: 'Use json_decode() instead. If using unserialize, set allowed_classes.',
51
+ },
52
+ {
53
+ id: 'DESER-RUBY', name: 'Insecure Deserialization (Ruby)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
54
+ cwe: 'CWE-502', languages: ['ruby'],
55
+ pattern: /(?:Marshal\.load|YAML\.load|Psych\.load)\s*\(/,
56
+ antiPattern: /(?:safe_load|permitted_classes)/i,
57
+ description: 'Ruby deserialization of untrusted data.',
58
+ remediation: 'Use YAML.safe_load or JSON.parse instead.',
59
+ },
60
+ {
61
+ id: 'DESER-DOTNET', name: 'Insecure Deserialization (.NET)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
62
+ cwe: 'CWE-502', languages: ['csharp'],
63
+ pattern: /(?:BinaryFormatter|SoapFormatter|NetDataContractSerializer|ObjectStateFormatter|LosFormatter)\.Deserialize\s*\(/,
64
+ description: '.NET deserialization with unsafe formatters.',
65
+ remediation: 'Use System.Text.Json or Newtonsoft.Json instead.',
66
+ },
67
+ ];
68
+ function detect(content, filePath, language) {
69
+ const findings = [];
70
+ const lines = content.split('\n');
71
+ for (const pat of PATTERNS) {
72
+ if (!pat.languages.includes(language))
73
+ continue;
74
+ for (let i = 0; i < lines.length; i++) {
75
+ const line = lines[i];
76
+ if (pat.pattern.test(line)) {
77
+ if (pat.antiPattern) {
78
+ const cs = Math.max(0, i - 3);
79
+ const ce = Math.min(lines.length, i + 4);
80
+ if (pat.antiPattern.test(lines.slice(cs, ce).join('\n')))
81
+ continue;
82
+ }
83
+ findings.push({
84
+ id: `${pat.id}-${filePath}:${i + 1}`,
85
+ ruleId: pat.id, title: pat.name, description: pat.description,
86
+ severity: pat.severity, confidence: pat.confidence,
87
+ filePath, line: i + 1,
88
+ codeSnippet: getSnippet(lines, i),
89
+ cwe: pat.cwe, owasp: 'A08',
90
+ remediation: pat.remediation,
91
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
92
+ });
93
+ }
94
+ }
95
+ }
96
+ return findings;
97
+ }
98
+ function getSnippet(lines, index, context = 2) {
99
+ const start = Math.max(0, index - context);
100
+ const end = Math.min(lines.length, index + context + 1);
101
+ return lines.slice(start, end).map((l, i) => {
102
+ const lineNum = start + i + 1;
103
+ const marker = (start + i === index) ? '>' : ' ';
104
+ return `${marker} ${lineNum} | ${l}`;
105
+ }).join('\n');
106
+ }
107
+ //# sourceMappingURL=deserialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserialize.js","sourceRoot":"","sources":["../../src/detectors/deserialize.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=injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../src/detectors/injection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAuHrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAwCrF"}