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,158 @@
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: 'INJ-SQL-CONCAT', name: 'SQL Injection (String Concatenation)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
9
+ cwe: 'CWE-89', pattern: /(?:query|execute|exec|raw|prepare)\s*\(\s*['"`](?:SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER)\b[^'"`]*['"`]\s*\+/i,
10
+ languages: ['javascript', 'typescript', 'python', 'java', 'php', 'ruby', 'csharp', 'go'],
11
+ description: 'SQL query constructed via string concatenation with potential user input.',
12
+ remediation: 'Use parameterized queries or prepared statements.',
13
+ },
14
+ {
15
+ id: 'INJ-SQL-TEMPLATE', name: 'SQL Injection (Template Literal)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
16
+ cwe: 'CWE-89', pattern: /(?:query|execute|exec|raw)\s*\(\s*`[^`]*(?:SELECT|INSERT|UPDATE|DELETE|DROP)\b[^`]*\$\{/i,
17
+ languages: ['javascript', 'typescript'],
18
+ description: 'SQL query built with template literals containing interpolated values.',
19
+ remediation: 'Use parameterized queries or tagged template literals (e.g., sql`...`).',
20
+ },
21
+ {
22
+ id: 'INJ-SQL-FSTRING', name: 'SQL Injection (f-string/format)', severity: severity_1.Severity.CRITICAL, confidence: 'high',
23
+ cwe: 'CWE-89', pattern: /(?:execute|cursor)\s*\(\s*(?:f['"]|['"].*['"]\s*\.format\s*\(|['"].*['"]\s*%\s*)/i,
24
+ antiPattern: /(?:parameterize|placeholder|%s.*,\s*\(|%s.*,\s*\[)/,
25
+ languages: ['python'],
26
+ description: 'SQL query built with Python f-string or .format().',
27
+ remediation: 'Use parameterized queries with %s placeholders and tuple arguments.',
28
+ },
29
+ {
30
+ id: 'INJ-CMD-EXEC', name: 'Command Injection', severity: severity_1.Severity.CRITICAL, confidence: 'high',
31
+ cwe: 'CWE-78', pattern: /(?:child_process|exec|execSync|spawn|spawnSync|system|popen|subprocess)\s*[\(.]\s*(?:`[^`]*\$\{|['"][^'"]*['"]\s*\+\s*\w|f['"])/i,
32
+ languages: ['javascript', 'typescript', 'python', 'ruby', 'php'],
33
+ description: 'Operating system command built with dynamic input.',
34
+ remediation: 'Use execFile with argument arrays. Never construct commands from user input.',
35
+ },
36
+ {
37
+ id: 'INJ-XSS-INNERHTML', name: 'XSS via innerHTML', severity: severity_1.Severity.HIGH, confidence: 'high',
38
+ cwe: 'CWE-79', pattern: /\.innerHTML\s*=\s*(?!['"](?:<br\s*\/?>|<hr\s*\/?>|<p>|<div>|<span>)['"])/,
39
+ languages: ['javascript', 'typescript'],
40
+ description: 'Setting innerHTML with potentially untrusted content.',
41
+ remediation: 'Use textContent for plain text, or sanitize with DOMPurify before innerHTML.',
42
+ },
43
+ {
44
+ id: 'INJ-XSS-DOCWRITE', name: 'XSS via document.write', severity: severity_1.Severity.HIGH, confidence: 'high',
45
+ cwe: 'CWE-79', pattern: /document\.write(?:ln)?\s*\(/,
46
+ languages: ['javascript', 'typescript'],
47
+ description: 'document.write() can introduce XSS vulnerabilities.',
48
+ remediation: 'Use DOM manipulation methods instead.',
49
+ },
50
+ {
51
+ id: 'INJ-XSS-REACT', name: 'XSS via dangerouslySetInnerHTML', severity: severity_1.Severity.HIGH, confidence: 'medium',
52
+ cwe: 'CWE-79', pattern: /dangerouslySetInnerHTML/,
53
+ antiPattern: /(?:DOMPurify|sanitize|purify|xss|escape)/i,
54
+ languages: ['javascript', 'typescript'],
55
+ description: 'React dangerouslySetInnerHTML used without visible sanitization.',
56
+ remediation: 'Sanitize content with DOMPurify before using dangerouslySetInnerHTML.',
57
+ },
58
+ {
59
+ id: 'INJ-EVAL', name: 'Code Injection via eval()', severity: severity_1.Severity.CRITICAL, confidence: 'high',
60
+ cwe: 'CWE-95', pattern: /\beval\s*\(\s*(?!['"][^'"]*['"])/,
61
+ languages: ['javascript', 'typescript', 'python', 'php', 'ruby'],
62
+ description: 'eval() with dynamic input enables arbitrary code execution.',
63
+ remediation: 'Avoid eval(). Use JSON.parse() for data, or purpose-built parsers.',
64
+ },
65
+ {
66
+ id: 'INJ-LDAP', name: 'LDAP Injection', severity: severity_1.Severity.HIGH, confidence: 'medium',
67
+ cwe: 'CWE-90', pattern: /(?:ldap|LDAP).*(?:search|bind|modify|add)\s*\(.*(?:\+\s*\w|`[^`]*\$\{|\.format|%s)/,
68
+ languages: ['javascript', 'typescript', 'python', 'java', 'csharp', 'php'],
69
+ description: 'LDAP query built with dynamic string construction.',
70
+ remediation: 'Escape special LDAP characters and use parameterized filters.',
71
+ },
72
+ {
73
+ id: 'INJ-NOSQL', name: 'NoSQL Injection', severity: severity_1.Severity.HIGH, confidence: 'medium',
74
+ cwe: 'CWE-943', pattern: /(?:find|findOne|deleteOne|updateOne|aggregate)\s*\(\s*(?:req\.body|req\.query|req\.params|request\.\w)/,
75
+ languages: ['javascript', 'typescript'],
76
+ description: 'MongoDB query using raw user input without sanitization.',
77
+ remediation: 'Validate input types and use query builders. Reject $-prefixed keys.',
78
+ },
79
+ {
80
+ id: 'INJ-SSTI', name: 'Server-Side Template Injection', severity: severity_1.Severity.CRITICAL, confidence: 'medium',
81
+ cwe: 'CWE-1336', pattern: /(?:render_template_string|Template\s*\(|nunjucks\.renderString|ejs\.render)\s*\(\s*(?:req|request|input|user)/i,
82
+ languages: ['javascript', 'typescript', 'python'],
83
+ description: 'User input passed directly as template source.',
84
+ remediation: 'Never use user input as template source. Use data binding with template files.',
85
+ },
86
+ {
87
+ id: 'INJ-XPATH', name: 'XPath Injection', severity: severity_1.Severity.HIGH, confidence: 'medium',
88
+ cwe: 'CWE-643', pattern: /(?:xpath|selectNodes?|evaluate)\s*\(.*(?:\+\s*\w|`[^`]*\$\{|\.format)/,
89
+ languages: ['javascript', 'typescript', 'python', 'java', 'csharp', 'php'],
90
+ description: 'XPath query built with dynamic input.',
91
+ remediation: 'Use parameterized XPath queries.',
92
+ },
93
+ {
94
+ id: 'INJ-HEADER', name: 'HTTP Header Injection', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
95
+ cwe: 'CWE-113', pattern: /(?:setHeader|writeHead|header)\s*\(\s*['"][^'"]+['"]\s*,\s*(?:req\.|request\.|input|user)/i,
96
+ languages: ['javascript', 'typescript', 'python', 'php'],
97
+ description: 'HTTP header value set from user input.',
98
+ remediation: 'Validate and sanitize header values. Reject newline characters.',
99
+ },
100
+ {
101
+ id: 'INJ-REGEX', name: 'ReDoS (Regular Expression DoS)', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
102
+ cwe: 'CWE-1333', pattern: /new\s+RegExp\s*\(\s*(?:req\.|request\.|input|user|param|query|body|arg)/i,
103
+ languages: ['javascript', 'typescript'],
104
+ description: 'Regular expression constructed from user input — ReDoS risk.',
105
+ remediation: 'Escape user input or use RE2 for safe regex evaluation.',
106
+ },
107
+ ];
108
+ function detect(content, filePath, language) {
109
+ const findings = [];
110
+ const lines = content.split('\n');
111
+ for (const pat of PATTERNS) {
112
+ if (!pat.languages.includes(language))
113
+ continue;
114
+ for (let i = 0; i < lines.length; i++) {
115
+ const line = lines[i];
116
+ if (pat.pattern.test(line)) {
117
+ if (pat.antiPattern && pat.antiPattern.test(line))
118
+ continue;
119
+ // Check surrounding context for anti-patterns
120
+ if (pat.antiPattern) {
121
+ const contextStart = Math.max(0, i - 3);
122
+ const contextEnd = Math.min(lines.length, i + 4);
123
+ const context = lines.slice(contextStart, contextEnd).join('\n');
124
+ if (pat.antiPattern.test(context))
125
+ continue;
126
+ }
127
+ findings.push({
128
+ id: `${pat.id}-${filePath}:${i + 1}`,
129
+ ruleId: pat.id,
130
+ title: pat.name,
131
+ description: pat.description,
132
+ severity: pat.severity,
133
+ confidence: pat.confidence,
134
+ filePath,
135
+ line: i + 1,
136
+ codeSnippet: getSnippet(lines, i),
137
+ cwe: pat.cwe,
138
+ owasp: 'A03',
139
+ remediation: pat.remediation,
140
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
141
+ });
142
+ }
143
+ }
144
+ }
145
+ return findings;
146
+ }
147
+ function getSnippet(lines, index, context = 2) {
148
+ const start = Math.max(0, index - context);
149
+ const end = Math.min(lines.length, index + context + 1);
150
+ return lines.slice(start, end)
151
+ .map((l, i) => {
152
+ const lineNum = start + i + 1;
153
+ const marker = (start + i === index) ? '>' : ' ';
154
+ return `${marker} ${lineNum} | ${l}`;
155
+ })
156
+ .join('\n');
157
+ }
158
+ //# sourceMappingURL=injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.js","sourceRoot":"","sources":["../../src/detectors/injection.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=misconfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misconfig.d.ts","sourceRoot":"","sources":["../../src/detectors/misconfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAkHrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA2BrF"}
@@ -0,0 +1,153 @@
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: 'CFG-DEBUG-ON', name: 'Debug Mode Enabled', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
9
+ cwe: 'CWE-489',
10
+ pattern: /(?:app\.debug\s*=\s*True|DEBUG\s*=\s*True|debug\s*:\s*true|EnableDebugging|\.setDebug\(true\))/i,
11
+ antiPattern: /(?:process\.env|os\.environ|config\.get|if\s|\.env|test|spec)/,
12
+ description: 'Debug mode hardcoded as enabled.',
13
+ remediation: 'Use environment variable for debug mode.',
14
+ },
15
+ {
16
+ id: 'CFG-INSECURE-COOKIE', name: 'Insecure Cookie Configuration', severity: severity_1.Severity.MEDIUM, confidence: 'high',
17
+ cwe: 'CWE-614',
18
+ pattern: /(?:secure\s*:\s*false|httpOnly\s*:\s*false)/i,
19
+ description: 'Cookie configured with insecure flags.',
20
+ remediation: 'Set secure: true and httpOnly: true for session cookies.',
21
+ },
22
+ {
23
+ id: 'CFG-SAMESITE-NONE', name: 'SameSite None Cookie', severity: severity_1.Severity.MEDIUM, confidence: 'high',
24
+ cwe: 'CWE-1275',
25
+ pattern: /sameSite\s*:\s*['"]?none['"]?/i,
26
+ description: 'Cookie SameSite set to None allows cross-site requests.',
27
+ remediation: 'Use SameSite: "strict" or "lax" unless cross-site is required.',
28
+ },
29
+ {
30
+ id: 'CFG-MISSING-HELMET', name: 'Missing Security Headers', severity: severity_1.Severity.LOW, confidence: 'low',
31
+ cwe: 'CWE-693',
32
+ pattern: /(?:app\.listen|createServer|express\(\))/,
33
+ antiPattern: /(?:helmet|security.*header|Content-Security-Policy|X-Frame-Options|Strict-Transport|csp)/i,
34
+ description: 'Web server may lack security headers.',
35
+ remediation: 'Use Helmet.js or manually set CSP, HSTS, X-Frame-Options.',
36
+ },
37
+ {
38
+ id: 'CFG-CORS-STAR', name: 'CORS Wildcard Origin', severity: severity_1.Severity.MEDIUM, confidence: 'high',
39
+ cwe: 'CWE-942',
40
+ pattern: /(?:origin\s*:\s*(?:true|['"]?\*['"]?)|Access-Control-Allow-Origin.*\*)/,
41
+ description: 'CORS allows all origins.',
42
+ remediation: 'Restrict CORS to specific trusted origins.',
43
+ },
44
+ {
45
+ id: 'CFG-GRAPHQL-INTRO', name: 'GraphQL Introspection Enabled', severity: severity_1.Severity.MEDIUM, confidence: 'high',
46
+ cwe: 'CWE-200',
47
+ pattern: /introspection\s*:\s*true/,
48
+ description: 'GraphQL introspection enabled — schema exposed.',
49
+ remediation: 'Disable introspection in production.',
50
+ },
51
+ {
52
+ id: 'CFG-ROOT-STATIC', name: 'Static Files from Root', severity: severity_1.Severity.HIGH, confidence: 'medium',
53
+ cwe: 'CWE-538',
54
+ pattern: /(?:express\.static|serveStatic)\s*\(\s*['"]\.?\/?['"]\s*\)/,
55
+ description: 'Serving static files from root may expose sensitive files.',
56
+ remediation: 'Serve static files from a dedicated public/ directory.',
57
+ },
58
+ {
59
+ id: 'CFG-DEFAULT-PORT', name: 'Default Debug Port', severity: severity_1.Severity.LOW, confidence: 'medium',
60
+ cwe: 'CWE-489',
61
+ pattern: /(?:--inspect|--debug|debugger.*port|debug-port)\s*(?:=\s*)?\d+/,
62
+ description: 'Debug port configuration found.',
63
+ remediation: 'Ensure debug ports are not exposed in production.',
64
+ },
65
+ {
66
+ id: 'CFG-PERMISSIVE-PERMS', name: 'Permissive File Permissions', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
67
+ cwe: 'CWE-732',
68
+ pattern: /(?:chmod\s+(?:777|666)|0o?777|permissions?\s*[:=]\s*0o?777)/,
69
+ description: 'World-writable file permissions.',
70
+ remediation: 'Use restrictive permissions (644 for files, 755 for directories).',
71
+ },
72
+ {
73
+ id: 'CFG-BIND-ALL', name: 'Binding to All Interfaces', severity: severity_1.Severity.LOW, confidence: 'medium',
74
+ cwe: 'CWE-668',
75
+ pattern: /(?:listen\s*\([^)]*['"]0\.0\.0\.0['"]|host\s*[:=]\s*['"]0\.0\.0\.0['"]|INADDR_ANY)/,
76
+ description: 'Server binding to all network interfaces.',
77
+ remediation: 'Bind to 127.0.0.1 in development.',
78
+ },
79
+ {
80
+ id: 'CFG-STACK-TRACE', name: 'Stack Trace Exposure', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
81
+ cwe: 'CWE-209',
82
+ pattern: /(?:res\.(?:send|json)\s*\(.*(?:err\.stack|error\.stack|stackTrace)|showStackError\s*:\s*true)/i,
83
+ description: 'Stack traces may be sent to clients.',
84
+ remediation: 'Log errors server-side, send generic messages to clients.',
85
+ },
86
+ {
87
+ id: 'CFG-BODY-NO-LIMIT', name: 'Body Parser Without Size Limit', severity: severity_1.Severity.MEDIUM, confidence: 'medium',
88
+ cwe: 'CWE-400',
89
+ pattern: /(?:bodyParser\.json\(\s*\)|express\.json\(\s*\))/,
90
+ antiPattern: /limit/,
91
+ description: 'JSON body parser without size limit.',
92
+ remediation: 'Set a body size limit: express.json({ limit: "100kb" }).',
93
+ },
94
+ {
95
+ id: 'CFG-ENV-EXPOSURE', name: 'Environment Variables Exposed', severity: severity_1.Severity.HIGH, confidence: 'high',
96
+ cwe: 'CWE-200',
97
+ pattern: /(?:res\.(?:send|json)|response\.)\s*\(\s*process\.env\s*\)/,
98
+ description: 'Entire process.env sent to client.',
99
+ remediation: 'Only send specific, non-sensitive config values.',
100
+ },
101
+ {
102
+ id: 'CFG-ELECTRON-NODE', name: 'Electron nodeIntegration Enabled', severity: severity_1.Severity.HIGH, confidence: 'high',
103
+ cwe: 'CWE-94',
104
+ pattern: /nodeIntegration\s*:\s*true/,
105
+ description: 'Electron nodeIntegration enabled — XSS leads to RCE.',
106
+ remediation: 'Disable nodeIntegration and use contextBridge.',
107
+ },
108
+ {
109
+ id: 'CFG-ELECTRON-CTX', name: 'Electron contextIsolation Disabled', severity: severity_1.Severity.HIGH, confidence: 'high',
110
+ cwe: 'CWE-94',
111
+ pattern: /contextIsolation\s*:\s*false/,
112
+ description: 'Electron contextIsolation disabled.',
113
+ remediation: 'Enable contextIsolation.',
114
+ },
115
+ ];
116
+ function detect(content, filePath, language) {
117
+ const findings = [];
118
+ const lines = content.split('\n');
119
+ for (const pat of PATTERNS) {
120
+ for (let i = 0; i < lines.length; i++) {
121
+ const line = lines[i];
122
+ if (pat.pattern.test(line)) {
123
+ if (pat.antiPattern) {
124
+ const cs = Math.max(0, i - 3);
125
+ const ce = Math.min(lines.length, i + 4);
126
+ if (pat.antiPattern.test(lines.slice(cs, ce).join('\n')))
127
+ continue;
128
+ }
129
+ findings.push({
130
+ id: `${pat.id}-${filePath}:${i + 1}`,
131
+ ruleId: pat.id, title: pat.name, description: pat.description,
132
+ severity: pat.severity, confidence: pat.confidence,
133
+ filePath, line: i + 1,
134
+ codeSnippet: getSnippet(lines, i),
135
+ cwe: pat.cwe, owasp: 'A05',
136
+ remediation: pat.remediation,
137
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
138
+ });
139
+ }
140
+ }
141
+ }
142
+ return findings;
143
+ }
144
+ function getSnippet(lines, index, context = 2) {
145
+ const start = Math.max(0, index - context);
146
+ const end = Math.min(lines.length, index + context + 1);
147
+ return lines.slice(start, end).map((l, i) => {
148
+ const lineNum = start + i + 1;
149
+ const marker = (start + i === index) ? '>' : ' ';
150
+ return `${marker} ${lineNum} | ${l}`;
151
+ }).join('\n');
152
+ }
153
+ //# sourceMappingURL=misconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misconfig.js","sourceRoot":"","sources":["../../src/detectors/misconfig.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=pathtraversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathtraversal.d.ts","sourceRoot":"","sources":["../../src/detectors/pathtraversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAkDrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA2BrF"}
@@ -0,0 +1,90 @@
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: 'PATH-TRAVERSAL-FS', name: 'Path Traversal (File System)', severity: severity_1.Severity.HIGH, confidence: 'medium',
9
+ cwe: 'CWE-22',
10
+ pattern: /(?:readFile|readFileSync|createReadStream|writeFile|writeFileSync|appendFile|unlink|unlinkSync|open|openSync|access|accessSync)\s*\(\s*(?:req\.|request\.|input|user|param|query|body|path\.join\s*\([^)]*req)/i,
11
+ description: 'File operation with user-controlled path — directory traversal risk.',
12
+ remediation: 'Validate paths. Use path.resolve() and verify against a base directory.',
13
+ },
14
+ {
15
+ id: 'PATH-TRAVERSAL-PY', name: 'Path Traversal (Python)', severity: severity_1.Severity.HIGH, confidence: 'medium',
16
+ cwe: 'CWE-22',
17
+ pattern: /(?:open|os\.path\.join|pathlib\.Path|shutil\.copy|os\.rename)\s*\(\s*(?:request\.|input|user_|flask\.request|args\.get|form\.get)/i,
18
+ description: 'File operation with user-controlled path in Python.',
19
+ remediation: 'Use os.path.realpath() and verify against base directory.',
20
+ },
21
+ {
22
+ id: 'PATH-TRAVERSAL-JAVA', name: 'Path Traversal (Java)', severity: severity_1.Severity.HIGH, confidence: 'medium',
23
+ cwe: 'CWE-22',
24
+ pattern: /(?:new\s+File|Paths\.get|FileInputStream|FileOutputStream)\s*\(\s*(?:request\.getParameter|servletRequest|param|input)/i,
25
+ description: 'File operation with user-controlled path in Java.',
26
+ remediation: 'Canonicalize path and verify it starts with the expected base directory.',
27
+ },
28
+ {
29
+ id: 'PATH-ZIP-SLIP', name: 'Zip Slip Vulnerability', severity: severity_1.Severity.HIGH, confidence: 'medium',
30
+ cwe: 'CWE-22',
31
+ pattern: /(?:extractAll|extract\s*\(|unzip|ZipFile|tar\.extractall|tar\.extract|decompress|gunzip)\s*\(/i,
32
+ antiPattern: /(?:validatePath|sanitize|startsWith|normalize|realpath|abspath|canonical)/i,
33
+ description: 'Archive extraction without path validation — Zip Slip vulnerability.',
34
+ remediation: 'Validate extracted paths stay within intended directory.',
35
+ },
36
+ {
37
+ id: 'PATH-DOT-DOT', name: 'Directory Traversal Sequence', severity: severity_1.Severity.HIGH, confidence: 'medium',
38
+ cwe: 'CWE-22',
39
+ pattern: /(?:\.\.\/|\.\.\\|%2e%2e%2f|%2e%2e\/|\.\.%2f|%2e%2e%5c)/i,
40
+ antiPattern: /(?:import|require|from\s+['"]|test|spec|relative)/,
41
+ description: 'Directory traversal sequence detected.',
42
+ remediation: 'Reject input containing ".." path sequences.',
43
+ },
44
+ {
45
+ id: 'PATH-SEND-FILE', name: 'Unsafe File Serving', severity: severity_1.Severity.HIGH, confidence: 'medium',
46
+ cwe: 'CWE-22',
47
+ pattern: /(?:sendFile|send_file|download|serveFile)\s*\(\s*(?:req\.|request\.|path\.join\s*\([^)]*(?:req|param|query))/i,
48
+ description: 'File sent to client based on user input.',
49
+ remediation: 'Validate file paths and restrict to safe directories.',
50
+ },
51
+ ];
52
+ function detect(content, filePath, language) {
53
+ const findings = [];
54
+ const lines = content.split('\n');
55
+ for (const pat of PATTERNS) {
56
+ for (let i = 0; i < lines.length; i++) {
57
+ const line = lines[i];
58
+ if (pat.pattern.test(line)) {
59
+ if (pat.antiPattern) {
60
+ const cs = Math.max(0, i - 3);
61
+ const ce = Math.min(lines.length, i + 4);
62
+ if (pat.antiPattern.test(lines.slice(cs, ce).join('\n')))
63
+ continue;
64
+ }
65
+ findings.push({
66
+ id: `${pat.id}-${filePath}:${i + 1}`,
67
+ ruleId: pat.id, title: pat.name, description: pat.description,
68
+ severity: pat.severity, confidence: pat.confidence,
69
+ filePath, line: i + 1,
70
+ codeSnippet: getSnippet(lines, i),
71
+ cwe: pat.cwe, owasp: 'A01',
72
+ remediation: pat.remediation,
73
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
74
+ });
75
+ }
76
+ }
77
+ }
78
+ return findings;
79
+ }
80
+ function getSnippet(lines, index, context = 2) {
81
+ const start = Math.max(0, index - context);
82
+ const end = Math.min(lines.length, index + context + 1);
83
+ return lines.slice(start, end)
84
+ .map((l, i) => {
85
+ const lineNum = start + i + 1;
86
+ const marker = (start + i === index) ? '>' : ' ';
87
+ return `${marker} ${lineNum} | ${l}`;
88
+ }).join('\n');
89
+ }
90
+ //# sourceMappingURL=pathtraversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathtraversal.js","sourceRoot":"","sources":["../../src/detectors/pathtraversal.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=prototype.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prototype.d.ts","sourceRoot":"","sources":["../../src/detectors/prototype.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAsCrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA4BrF"}
@@ -0,0 +1,79 @@
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: 'PROTO-MERGE', name: 'Prototype Pollution via Deep Merge', severity: severity_1.Severity.HIGH, confidence: 'medium',
9
+ cwe: 'CWE-1321',
10
+ pattern: /(?:Object\.assign|_\.merge|_\.extend|_\.defaultsDeep|deepmerge|deep-extend|merge-deep|lodash\.merge)\s*\(/,
11
+ antiPattern: /(?:Object\.create\(null\)|hasOwnProperty|__proto__|prototype|constructor.*check)/i,
12
+ description: 'Deep merge may allow prototype pollution.',
13
+ remediation: 'Validate input keys. Reject __proto__, constructor, and prototype.',
14
+ },
15
+ {
16
+ id: 'PROTO-BRACKET', name: 'Dynamic Property Assignment', severity: severity_1.Severity.MEDIUM, confidence: 'low',
17
+ cwe: 'CWE-1321',
18
+ pattern: /\w+\s*\[\s*(?:key|prop|name|field|attr|k|p|property)\s*\]\s*=\s*(?!undefined|null|false|true|0|''|"")/,
19
+ antiPattern: /(?:hasOwnProperty|Object\.keys|Object\.entries|whitelist|allowlist|sanitize|__proto__|prototype|constructor)/i,
20
+ description: 'Dynamic property assignment without prototype pollution guard.',
21
+ remediation: 'Check key is not __proto__, constructor, or prototype before assignment.',
22
+ },
23
+ {
24
+ id: 'PROTO-JSON-PARSE', name: 'JSON.parse Without Prototype Check', severity: severity_1.Severity.LOW, confidence: 'low',
25
+ cwe: 'CWE-1321',
26
+ pattern: /JSON\.parse\s*\(\s*(?:req\.|request\.|body|input|user|data)/i,
27
+ antiPattern: /(?:reviver|filter|sanitize|validate|schema)/i,
28
+ description: 'JSON.parse of user input may contain __proto__ keys.',
29
+ remediation: 'Use a JSON reviver to strip __proto__ keys, or validate input schema.',
30
+ },
31
+ {
32
+ id: 'PROTO-RECURSIVE', name: 'Recursive Object Copy', severity: severity_1.Severity.MEDIUM, confidence: 'low',
33
+ cwe: 'CWE-1321',
34
+ pattern: /function\s+(?:deep[Cc]opy|deep[Cc]lone|deep[Mm]erge|extend|assign[Dd]eep)\s*\(/,
35
+ antiPattern: /(?:__proto__|prototype|constructor|hasOwnProperty|Object\.create\(null\))/i,
36
+ description: 'Custom deep copy/merge may be vulnerable to prototype pollution.',
37
+ remediation: 'Add checks for __proto__, constructor, and prototype in recursive operations.',
38
+ },
39
+ ];
40
+ function detect(content, filePath, language) {
41
+ const findings = [];
42
+ if (!['javascript', 'typescript'].includes(language))
43
+ return findings;
44
+ const lines = content.split('\n');
45
+ for (const pat of PATTERNS) {
46
+ for (let i = 0; i < lines.length; i++) {
47
+ const line = lines[i];
48
+ if (pat.pattern.test(line)) {
49
+ if (pat.antiPattern) {
50
+ const cs = Math.max(0, i - 5);
51
+ const ce = Math.min(lines.length, i + 6);
52
+ if (pat.antiPattern.test(lines.slice(cs, ce).join('\n')))
53
+ continue;
54
+ }
55
+ findings.push({
56
+ id: `${pat.id}-${filePath}:${i + 1}`,
57
+ ruleId: pat.id, title: pat.name, description: pat.description,
58
+ severity: pat.severity, confidence: pat.confidence,
59
+ filePath, line: i + 1,
60
+ codeSnippet: getSnippet(lines, i),
61
+ cwe: pat.cwe, owasp: 'A03',
62
+ remediation: pat.remediation,
63
+ fingerprint: (0, fingerprint_1.generateFingerprint)(pat.id, filePath, line.trim()),
64
+ });
65
+ }
66
+ }
67
+ }
68
+ return findings;
69
+ }
70
+ function getSnippet(lines, index, context = 2) {
71
+ const start = Math.max(0, index - context);
72
+ const end = Math.min(lines.length, index + context + 1);
73
+ return lines.slice(start, end).map((l, i) => {
74
+ const lineNum = start + i + 1;
75
+ const marker = (start + i === index) ? '>' : ' ';
76
+ return `${marker} ${lineNum} | ${l}`;
77
+ }).join('\n');
78
+ }
79
+ //# sourceMappingURL=prototype.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prototype.js","sourceRoot":"","sources":["../../src/detectors/prototype.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 detectSecretsOnly(content: string, filePath: string): Finding[];
4
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/detectors/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AA+FrD,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CA2BtF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAE9E"}