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.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/__tests__/detectors.test.ts +224 -0
- package/__tests__/rules.test.ts +117 -0
- package/__tests__/scanner.test.ts +222 -0
- package/dist/ai/anthropic.d.ts +11 -0
- package/dist/ai/anthropic.d.ts.map +1 -0
- package/dist/ai/anthropic.js +76 -0
- package/dist/ai/anthropic.js.map +1 -0
- package/dist/ai/huggingface.d.ts +12 -0
- package/dist/ai/huggingface.d.ts.map +1 -0
- package/dist/ai/huggingface.js +95 -0
- package/dist/ai/huggingface.js.map +1 -0
- package/dist/ai/openai.d.ts +11 -0
- package/dist/ai/openai.d.ts.map +1 -0
- package/dist/ai/openai.js +71 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/prompts.d.ts +5 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +101 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/provider.d.ts +9 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +66 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +318 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/reporter.d.ts +7 -0
- package/dist/core/reporter.d.ts.map +1 -0
- package/dist/core/reporter.js +366 -0
- package/dist/core/reporter.js.map +1 -0
- package/dist/core/rules.d.ts +8 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +1077 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scanner.d.ts +6 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +217 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/severity.d.ts +100 -0
- package/dist/core/severity.d.ts.map +1 -0
- package/dist/core/severity.js +52 -0
- package/dist/core/severity.js.map +1 -0
- package/dist/detectors/auth.d.ts +3 -0
- package/dist/detectors/auth.d.ts.map +1 -0
- package/dist/detectors/auth.js +138 -0
- package/dist/detectors/auth.js.map +1 -0
- package/dist/detectors/crypto.d.ts +3 -0
- package/dist/detectors/crypto.d.ts.map +1 -0
- package/dist/detectors/crypto.js +128 -0
- package/dist/detectors/crypto.js.map +1 -0
- package/dist/detectors/dependency.d.ts +4 -0
- package/dist/detectors/dependency.d.ts.map +1 -0
- package/dist/detectors/dependency.js +267 -0
- package/dist/detectors/dependency.js.map +1 -0
- package/dist/detectors/deserialize.d.ts +3 -0
- package/dist/detectors/deserialize.d.ts.map +1 -0
- package/dist/detectors/deserialize.js +107 -0
- package/dist/detectors/deserialize.js.map +1 -0
- package/dist/detectors/injection.d.ts +3 -0
- package/dist/detectors/injection.d.ts.map +1 -0
- package/dist/detectors/injection.js +158 -0
- package/dist/detectors/injection.js.map +1 -0
- package/dist/detectors/misconfig.d.ts +3 -0
- package/dist/detectors/misconfig.d.ts.map +1 -0
- package/dist/detectors/misconfig.js +153 -0
- package/dist/detectors/misconfig.js.map +1 -0
- package/dist/detectors/pathtraversal.d.ts +3 -0
- package/dist/detectors/pathtraversal.d.ts.map +1 -0
- package/dist/detectors/pathtraversal.js +90 -0
- package/dist/detectors/pathtraversal.js.map +1 -0
- package/dist/detectors/prototype.d.ts +3 -0
- package/dist/detectors/prototype.d.ts.map +1 -0
- package/dist/detectors/prototype.js +79 -0
- package/dist/detectors/prototype.js.map +1 -0
- package/dist/detectors/secrets.d.ts +4 -0
- package/dist/detectors/secrets.d.ts.map +1 -0
- package/dist/detectors/secrets.js +137 -0
- package/dist/detectors/secrets.js.map +1 -0
- package/dist/detectors/ssrf.d.ts +3 -0
- package/dist/detectors/ssrf.d.ts.map +1 -0
- package/dist/detectors/ssrf.js +78 -0
- package/dist/detectors/ssrf.js.map +1 -0
- package/dist/detectors/zeroday.d.ts +9 -0
- package/dist/detectors/zeroday.d.ts.map +1 -0
- package/dist/detectors/zeroday.js +77 -0
- package/dist/detectors/zeroday.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +358 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +97 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fingerprint.d.ts +5 -0
- package/dist/utils/fingerprint.d.ts.map +1 -0
- package/dist/utils/fingerprint.js +55 -0
- package/dist/utils/fingerprint.js.map +1 -0
- package/dist/utils/languages.d.ts +8 -0
- package/dist/utils/languages.d.ts.map +1 -0
- package/dist/utils/languages.js +128 -0
- package/dist/utils/languages.js.map +1 -0
- package/package.json +53 -0
- package/src/ai/anthropic.ts +82 -0
- package/src/ai/huggingface.ts +111 -0
- package/src/ai/openai.ts +75 -0
- package/src/ai/prompts.ts +100 -0
- package/src/ai/provider.ts +68 -0
- package/src/cli/index.ts +314 -0
- package/src/core/reporter.ts +356 -0
- package/src/core/rules.ts +1089 -0
- package/src/core/scanner.ts +201 -0
- package/src/core/severity.ts +140 -0
- package/src/detectors/auth.ts +152 -0
- package/src/detectors/crypto.ts +128 -0
- package/src/detectors/dependency.ts +240 -0
- package/src/detectors/deserialize.ts +106 -0
- package/src/detectors/injection.ts +172 -0
- package/src/detectors/misconfig.ts +152 -0
- package/src/detectors/pathtraversal.ts +89 -0
- package/src/detectors/prototype.ts +77 -0
- package/src/detectors/secrets.ts +138 -0
- package/src/detectors/ssrf.ts +77 -0
- package/src/detectors/zeroday.ts +93 -0
- package/src/index.ts +24 -0
- package/src/mcp/server.ts +379 -0
- package/src/utils/config.ts +64 -0
- package/src/utils/fingerprint.ts +21 -0
- package/src/utils/languages.ts +95 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +8 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|