@kevinrabun/judges 3.23.10 → 3.23.13

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 (133) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/dist/api.d.ts +3 -1
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +3 -1
  5. package/dist/api.js.map +1 -1
  6. package/dist/ast/structural-parser.d.ts.map +1 -1
  7. package/dist/ast/structural-parser.js +148 -3
  8. package/dist/ast/structural-parser.js.map +1 -1
  9. package/dist/auto-tune.d.ts +147 -0
  10. package/dist/auto-tune.d.ts.map +1 -0
  11. package/dist/auto-tune.js +374 -0
  12. package/dist/auto-tune.js.map +1 -0
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +7 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/auto-detect.js.map +1 -1
  17. package/dist/commands/benchmark-expanded-2.d.ts +13 -0
  18. package/dist/commands/benchmark-expanded-2.d.ts.map +1 -0
  19. package/dist/commands/benchmark-expanded-2.js +5531 -0
  20. package/dist/commands/benchmark-expanded-2.js.map +1 -0
  21. package/dist/commands/benchmark-expanded.d.ts +13 -0
  22. package/dist/commands/benchmark-expanded.d.ts.map +1 -0
  23. package/dist/commands/benchmark-expanded.js +2600 -0
  24. package/dist/commands/benchmark-expanded.js.map +1 -0
  25. package/dist/commands/benchmark.d.ts +1 -0
  26. package/dist/commands/benchmark.d.ts.map +1 -1
  27. package/dist/commands/benchmark.js +176 -3
  28. package/dist/commands/benchmark.js.map +1 -1
  29. package/dist/commands/doctor.js.map +1 -1
  30. package/dist/commands/feedback.d.ts.map +1 -1
  31. package/dist/commands/feedback.js +13 -0
  32. package/dist/commands/feedback.js.map +1 -1
  33. package/dist/commands/lsp.d.ts.map +1 -1
  34. package/dist/commands/lsp.js.map +1 -1
  35. package/dist/commands/review.d.ts +8 -0
  36. package/dist/commands/review.d.ts.map +1 -1
  37. package/dist/commands/review.js +175 -13
  38. package/dist/commands/review.js.map +1 -1
  39. package/dist/commands/tune.js.map +1 -1
  40. package/dist/dedup.d.ts.map +1 -1
  41. package/dist/dedup.js +24 -2
  42. package/dist/dedup.js.map +1 -1
  43. package/dist/disk-cache.js.map +1 -1
  44. package/dist/evaluators/accessibility.d.ts.map +1 -1
  45. package/dist/evaluators/accessibility.js +18 -4
  46. package/dist/evaluators/accessibility.js.map +1 -1
  47. package/dist/evaluators/agent-instructions.d.ts.map +1 -1
  48. package/dist/evaluators/agent-instructions.js +52 -1
  49. package/dist/evaluators/agent-instructions.js.map +1 -1
  50. package/dist/evaluators/authentication.d.ts.map +1 -1
  51. package/dist/evaluators/authentication.js +51 -2
  52. package/dist/evaluators/authentication.js.map +1 -1
  53. package/dist/evaluators/caching.d.ts.map +1 -1
  54. package/dist/evaluators/caching.js +5 -4
  55. package/dist/evaluators/caching.js.map +1 -1
  56. package/dist/evaluators/ci-cd.d.ts.map +1 -1
  57. package/dist/evaluators/ci-cd.js +23 -0
  58. package/dist/evaluators/ci-cd.js.map +1 -1
  59. package/dist/evaluators/compliance.d.ts.map +1 -1
  60. package/dist/evaluators/compliance.js +5 -1
  61. package/dist/evaluators/compliance.js.map +1 -1
  62. package/dist/evaluators/concurrency.d.ts.map +1 -1
  63. package/dist/evaluators/concurrency.js +34 -0
  64. package/dist/evaluators/concurrency.js.map +1 -1
  65. package/dist/evaluators/cybersecurity.d.ts.map +1 -1
  66. package/dist/evaluators/cybersecurity.js +231 -0
  67. package/dist/evaluators/cybersecurity.js.map +1 -1
  68. package/dist/evaluators/false-positive-review.js +25 -20
  69. package/dist/evaluators/false-positive-review.js.map +1 -1
  70. package/dist/evaluators/hallucination-detection.d.ts +3 -0
  71. package/dist/evaluators/hallucination-detection.d.ts.map +1 -0
  72. package/dist/evaluators/hallucination-detection.js +463 -0
  73. package/dist/evaluators/hallucination-detection.js.map +1 -0
  74. package/dist/evaluators/iac-security.d.ts.map +1 -1
  75. package/dist/evaluators/iac-security.js +18 -1
  76. package/dist/evaluators/iac-security.js.map +1 -1
  77. package/dist/evaluators/index.d.ts.map +1 -1
  78. package/dist/evaluators/index.js +18 -6
  79. package/dist/evaluators/index.js.map +1 -1
  80. package/dist/evaluators/maintainability.d.ts.map +1 -1
  81. package/dist/evaluators/maintainability.js +46 -0
  82. package/dist/evaluators/maintainability.js.map +1 -1
  83. package/dist/evaluators/observability.d.ts.map +1 -1
  84. package/dist/evaluators/observability.js +19 -1
  85. package/dist/evaluators/observability.js.map +1 -1
  86. package/dist/evaluators/reliability.d.ts.map +1 -1
  87. package/dist/evaluators/reliability.js +17 -1
  88. package/dist/evaluators/reliability.js.map +1 -1
  89. package/dist/evaluators/scalability.js +1 -1
  90. package/dist/evaluators/scalability.js.map +1 -1
  91. package/dist/evaluators/security.d.ts +13 -0
  92. package/dist/evaluators/security.d.ts.map +1 -0
  93. package/dist/evaluators/security.js +529 -0
  94. package/dist/evaluators/security.js.map +1 -0
  95. package/dist/evaluators/shared.d.ts.map +1 -1
  96. package/dist/evaluators/shared.js +15 -3
  97. package/dist/evaluators/shared.js.map +1 -1
  98. package/dist/evaluators/software-practices.d.ts.map +1 -1
  99. package/dist/evaluators/software-practices.js +20 -0
  100. package/dist/evaluators/software-practices.js.map +1 -1
  101. package/dist/evaluators/testing.d.ts.map +1 -1
  102. package/dist/evaluators/testing.js +3 -3
  103. package/dist/evaluators/testing.js.map +1 -1
  104. package/dist/evaluators/ux.d.ts.map +1 -1
  105. package/dist/evaluators/ux.js +10 -2
  106. package/dist/evaluators/ux.js.map +1 -1
  107. package/dist/github-app.d.ts +96 -0
  108. package/dist/github-app.d.ts.map +1 -0
  109. package/dist/github-app.js +541 -0
  110. package/dist/github-app.js.map +1 -0
  111. package/dist/index.js +8 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/judges/hallucination-detection.d.ts +3 -0
  114. package/dist/judges/hallucination-detection.d.ts.map +1 -0
  115. package/dist/judges/hallucination-detection.js +30 -0
  116. package/dist/judges/hallucination-detection.js.map +1 -0
  117. package/dist/judges/index.d.ts.map +1 -1
  118. package/dist/judges/index.js +8 -0
  119. package/dist/judges/index.js.map +1 -1
  120. package/dist/judges/security.d.ts +3 -0
  121. package/dist/judges/security.d.ts.map +1 -0
  122. package/dist/judges/security.js +28 -0
  123. package/dist/judges/security.js.map +1 -0
  124. package/dist/language-patterns.d.ts.map +1 -1
  125. package/dist/language-patterns.js +12 -4
  126. package/dist/language-patterns.js.map +1 -1
  127. package/dist/patches/index.d.ts.map +1 -1
  128. package/dist/patches/index.js +501 -0
  129. package/dist/patches/index.js.map +1 -1
  130. package/dist/types.d.ts +1 -1
  131. package/dist/types.d.ts.map +1 -1
  132. package/package.json +1 -1
  133. package/server.json +3 -3
@@ -0,0 +1,529 @@
1
+ import { getLangFamily, testCode } from "./shared.js";
2
+ /**
3
+ * General Security Posture evaluator.
4
+ *
5
+ * Produces SEC-prefixed findings for broad security anti-patterns:
6
+ * insecure data flows, weak cryptography, missing security controls,
7
+ * and unsafe code patterns across all supported languages.
8
+ *
9
+ * Complements domain-specific judges (CYBER, AUTH, DATA) by providing
10
+ * a holistic security assessment.
11
+ */
12
+ export function analyzeSecurity(code, language) {
13
+ const findings = [];
14
+ let ruleNum = 1;
15
+ const prefix = "SEC";
16
+ const lang = getLangFamily(language);
17
+ const lines = code.split("\n");
18
+ // ── SEC-001: Untrusted input in database query construction ────────────
19
+ // Broad pattern: SQL keywords + string interpolation/concatenation
20
+ {
21
+ const sqlDataFlowLines = [];
22
+ for (let i = 0; i < lines.length; i++) {
23
+ const line = lines[i];
24
+ // Require 2+ SQL keywords on the same line to avoid matching UI labels
25
+ // like "Select ${user.name}" which contain a single SQL keyword.
26
+ const sqlKeywords = line.match(/\b(?:SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|SET|VALUES|INTO|JOIN|ORDER\s+BY|GROUP\s+BY)\b/gi) || [];
27
+ if (sqlKeywords.length < 2)
28
+ continue;
29
+ if (/\$\{/.test(line) || // template literal interpolation
30
+ /\+\s*\w/.test(line) || // string concatenation
31
+ /f["']/.test(line) || // Python f-string
32
+ /\.format\s*\(/.test(line) || // Python .format()
33
+ /String\.format/i.test(line) || // Java String.format
34
+ /fmt\.Sprintf/i.test(line) || // Go fmt.Sprintf
35
+ /%s/.test(line) // printf-style interpolation
36
+ ) {
37
+ sqlDataFlowLines.push(i + 1);
38
+ }
39
+ }
40
+ if (sqlDataFlowLines.length > 0) {
41
+ findings.push({
42
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
43
+ severity: "critical",
44
+ title: "Untrusted input flows into database query construction",
45
+ description: "Database queries are built using dynamic string operations (concatenation, interpolation, or formatting) which can introduce injection vulnerabilities when user-controlled data is included.",
46
+ lineNumbers: sqlDataFlowLines,
47
+ recommendation: "Use parameterized queries or prepared statements exclusively. Separate SQL structure from data values.",
48
+ reference: "CWE-89",
49
+ suggestedFix: "Replace string building with parameterized queries: db.query('SELECT * FROM t WHERE id = $1', [id]).",
50
+ confidence: 0.9,
51
+ });
52
+ }
53
+ }
54
+ // ── SEC-002: Weak cryptographic algorithm for sensitive operations ──────
55
+ {
56
+ const weakCryptoLines = [];
57
+ for (let i = 0; i < lines.length; i++) {
58
+ const line = lines[i];
59
+ if (/\b(?:md5|sha1|sha-1|DES|RC4|RC2|Blowfish)\b/i.test(line) &&
60
+ /\b(?:password|passwd|hash|digest|crypt|sign|verify|secret|token|credential)\b/i.test(line)) {
61
+ weakCryptoLines.push(i + 1);
62
+ }
63
+ // Also catch createHash('md5') or hashlib.md5() near password context
64
+ if (/(?:createHash|hashlib\.|MessageDigest\.getInstance|Hash(?:Algorithm)?)\s*\(\s*['"]?(?:md5|sha-?1)['"]?\s*\)/i.test(line)) {
65
+ const ctx = lines.slice(Math.max(0, i - 3), Math.min(lines.length, i + 4)).join("\n");
66
+ if (/password|passwd|credential|secret|user/i.test(ctx)) {
67
+ weakCryptoLines.push(i + 1);
68
+ }
69
+ }
70
+ }
71
+ const uniqueLines = [...new Set(weakCryptoLines)].sort((a, b) => a - b);
72
+ if (uniqueLines.length > 0) {
73
+ findings.push({
74
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
75
+ severity: "high",
76
+ title: "Weak cryptographic algorithm used for sensitive operations",
77
+ description: "A cryptographically weak algorithm (MD5, SHA-1, DES, RC4) is used in a security-sensitive context. These algorithms have known collision or brute-force vulnerabilities.",
78
+ lineNumbers: uniqueLines,
79
+ recommendation: "Use bcrypt, scrypt, or Argon2 for password hashing. Use SHA-256+ or AES-256-GCM for general cryptographic operations.",
80
+ reference: "CWE-327 / CWE-328",
81
+ suggestedFix: "Replace MD5/SHA1 with bcrypt for passwords: await bcrypt.hash(password, 12). For general hashing use SHA-256.",
82
+ confidence: 0.9,
83
+ });
84
+ }
85
+ }
86
+ // ── SEC-003: Uncontrolled file system access with dynamic paths ─────────
87
+ {
88
+ const fsAccessLines = [];
89
+ for (let i = 0; i < lines.length; i++) {
90
+ const line = lines[i];
91
+ if (/\b(?:readFile|readFileSync|createReadStream|writeFile|writeFileSync|readdir|unlink|stat|access|open|sendFile|fs\.\w+)\s*\(/i.test(line) ||
92
+ /\b(?:os\.(?:Open|ReadFile)|ioutil\.ReadFile|File\.(?:read|open|new)|file_get_contents|fopen)\s*\(/i.test(line)) {
93
+ // Check if user input is involved (exclude compound identifiers like InputDir, userHome)
94
+ const ctx = lines.slice(Math.max(0, i - 5), Math.min(lines.length, i + 2)).join("\n");
95
+ if (/(?:req\.|request\.|params\.|query\.|body\.|args\.|argv|\binput\s*[=:[(.]|\buser\s*[=:[(.])/i.test(ctx) &&
96
+ /(?:\+|`[^`]*\$\{|\.format|path\.join|Path\.Combine|filepath\.Join|os\.path\.join)/i.test(ctx)) {
97
+ fsAccessLines.push(i + 1);
98
+ }
99
+ }
100
+ }
101
+ if (fsAccessLines.length > 0) {
102
+ findings.push({
103
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
104
+ severity: "critical",
105
+ title: "Uncontrolled file system access with dynamic path construction",
106
+ description: "File system operations use paths constructed from external input without validation, potentially allowing access to arbitrary files via directory traversal sequences.",
107
+ lineNumbers: fsAccessLines,
108
+ recommendation: "Validate and canonicalize file paths. Ensure resolved paths stay within an allowed base directory. Reject paths containing '..' sequences.",
109
+ reference: "CWE-22 / CWE-73",
110
+ suggestedFix: "Validate: const safe = path.resolve(BASE, userInput); if (!safe.startsWith(BASE)) throw new Error('blocked');",
111
+ confidence: 0.9,
112
+ });
113
+ }
114
+ }
115
+ // ── SEC-004: Sensitive data transmitted over unencrypted channel ────────
116
+ {
117
+ const httpInsecureLines = [];
118
+ for (let i = 0; i < lines.length; i++) {
119
+ const line = lines[i];
120
+ if (/["'`]http:\/\/(?!localhost|127\.0\.0\.1|0\.0\.0\.0|example\.com|test)[^"'`\s]+/i.test(line)) {
121
+ const ctx = lines.slice(Math.max(0, i - 2), Math.min(lines.length, i + 3)).join("\n");
122
+ if (/\b(?:fetch|axios|request|http\.get|requests\.|urllib|HttpClient|curl|api|auth|login|password|token|payment|secret|key|credential)\b/i.test(ctx)) {
123
+ httpInsecureLines.push(i + 1);
124
+ }
125
+ }
126
+ }
127
+ if (httpInsecureLines.length > 0) {
128
+ findings.push({
129
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
130
+ severity: "high",
131
+ title: "Sensitive data transmitted over unencrypted channel",
132
+ description: "HTTP (non-TLS) URLs are used in contexts involving sensitive operations or data. Network traffic can be intercepted by attackers on the same network.",
133
+ lineNumbers: httpInsecureLines,
134
+ recommendation: "Use HTTPS for all production endpoints. Enforce TLS for any communication involving authentication, tokens, or sensitive data.",
135
+ reference: "CWE-319 / CWE-523",
136
+ suggestedFix: "Replace http:// with https:// for all production endpoints.",
137
+ confidence: 0.85,
138
+ });
139
+ }
140
+ }
141
+ // ── SEC-005: API endpoint without input validation or sanitization ──────
142
+ {
143
+ const hasEndpoints = testCode(code, /app\.(?:get|post|put|patch|delete)\s*\(/gi) ||
144
+ testCode(code, /@(?:app\.route|Get|Post|Put|Patch|Delete|RequestMapping)\b/gi) ||
145
+ testCode(code, /router\.(?:get|post|put|patch|delete)\s*\(/gi) ||
146
+ testCode(code, /func\s+\w+\s*\(\s*w\s+http\.ResponseWriter/gi);
147
+ const hasValidation = testCode(code, /\b(?:joi|zod|yup|ajv|validate|validator|class-validator|express-validator)\b/gi) ||
148
+ testCode(code, /\b(?:parseInt|parseFloat|Number\(|isNaN|typeof\s+\w+\s*[!=]==?\s*["'](?:string|number|boolean)["'])\b/gi) ||
149
+ testCode(code, /\b(?:Schema|schema|ValidationError|validate|sanitize|escape|trim)\b/gi) ||
150
+ testCode(code, /\.(?:required|min|max|length|email|url|uuid|regex|pattern|matches)\s*\(/gi) ||
151
+ // Pydantic / FastAPI / Django form/serializer validation
152
+ testCode(code, /\b(?:BaseModel|Field\s*\(|EmailStr|HttpUrl|constr|conint|confloat|Serializer|Form\b|ModelForm\b)\b/gi);
153
+ if (hasEndpoints && !hasValidation && lines.length > 10) {
154
+ // Find the endpoint handler lines
155
+ const endpointLines = [];
156
+ for (let i = 0; i < lines.length; i++) {
157
+ if (/app\.(?:get|post|put|patch|delete)\s*\(|router\.(?:get|post|put|patch|delete)\s*\(/i.test(lines[i])) {
158
+ endpointLines.push(i + 1);
159
+ }
160
+ }
161
+ if (endpointLines.length > 0) {
162
+ findings.push({
163
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
164
+ severity: "high",
165
+ title: "API endpoint processes external input without validation",
166
+ description: "Endpoint handlers accept and use external input (request body, query parameters, URL parameters) without any visible input validation or sanitization.",
167
+ lineNumbers: endpointLines,
168
+ recommendation: "Add input validation using a schema library (Joi, Zod, Yup) or built-in validation. Validate types, ranges, formats, and lengths for all input fields.",
169
+ reference: "CWE-20: Improper Input Validation",
170
+ suggestedFix: "Add schema validation: const schema = z.object({ field: z.string().min(1).max(100) }); const data = schema.parse(req.body);",
171
+ confidence: 0.7,
172
+ });
173
+ }
174
+ }
175
+ }
176
+ // ── SEC-006: Missing essential security middleware ──────────────────────
177
+ {
178
+ const hasExpress = testCode(code, /express\(\)|require\s*\(\s*['"]express['"]\s*\)|from\s+['"]express['"]/gi);
179
+ const hasHelmet = testCode(code, /helmet\b/gi);
180
+ const hasCors = testCode(code, /\bcors\b/gi);
181
+ const hasCsrf = testCode(code, /csrf|csurf/gi);
182
+ const hasRateLimit = testCode(code, /rate.?limit/gi);
183
+ if (hasExpress && !hasHelmet && lines.length > 10) {
184
+ const expressLines = [];
185
+ for (let i = 0; i < lines.length; i++) {
186
+ if (/express\(\)|require\s*\(\s*['"]express['"]\)/i.test(lines[i])) {
187
+ expressLines.push(i + 1);
188
+ }
189
+ }
190
+ findings.push({
191
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
192
+ severity: "high",
193
+ title: "Web framework missing essential security hardening",
194
+ description: "Express/Node.js application does not use security middleware (Helmet) to set protective HTTP headers (CSP, HSTS, X-Frame-Options, etc.)." +
195
+ (!hasCors ? " CORS configuration is also missing." : "") +
196
+ (!hasCsrf ? " CSRF protection is not configured." : "") +
197
+ (!hasRateLimit ? " Rate limiting is not configured." : ""),
198
+ lineNumbers: expressLines.length > 0 ? expressLines : undefined,
199
+ recommendation: "Add helmet() middleware for security headers, CORS configuration, CSRF protection, and rate limiting.",
200
+ reference: "OWASP Secure Headers Project",
201
+ suggestedFix: "Add: app.use(helmet()); app.use(cors({ origin: ALLOWED_ORIGINS })); app.use(csrf()); app.use(rateLimit({ windowMs: 15*60*1000, max: 100 }));",
202
+ confidence: 0.75,
203
+ });
204
+ }
205
+ }
206
+ // ── SEC-007: Server-side request to user-controlled URL ────────────────
207
+ {
208
+ const ssrfLines = [];
209
+ for (let i = 0; i < lines.length; i++) {
210
+ const line = lines[i];
211
+ // Direct: fetch(req.query.url) / axios.get(req.body.url)
212
+ if (/\b(?:fetch|axios|http\.get|https\.get|requests\.get|urllib|HttpClient|WebClient|reqwest|httpx|aiohttp)\s*\(/i.test(line) &&
213
+ /(?:req\.|request\.|params\.|query\.|body\.|args\.|input)/i.test(line)) {
214
+ ssrfLines.push(i + 1);
215
+ }
216
+ // Indirect: variable assigned from req, then used in fetch
217
+ if (/\b(?:fetch|axios|http\.get|https\.get|requests\.get|requests\.request)\s*\(\s*(\w+)/i.test(line)) {
218
+ const match = line.match(/\b(?:fetch|axios|http\.get|requests\.get)\s*\(\s*(\w+)/i);
219
+ if (match) {
220
+ const varName = match[1];
221
+ if (varName && !/^['"`]/.test(varName) && varName !== "undefined" && varName !== "null") {
222
+ const ctx = lines.slice(Math.max(0, i - 10), i).join("\n");
223
+ const assignRe = new RegExp(`(?:const|let|var|\\w+)\\s*${varName}\\s*[:=]\\s*.*(?:req\\.|request\\.|params\\.|query\\.|body\\.|args\\.|input|url)`, "i");
224
+ if (assignRe.test(ctx)) {
225
+ ssrfLines.push(i + 1);
226
+ }
227
+ }
228
+ }
229
+ }
230
+ }
231
+ const uniqueSsrf = [...new Set(ssrfLines)].sort((a, b) => a - b);
232
+ if (uniqueSsrf.length > 0) {
233
+ findings.push({
234
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
235
+ severity: "high",
236
+ title: "Server-side HTTP request to user-controlled destination",
237
+ description: "A URL derived from user input is passed to a server-side HTTP client, allowing attackers to probe internal services, cloud metadata endpoints (169.254.169.254), or exfiltrate data.",
238
+ lineNumbers: uniqueSsrf,
239
+ recommendation: "Validate URLs against an allowlist of permitted domains. Block internal/private IP ranges. Use a URL parser to verify the scheme and host before making requests.",
240
+ reference: "CWE-918",
241
+ suggestedFix: "Validate: const url = new URL(input); if (!ALLOWED_HOSTS.includes(url.hostname)) throw new Error('blocked');",
242
+ confidence: 0.85,
243
+ });
244
+ }
245
+ }
246
+ // ── SEC-008: Unsafe recursive object merge allowing property injection ──
247
+ {
248
+ const mergeLines = [];
249
+ for (let i = 0; i < lines.length; i++) {
250
+ const line = lines[i];
251
+ // Object.assign, spread, _.merge, _.extend, deep merge with user input
252
+ if (/(?:Object\.assign|deepMerge|deepExtend|_\.merge|_\.extend|_\.defaultsDeep|lodash\.merge|merge\(|extend\()\s*\(/i.test(line) &&
253
+ /(?:req\.|request\.|body\.|params\.|query\.|input|user)/i.test(line)) {
254
+ mergeLines.push(i + 1);
255
+ }
256
+ // Recursive property assignment from user input
257
+ if (/\[.*(?:req\.|request\.|body\.|input|key|prop)\s*\]/i.test(line) && /\s*=\s*/.test(line)) {
258
+ const ctx = lines.slice(Math.max(0, i - 5), Math.min(lines.length, i + 3)).join("\n");
259
+ if (/\b(?:for|while|forEach|Object\.keys|Object\.entries)\b/i.test(ctx)) {
260
+ mergeLines.push(i + 1);
261
+ }
262
+ }
263
+ }
264
+ if (mergeLines.length > 0) {
265
+ findings.push({
266
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
267
+ severity: "high",
268
+ title: "Unsafe recursive object merge allowing property injection",
269
+ description: "User-controlled input is merged into objects via recursive merge/extend operations, allowing attackers to inject __proto__, constructor, or prototype properties to modify object behavior globally.",
270
+ lineNumbers: mergeLines,
271
+ recommendation: "Use a merge function that blocks prototype keys. Validate/whitelist allowed properties before merging. Freeze prototypes where possible.",
272
+ reference: "CWE-1321",
273
+ suggestedFix: "Filter dangerous keys: const safeData = Object.fromEntries(Object.entries(input).filter(([k]) => !['__proto__', 'constructor', 'prototype'].includes(k)));",
274
+ confidence: 0.85,
275
+ });
276
+ }
277
+ }
278
+ // ── SEC-009: Token verification without algorithm restriction ───────────
279
+ {
280
+ const jwtLines = [];
281
+ for (let i = 0; i < lines.length; i++) {
282
+ const line = lines[i];
283
+ if (/jwt\.verify|jwt\.decode|jose\.jwtVerify|jsonwebtoken/i.test(line)) {
284
+ const ctx = lines.slice(Math.max(0, i - 2), Math.min(lines.length, i + 5)).join("\n");
285
+ // Check if algorithms is specified in options
286
+ if (!/algorithms\s*[=:]/.test(ctx) && !/algorithm\s*[=:]/.test(ctx)) {
287
+ jwtLines.push(i + 1);
288
+ }
289
+ // Check for 'none' algorithm explicitly allowed
290
+ if (/['"]none['"]/i.test(ctx)) {
291
+ jwtLines.push(i + 1);
292
+ }
293
+ }
294
+ // Java/C# JWT verification without algorithm check
295
+ if (/JwtParser|JWTVerifier|TokenValidationParameters|JwtSecurityTokenHandler/i.test(line)) {
296
+ const ctx = lines.slice(i, Math.min(lines.length, i + 8)).join("\n");
297
+ if (!/(?:algorithms|signatureAlgorithm|ValidAlgorithms)\s*[=:]/i.test(ctx)) {
298
+ jwtLines.push(i + 1);
299
+ }
300
+ }
301
+ }
302
+ const uniqueJwt = [...new Set(jwtLines)].sort((a, b) => a - b);
303
+ if (uniqueJwt.length > 0) {
304
+ findings.push({
305
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
306
+ severity: "critical",
307
+ title: "Token verification without algorithm restriction",
308
+ description: "JWT/token verification does not restrict the allowed signing algorithms. This can allow 'none' algorithm attacks where an attacker submits unsigned tokens that are accepted as valid.",
309
+ lineNumbers: uniqueJwt,
310
+ recommendation: "Always specify allowed algorithms explicitly: jwt.verify(token, secret, { algorithms: ['HS256'] }). Never allow the 'none' algorithm.",
311
+ reference: "CWE-345 / CWE-347",
312
+ suggestedFix: "Add algorithm restriction: jwt.verify(token, secret, { algorithms: ['HS256'] });",
313
+ confidence: 0.9,
314
+ });
315
+ }
316
+ }
317
+ // ── SEC-010: Direct user input in data modification without field filtering ──
318
+ {
319
+ const massAssignLines = [];
320
+ for (let i = 0; i < lines.length; i++) {
321
+ const line = lines[i];
322
+ // req.body spread into DB operations
323
+ if (/(?:\.create|\.update\w*|\.insert|\.findOneAndUpdate|\.updateOne|\.save|\.set|Model\.\w+|db\.\w+)\s*\(/i.test(line) &&
324
+ /(?:req\.body|request\.body|\.\.\.req\.body|\.\.\.request\.body|\breq\.body\b)/i.test(line)) {
325
+ massAssignLines.push(i + 1);
326
+ }
327
+ // Spread in object literal for DB
328
+ if (/\{\s*\.\.\.req\.body|\{\s*\.\.\.request\.body/i.test(line)) {
329
+ const ctx = lines.slice(i, Math.min(lines.length, i + 5)).join("\n");
330
+ if (/(?:\.create|\.update|\.save|query|Model)/i.test(ctx)) {
331
+ massAssignLines.push(i + 1);
332
+ }
333
+ }
334
+ }
335
+ const uniqueMass = [...new Set(massAssignLines)].sort((a, b) => a - b);
336
+ if (uniqueMass.length > 0) {
337
+ findings.push({
338
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
339
+ severity: "high",
340
+ title: "Direct user input in data modification without field filtering",
341
+ description: "Request body is passed directly to database create/update operations without field whitelisting. Attackers can inject unexpected fields (isAdmin, role, price) to escalate privileges.",
342
+ lineNumbers: uniqueMass,
343
+ recommendation: "Explicitly pick allowed fields: const { name, email } = req.body; Model.update({ name, email }). Use DTOs or validation schemas.",
344
+ reference: "CWE-915",
345
+ suggestedFix: "Whitelist fields: const { name, email } = req.body; await Model.update({ name, email });",
346
+ confidence: 0.85,
347
+ });
348
+ }
349
+ }
350
+ // ── SEC-011: Unvalidated redirect destination ──────────────────────────
351
+ {
352
+ const redirectLines = [];
353
+ for (let i = 0; i < lines.length; i++) {
354
+ const line = lines[i];
355
+ if (/(?:res\.redirect|response\.redirect|Response\.Redirect|redirect\(|sendRedirect|header\s*\(\s*['"]Location)/i.test(line) &&
356
+ /(?:req\.|request\.|params\.|query\.|body\.|args\.|input|url)/i.test(line)) {
357
+ redirectLines.push(i + 1);
358
+ }
359
+ // Indirect: redirect with a variable from user input
360
+ if (/(?:res\.redirect|response\.redirect|redirect)\s*\(\s*(\w+)/i.test(line)) {
361
+ const match = line.match(/(?:res\.redirect|response\.redirect|redirect)\s*\(\s*(\w+)/i);
362
+ if (match) {
363
+ const varName = match[1];
364
+ if (varName &&
365
+ !/^['"`]/.test(varName) &&
366
+ varName !== "undefined" &&
367
+ varName !== "null" &&
368
+ varName.length > 1) {
369
+ const ctx = lines.slice(Math.max(0, i - 8), i).join("\n");
370
+ const assignRe = new RegExp(`(?:const|let|var)?\\s*${varName}\\s*[:=]\\s*.*(?:req\\.|request\\.|query\\.|params\\.|body\\.)`, "i");
371
+ if (assignRe.test(ctx)) {
372
+ redirectLines.push(i + 1);
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+ const uniqueRedirect = [...new Set(redirectLines)].sort((a, b) => a - b);
379
+ if (uniqueRedirect.length > 0) {
380
+ findings.push({
381
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
382
+ severity: "high",
383
+ title: "Unvalidated redirect to user-controlled destination",
384
+ description: "HTTP redirect uses a URL derived from user input without validation. Attackers can redirect users to phishing sites or malicious pages.",
385
+ lineNumbers: uniqueRedirect,
386
+ recommendation: "Validate redirect URLs against an allowlist of permitted destinations. Only allow relative paths or known domains.",
387
+ reference: "CWE-601",
388
+ suggestedFix: "Validate: const url = new URL(target, req.headers.origin); if (!ALLOWED_HOSTS.includes(url.hostname)) throw new Error('blocked');",
389
+ confidence: 0.85,
390
+ });
391
+ }
392
+ }
393
+ // ── SEC-012: Non-constant-time secret comparison ───────────────────────
394
+ {
395
+ const timingLines = [];
396
+ for (let i = 0; i < lines.length; i++) {
397
+ const line = lines[i];
398
+ if (/(?:===?|!==?)\s*(?:signature|secret|token|hmac|hash|digest|apiKey|api_key|expected|computed)/i.test(line) ||
399
+ /(?:signature|secret|token|hmac|hash|digest|apiKey|api_key|expected|computed)\s*(?:===?|!==?)/i.test(line)) {
400
+ const ctx = lines.slice(Math.max(0, i - 5), Math.min(lines.length, i + 6)).join("\n");
401
+ if (!/timingSafeEqual|constantTimeCompare|hmac\.Equal|secure_compare|constant_time_compare|compare_digest|MessageDigest\.isEqual/i.test(ctx)) {
402
+ timingLines.push(i + 1);
403
+ }
404
+ }
405
+ }
406
+ if (timingLines.length > 0) {
407
+ findings.push({
408
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
409
+ severity: "high",
410
+ title: "Non-constant-time comparison of cryptographic material",
411
+ description: "Secrets, tokens, or signatures are compared using standard equality operators which leak timing information. Attackers can determine correct values byte-by-byte by measuring response time differences.",
412
+ lineNumbers: timingLines,
413
+ recommendation: "Use constant-time comparison functions: crypto.timingSafeEqual() (Node.js), hmac.Equal() (Go), hmac.compare_digest() (Python).",
414
+ reference: "CWE-208",
415
+ suggestedFix: "Replace === with: crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));",
416
+ confidence: 0.85,
417
+ });
418
+ }
419
+ }
420
+ // ── SEC-013: XML processing without entity restriction ─────────────────
421
+ {
422
+ const xxeLines = [];
423
+ for (let i = 0; i < lines.length; i++) {
424
+ const line = lines[i];
425
+ // Java: DocumentBuilderFactory, SAXParserFactory, XMLInputFactory without setFeature
426
+ if (/(?:DocumentBuilderFactory|SAXParserFactory|XMLInputFactory|XMLReader|TransformerFactory)\.new/i.test(line)) {
427
+ const ctx = lines.slice(i, Math.min(lines.length, i + 10)).join("\n");
428
+ if (!/setFeature\s*\(.*(?:FEATURE_SECURE_PROCESSING|XMLConstants\.FEATURE_SECURE_PROCESSING|disallow-doctype-decl|external-general-entities)/i.test(ctx) &&
429
+ !/setProperty.*ACCESS_EXTERNAL/i.test(ctx)) {
430
+ xxeLines.push(i + 1);
431
+ }
432
+ }
433
+ // Python: xml.etree, lxml without defused
434
+ if (/(?:ElementTree\.parse|etree\.parse|minidom\.parse|xml\.sax\.parse|lxml\.etree)\s*\(/i.test(line)) {
435
+ const fullCode = lines.join("\n");
436
+ if (!/defusedxml|defused/i.test(fullCode)) {
437
+ xxeLines.push(i + 1);
438
+ }
439
+ }
440
+ // C#: XmlReader, XmlDocument without DtdProcessing.Prohibit
441
+ if (/(?:XmlReader\.Create|XmlDocument\(\)|XDocument\.Load)\b/i.test(line)) {
442
+ const ctx = lines.slice(i, Math.min(lines.length, i + 8)).join("\n");
443
+ if (!/DtdProcessing\.Prohibit|DtdProcessing\s*=\s*DtdProcessing\.Prohibit|ProhibitDtd/i.test(ctx)) {
444
+ xxeLines.push(i + 1);
445
+ }
446
+ }
447
+ }
448
+ if (xxeLines.length > 0) {
449
+ findings.push({
450
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
451
+ severity: "critical",
452
+ title: "XML processing without external entity restriction",
453
+ description: "XML parsers are used without disabling external entity resolution, enabling XXE attacks that can read local files, perform SSRF, or cause denial of service.",
454
+ lineNumbers: xxeLines,
455
+ recommendation: "Disable external entity processing: set FEATURE_SECURE_PROCESSING, disallow-doctype-decl, or use defusedxml (Python). In C#, set DtdProcessing.Prohibit.",
456
+ reference: "CWE-611",
457
+ suggestedFix: "Java: factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Python: import defusedxml.ElementTree as ET",
458
+ confidence: 0.9,
459
+ });
460
+ }
461
+ }
462
+ // ── SEC-014: Unsafe memory operations without safety documentation ─────
463
+ if (lang === "rust") {
464
+ const unsafeLines = [];
465
+ for (let i = 0; i < lines.length; i++) {
466
+ if (/\bunsafe\s*\{/.test(lines[i])) {
467
+ unsafeLines.push(i + 1);
468
+ }
469
+ }
470
+ if (unsafeLines.length > 0) {
471
+ const fullCode = lines.join("\n");
472
+ if (!/\/\/\s*SAFETY\s*:|\/\/\s*UNSAFE\s*:/i.test(fullCode)) {
473
+ findings.push({
474
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
475
+ severity: "high",
476
+ title: "Unsafe memory operations without safety invariant documentation",
477
+ description: "Unsafe code blocks bypass memory safety guarantees without documenting the safety invariants that must hold. This risks buffer overflows, use-after-free, and data races.",
478
+ lineNumbers: unsafeLines,
479
+ recommendation: "Document safety invariants with // SAFETY: comments. Minimize unsafe scope. Prefer safe abstractions where possible.",
480
+ reference: "CWE-119 / CWE-787",
481
+ suggestedFix: "Add: // SAFETY: <explain why this is safe> above each unsafe block.",
482
+ confidence: 0.85,
483
+ });
484
+ }
485
+ }
486
+ }
487
+ // ── SEC-015: Deserialization of untrusted data ─────────────────────────
488
+ {
489
+ const deserLines = [];
490
+ for (let i = 0; i < lines.length; i++) {
491
+ const line = lines[i];
492
+ // Python pickle/yaml/marshal
493
+ if (/\b(?:pickle\.loads?|yaml\.(?:load|unsafe_load)|marshal\.loads?)\s*\(/i.test(line)) {
494
+ deserLines.push(i + 1);
495
+ }
496
+ // Java ObjectInputStream
497
+ if (/\b(?:ObjectInputStream|XMLDecoder|readObject|readUnshared)\b/i.test(line)) {
498
+ deserLines.push(i + 1);
499
+ }
500
+ // PHP unserialize
501
+ if (/\bunserialize\s*\(/i.test(line)) {
502
+ deserLines.push(i + 1);
503
+ }
504
+ // Ruby Marshal.load
505
+ if (/\bMarshal\.load\b/i.test(line)) {
506
+ deserLines.push(i + 1);
507
+ }
508
+ // .NET BinaryFormatter
509
+ if (/\bBinaryFormatter\.Deserialize\b/i.test(line)) {
510
+ deserLines.push(i + 1);
511
+ }
512
+ }
513
+ if (deserLines.length > 0) {
514
+ findings.push({
515
+ ruleId: `${prefix}-${String(ruleNum).padStart(3, "0")}`,
516
+ severity: "critical",
517
+ title: "Deserialization of data from untrusted sources",
518
+ description: "Unsafe deserialization functions (pickle, ObjectInputStream, Marshal, BinaryFormatter) process data that may originate from untrusted sources, enabling remote code execution.",
519
+ lineNumbers: deserLines,
520
+ recommendation: "Never deserialize untrusted data. Use JSON for data exchange with schema validation. Avoid pickle, ObjectInputStream, Marshal for user-facing inputs.",
521
+ reference: "CWE-502",
522
+ suggestedFix: "Replace with safe alternatives: JSON with schema validation, data transfer objects, or type-safe serialization formats.",
523
+ confidence: 0.9,
524
+ });
525
+ }
526
+ }
527
+ return findings;
528
+ }
529
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/evaluators/security.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/evaluators/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/evaluators/shared.ts"],"names":[],"mappings":"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"}
@@ -127,8 +127,13 @@ export function classifyFile(code, language, filePath) {
127
127
  if (scoringPatterns >= 2 && regexLiteralCount >= 3) {
128
128
  return "analysis-tool";
129
129
  }
130
- // Health-check endpoints detected by content (lightweight route returning 200/ok)
131
- if (/(?:\/health|\/ready|\/live|\/ping|\/status)\b/i.test(code) &&
130
+ // Health-check endpoints detected by content (lightweight route returning 200/ok).
131
+ // Only classify as utility when the file is a dedicated health-check module —
132
+ // if it defines multiple routes it is a real server that happens to include
133
+ // a health endpoint.
134
+ const routeHandlerCount = (code.match(/\bapp\.(?:get|post|put|delete|patch|use)\s*\(|router\.(?:get|post|put|delete|patch|use)\s*\(|@app\.route\s*\(|@(?:Get|Post|Put|Delete)Mapping\s*\(/gi) || []).length;
135
+ if (routeHandlerCount <= 1 &&
136
+ /(?:\/health|\/ready|\/live|\/ping|\/status)\b/i.test(code) &&
132
137
  lineCount < 50 &&
133
138
  // Bound [^\n] to {0,200} to prevent polynomial backtracking when a line
134
139
  // contains many 'return' sub-strings (CodeQL js/polynomial-redos).
@@ -465,7 +470,14 @@ export function isLikelyCLI(code) {
465
470
  // Shebang or process.argv / commander / yargs / meow patterns
466
471
  return (/^#!\/usr\/bin\/env\s/m.test(code) ||
467
472
  /\bprocess\.argv\b/.test(code) ||
468
- /\b(?:commander|yargs|meow|cac|citty|clipanion)\b/i.test(code));
473
+ /\b(?:commander|yargs|meow|cac|citty|clipanion)\b/i.test(code) ||
474
+ // Go CLI: flag package, cobra, urfave/cli
475
+ /\bflag\.(?:String|Int|Bool|Float|Parse|Args)\b/.test(code) ||
476
+ /\b(?:cobra|urfave\/cli)\b/i.test(code) ||
477
+ // Python CLI: argparse, click, typer
478
+ /\b(?:argparse|@click\.|typer\.)\b/.test(code) ||
479
+ // Rust CLI: clap
480
+ /\bclap::/.test(code));
469
481
  }
470
482
  // ─── Comment & String Stripping ──────────────────────────────────────────────
471
483
  // Provides `stripCommentsAndStrings()` which replaces all comments and string