@oculum/scanner 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 (281) hide show
  1. package/dist/formatters/cli-terminal.d.ts +27 -0
  2. package/dist/formatters/cli-terminal.d.ts.map +1 -0
  3. package/dist/formatters/cli-terminal.js +412 -0
  4. package/dist/formatters/cli-terminal.js.map +1 -0
  5. package/dist/formatters/github-comment.d.ts +41 -0
  6. package/dist/formatters/github-comment.d.ts.map +1 -0
  7. package/dist/formatters/github-comment.js +306 -0
  8. package/dist/formatters/github-comment.js.map +1 -0
  9. package/dist/formatters/grouping.d.ts +52 -0
  10. package/dist/formatters/grouping.d.ts.map +1 -0
  11. package/dist/formatters/grouping.js +152 -0
  12. package/dist/formatters/grouping.js.map +1 -0
  13. package/dist/formatters/index.d.ts +9 -0
  14. package/dist/formatters/index.d.ts.map +1 -0
  15. package/dist/formatters/index.js +35 -0
  16. package/dist/formatters/index.js.map +1 -0
  17. package/dist/formatters/vscode-diagnostic.d.ts +103 -0
  18. package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
  19. package/dist/formatters/vscode-diagnostic.js +151 -0
  20. package/dist/formatters/vscode-diagnostic.js.map +1 -0
  21. package/dist/index.d.ts +52 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +648 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layer1/comments.d.ts +8 -0
  26. package/dist/layer1/comments.d.ts.map +1 -0
  27. package/dist/layer1/comments.js +203 -0
  28. package/dist/layer1/comments.js.map +1 -0
  29. package/dist/layer1/config-audit.d.ts +8 -0
  30. package/dist/layer1/config-audit.d.ts.map +1 -0
  31. package/dist/layer1/config-audit.js +252 -0
  32. package/dist/layer1/config-audit.js.map +1 -0
  33. package/dist/layer1/entropy.d.ts +8 -0
  34. package/dist/layer1/entropy.d.ts.map +1 -0
  35. package/dist/layer1/entropy.js +500 -0
  36. package/dist/layer1/entropy.js.map +1 -0
  37. package/dist/layer1/file-flags.d.ts +7 -0
  38. package/dist/layer1/file-flags.d.ts.map +1 -0
  39. package/dist/layer1/file-flags.js +112 -0
  40. package/dist/layer1/file-flags.js.map +1 -0
  41. package/dist/layer1/index.d.ts +36 -0
  42. package/dist/layer1/index.d.ts.map +1 -0
  43. package/dist/layer1/index.js +132 -0
  44. package/dist/layer1/index.js.map +1 -0
  45. package/dist/layer1/patterns.d.ts +8 -0
  46. package/dist/layer1/patterns.d.ts.map +1 -0
  47. package/dist/layer1/patterns.js +482 -0
  48. package/dist/layer1/patterns.js.map +1 -0
  49. package/dist/layer1/urls.d.ts +8 -0
  50. package/dist/layer1/urls.d.ts.map +1 -0
  51. package/dist/layer1/urls.js +296 -0
  52. package/dist/layer1/urls.js.map +1 -0
  53. package/dist/layer1/weak-crypto.d.ts +7 -0
  54. package/dist/layer1/weak-crypto.d.ts.map +1 -0
  55. package/dist/layer1/weak-crypto.js +291 -0
  56. package/dist/layer1/weak-crypto.js.map +1 -0
  57. package/dist/layer2/ai-agent-tools.d.ts +19 -0
  58. package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
  59. package/dist/layer2/ai-agent-tools.js +528 -0
  60. package/dist/layer2/ai-agent-tools.js.map +1 -0
  61. package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
  62. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
  63. package/dist/layer2/ai-endpoint-protection.js +332 -0
  64. package/dist/layer2/ai-endpoint-protection.js.map +1 -0
  65. package/dist/layer2/ai-execution-sinks.d.ts +18 -0
  66. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
  67. package/dist/layer2/ai-execution-sinks.js +496 -0
  68. package/dist/layer2/ai-execution-sinks.js.map +1 -0
  69. package/dist/layer2/ai-fingerprinting.d.ts +7 -0
  70. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
  71. package/dist/layer2/ai-fingerprinting.js +654 -0
  72. package/dist/layer2/ai-fingerprinting.js.map +1 -0
  73. package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
  74. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
  75. package/dist/layer2/ai-prompt-hygiene.js +356 -0
  76. package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
  77. package/dist/layer2/ai-rag-safety.d.ts +21 -0
  78. package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
  79. package/dist/layer2/ai-rag-safety.js +459 -0
  80. package/dist/layer2/ai-rag-safety.js.map +1 -0
  81. package/dist/layer2/ai-schema-validation.d.ts +25 -0
  82. package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
  83. package/dist/layer2/ai-schema-validation.js +375 -0
  84. package/dist/layer2/ai-schema-validation.js.map +1 -0
  85. package/dist/layer2/auth-antipatterns.d.ts +20 -0
  86. package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
  87. package/dist/layer2/auth-antipatterns.js +333 -0
  88. package/dist/layer2/auth-antipatterns.js.map +1 -0
  89. package/dist/layer2/byok-patterns.d.ts +12 -0
  90. package/dist/layer2/byok-patterns.d.ts.map +1 -0
  91. package/dist/layer2/byok-patterns.js +299 -0
  92. package/dist/layer2/byok-patterns.js.map +1 -0
  93. package/dist/layer2/dangerous-functions.d.ts +7 -0
  94. package/dist/layer2/dangerous-functions.d.ts.map +1 -0
  95. package/dist/layer2/dangerous-functions.js +1375 -0
  96. package/dist/layer2/dangerous-functions.js.map +1 -0
  97. package/dist/layer2/data-exposure.d.ts +16 -0
  98. package/dist/layer2/data-exposure.d.ts.map +1 -0
  99. package/dist/layer2/data-exposure.js +279 -0
  100. package/dist/layer2/data-exposure.js.map +1 -0
  101. package/dist/layer2/framework-checks.d.ts +7 -0
  102. package/dist/layer2/framework-checks.d.ts.map +1 -0
  103. package/dist/layer2/framework-checks.js +388 -0
  104. package/dist/layer2/framework-checks.js.map +1 -0
  105. package/dist/layer2/index.d.ts +58 -0
  106. package/dist/layer2/index.d.ts.map +1 -0
  107. package/dist/layer2/index.js +380 -0
  108. package/dist/layer2/index.js.map +1 -0
  109. package/dist/layer2/logic-gates.d.ts +7 -0
  110. package/dist/layer2/logic-gates.d.ts.map +1 -0
  111. package/dist/layer2/logic-gates.js +182 -0
  112. package/dist/layer2/logic-gates.js.map +1 -0
  113. package/dist/layer2/risky-imports.d.ts +7 -0
  114. package/dist/layer2/risky-imports.d.ts.map +1 -0
  115. package/dist/layer2/risky-imports.js +161 -0
  116. package/dist/layer2/risky-imports.js.map +1 -0
  117. package/dist/layer2/variables.d.ts +8 -0
  118. package/dist/layer2/variables.d.ts.map +1 -0
  119. package/dist/layer2/variables.js +152 -0
  120. package/dist/layer2/variables.js.map +1 -0
  121. package/dist/layer3/anthropic.d.ts +83 -0
  122. package/dist/layer3/anthropic.d.ts.map +1 -0
  123. package/dist/layer3/anthropic.js +1745 -0
  124. package/dist/layer3/anthropic.js.map +1 -0
  125. package/dist/layer3/index.d.ts +24 -0
  126. package/dist/layer3/index.d.ts.map +1 -0
  127. package/dist/layer3/index.js +119 -0
  128. package/dist/layer3/index.js.map +1 -0
  129. package/dist/layer3/openai.d.ts +25 -0
  130. package/dist/layer3/openai.d.ts.map +1 -0
  131. package/dist/layer3/openai.js +238 -0
  132. package/dist/layer3/openai.js.map +1 -0
  133. package/dist/layer3/package-check.d.ts +63 -0
  134. package/dist/layer3/package-check.d.ts.map +1 -0
  135. package/dist/layer3/package-check.js +508 -0
  136. package/dist/layer3/package-check.js.map +1 -0
  137. package/dist/modes/incremental.d.ts +66 -0
  138. package/dist/modes/incremental.d.ts.map +1 -0
  139. package/dist/modes/incremental.js +200 -0
  140. package/dist/modes/incremental.js.map +1 -0
  141. package/dist/tiers.d.ts +125 -0
  142. package/dist/tiers.d.ts.map +1 -0
  143. package/dist/tiers.js +234 -0
  144. package/dist/tiers.js.map +1 -0
  145. package/dist/types.d.ts +175 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +50 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils/auth-helper-detector.d.ts +56 -0
  150. package/dist/utils/auth-helper-detector.d.ts.map +1 -0
  151. package/dist/utils/auth-helper-detector.js +360 -0
  152. package/dist/utils/auth-helper-detector.js.map +1 -0
  153. package/dist/utils/context-helpers.d.ts +96 -0
  154. package/dist/utils/context-helpers.d.ts.map +1 -0
  155. package/dist/utils/context-helpers.js +493 -0
  156. package/dist/utils/context-helpers.js.map +1 -0
  157. package/dist/utils/diff-detector.d.ts +53 -0
  158. package/dist/utils/diff-detector.d.ts.map +1 -0
  159. package/dist/utils/diff-detector.js +104 -0
  160. package/dist/utils/diff-detector.js.map +1 -0
  161. package/dist/utils/diff-parser.d.ts +80 -0
  162. package/dist/utils/diff-parser.d.ts.map +1 -0
  163. package/dist/utils/diff-parser.js +202 -0
  164. package/dist/utils/diff-parser.js.map +1 -0
  165. package/dist/utils/imported-auth-detector.d.ts +37 -0
  166. package/dist/utils/imported-auth-detector.d.ts.map +1 -0
  167. package/dist/utils/imported-auth-detector.js +251 -0
  168. package/dist/utils/imported-auth-detector.js.map +1 -0
  169. package/dist/utils/middleware-detector.d.ts +55 -0
  170. package/dist/utils/middleware-detector.d.ts.map +1 -0
  171. package/dist/utils/middleware-detector.js +260 -0
  172. package/dist/utils/middleware-detector.js.map +1 -0
  173. package/dist/utils/oauth-flow-detector.d.ts +41 -0
  174. package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
  175. package/dist/utils/oauth-flow-detector.js +202 -0
  176. package/dist/utils/oauth-flow-detector.js.map +1 -0
  177. package/dist/utils/path-exclusions.d.ts +55 -0
  178. package/dist/utils/path-exclusions.d.ts.map +1 -0
  179. package/dist/utils/path-exclusions.js +222 -0
  180. package/dist/utils/path-exclusions.js.map +1 -0
  181. package/dist/utils/project-context-builder.d.ts +119 -0
  182. package/dist/utils/project-context-builder.d.ts.map +1 -0
  183. package/dist/utils/project-context-builder.js +534 -0
  184. package/dist/utils/project-context-builder.js.map +1 -0
  185. package/dist/utils/registry-clients.d.ts +93 -0
  186. package/dist/utils/registry-clients.d.ts.map +1 -0
  187. package/dist/utils/registry-clients.js +273 -0
  188. package/dist/utils/registry-clients.js.map +1 -0
  189. package/dist/utils/trpc-analyzer.d.ts +78 -0
  190. package/dist/utils/trpc-analyzer.d.ts.map +1 -0
  191. package/dist/utils/trpc-analyzer.js +297 -0
  192. package/dist/utils/trpc-analyzer.js.map +1 -0
  193. package/package.json +45 -0
  194. package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
  195. package/src/__tests__/benchmark/fixtures/index.ts +68 -0
  196. package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
  197. package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
  198. package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
  199. package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
  200. package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
  201. package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
  202. package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
  203. package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
  204. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
  205. package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
  206. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
  207. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
  208. package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
  209. package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
  210. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
  211. package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
  212. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
  213. package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
  214. package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
  215. package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
  216. package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
  217. package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
  218. package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
  219. package/src/__tests__/benchmark/index.ts +29 -0
  220. package/src/__tests__/benchmark/run-benchmark.ts +144 -0
  221. package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
  222. package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
  223. package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
  224. package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
  225. package/src/__tests__/benchmark/types.ts +144 -0
  226. package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
  227. package/src/__tests__/regression/known-false-positives.test.ts +467 -0
  228. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
  229. package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
  230. package/src/__tests__/validation/analyze-results.ts +542 -0
  231. package/src/__tests__/validation/extract-for-triage.ts +146 -0
  232. package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
  233. package/src/__tests__/validation/run-validation.ts +364 -0
  234. package/src/__tests__/validation/triage-template.md +132 -0
  235. package/src/formatters/cli-terminal.ts +446 -0
  236. package/src/formatters/github-comment.ts +382 -0
  237. package/src/formatters/grouping.ts +190 -0
  238. package/src/formatters/index.ts +47 -0
  239. package/src/formatters/vscode-diagnostic.ts +243 -0
  240. package/src/index.ts +823 -0
  241. package/src/layer1/comments.ts +218 -0
  242. package/src/layer1/config-audit.ts +289 -0
  243. package/src/layer1/entropy.ts +583 -0
  244. package/src/layer1/file-flags.ts +127 -0
  245. package/src/layer1/index.ts +181 -0
  246. package/src/layer1/patterns.ts +516 -0
  247. package/src/layer1/urls.ts +334 -0
  248. package/src/layer1/weak-crypto.ts +328 -0
  249. package/src/layer2/ai-agent-tools.ts +601 -0
  250. package/src/layer2/ai-endpoint-protection.ts +387 -0
  251. package/src/layer2/ai-execution-sinks.ts +580 -0
  252. package/src/layer2/ai-fingerprinting.ts +758 -0
  253. package/src/layer2/ai-prompt-hygiene.ts +411 -0
  254. package/src/layer2/ai-rag-safety.ts +511 -0
  255. package/src/layer2/ai-schema-validation.ts +421 -0
  256. package/src/layer2/auth-antipatterns.ts +394 -0
  257. package/src/layer2/byok-patterns.ts +336 -0
  258. package/src/layer2/dangerous-functions.ts +1563 -0
  259. package/src/layer2/data-exposure.ts +315 -0
  260. package/src/layer2/framework-checks.ts +433 -0
  261. package/src/layer2/index.ts +473 -0
  262. package/src/layer2/logic-gates.ts +206 -0
  263. package/src/layer2/risky-imports.ts +186 -0
  264. package/src/layer2/variables.ts +166 -0
  265. package/src/layer3/anthropic.ts +2030 -0
  266. package/src/layer3/index.ts +130 -0
  267. package/src/layer3/package-check.ts +604 -0
  268. package/src/modes/incremental.ts +293 -0
  269. package/src/tiers.ts +318 -0
  270. package/src/types.ts +284 -0
  271. package/src/utils/auth-helper-detector.ts +443 -0
  272. package/src/utils/context-helpers.ts +535 -0
  273. package/src/utils/diff-detector.ts +135 -0
  274. package/src/utils/diff-parser.ts +272 -0
  275. package/src/utils/imported-auth-detector.ts +320 -0
  276. package/src/utils/middleware-detector.ts +333 -0
  277. package/src/utils/oauth-flow-detector.ts +246 -0
  278. package/src/utils/path-exclusions.ts +266 -0
  279. package/src/utils/project-context-builder.ts +707 -0
  280. package/src/utils/registry-clients.ts +351 -0
  281. package/src/utils/trpc-analyzer.ts +382 -0
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ /**
3
+ * Layer 1: Known Pattern Matching
4
+ * Curated library of high-fidelity regex patterns for detecting secrets
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SECRET_PATTERNS = void 0;
8
+ exports.detectKnownPatterns = detectKnownPatterns;
9
+ const context_helpers_1 = require("../utils/context-helpers");
10
+ // Check if file is documentation/README
11
+ function isDocumentationFile(filePath) {
12
+ const docPatterns = [
13
+ /README/i,
14
+ /CHANGELOG/i,
15
+ /CONTRIBUTING/i,
16
+ /LICENSE/i,
17
+ /CODE_OF_CONDUCT/i,
18
+ /SECURITY/i,
19
+ /AUTHORS/i,
20
+ /HISTORY/i,
21
+ /\.md$/i,
22
+ /\.mdx$/i,
23
+ /\.rst$/i, // reStructuredText
24
+ /\.adoc$/i, // AsciiDoc
25
+ /\.txt$/i, // Plain text docs
26
+ /\/docs\//i,
27
+ /\/documentation\//i,
28
+ /\/wiki\//i,
29
+ /\/guides?\//i,
30
+ /\/tutorials?\//i,
31
+ /\/examples?\//i, // Example directories often have sample configs
32
+ ];
33
+ return docPatterns.some(p => p.test(filePath));
34
+ }
35
+ // Check if line contains example/sample placeholder values (not real secrets)
36
+ function isExamplePlaceholder(line, value) {
37
+ const placeholderPatterns = [
38
+ // Common placeholder indicators in the line context
39
+ /example/i,
40
+ /sample/i,
41
+ /demo/i,
42
+ /placeholder/i,
43
+ /your[_-]?api[_-]?key/i,
44
+ /your[_-]?secret/i,
45
+ /replace[_-]?with/i,
46
+ /insert[_-]?here/i,
47
+ /xxx+/i,
48
+ /yyy+/i,
49
+ /todo/i,
50
+ /fixme/i,
51
+ ];
52
+ // Check if the value itself looks like a placeholder
53
+ const valuePlaceholderPatterns = [
54
+ /^your[_-]/i,
55
+ /^my[_-]/i,
56
+ /^test[_-]/i,
57
+ /^sample[_-]/i,
58
+ /^example[_-]/i,
59
+ /^demo[_-]/i,
60
+ /^placeholder/i,
61
+ /^xxx+$/i,
62
+ /^yyy+$/i,
63
+ /^\*+$/, // Just asterisks
64
+ /^\.{3,}$/, // Just dots
65
+ /^<.*>$/, // Angle bracket placeholders like <YOUR_KEY>
66
+ /^\[.*\]$/, // Square bracket placeholders like [YOUR_KEY]
67
+ /^\{.*\}$/, // Curly bracket placeholders like {YOUR_KEY}
68
+ ];
69
+ return placeholderPatterns.some(p => p.test(line)) ||
70
+ valuePlaceholderPatterns.some(p => p.test(value));
71
+ }
72
+ // Check if the variable name indicates test/mock data
73
+ function hasTestVariableName(line) {
74
+ const varNamePatterns = [
75
+ // JS/TS variable declarations: const TEST_API_KEY = "..."
76
+ /(?:const|let|var|export\s+const|export\s+let)\s+([A-Z_][A-Z0-9_]*)\s*=/i,
77
+ // Object property shorthand or assignment: TEST_KEY: "..." or "testKey": "..."
78
+ /([A-Z_][A-Z0-9_]*)\s*:\s*['"`]/,
79
+ // JSON-style keys: "test_key": or 'testKey':
80
+ /['"]([a-zA-Z_][a-zA-Z0-9_]*)['"]\s*:/,
81
+ ];
82
+ // Keywords that indicate test/mock data when in variable names
83
+ const testKeywords = /^(TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE|PLACEHOLDER|DEMO)[_A-Z0-9]*$/i;
84
+ const testSuffixes = /_?(TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)$/i;
85
+ for (const pattern of varNamePatterns) {
86
+ const match = line.match(pattern);
87
+ if (match && match[1]) {
88
+ const varName = match[1];
89
+ if (testKeywords.test(varName) || testSuffixes.test(varName)) {
90
+ return true;
91
+ }
92
+ }
93
+ }
94
+ return false;
95
+ }
96
+ // Comprehensive list of secret patterns with specific prefixes
97
+ exports.SECRET_PATTERNS = [
98
+ // API Keys with known prefixes
99
+ {
100
+ name: 'OpenAI API Key',
101
+ pattern: /sk-[a-zA-Z0-9]{20,}/g,
102
+ severity: 'critical',
103
+ description: 'OpenAI API key detected',
104
+ },
105
+ {
106
+ name: 'OpenAI Project API Key',
107
+ pattern: /sk-proj-[a-zA-Z0-9]{48,}/g,
108
+ severity: 'critical',
109
+ description: 'OpenAI project API key detected (new format)',
110
+ },
111
+ {
112
+ name: 'Anthropic API Key',
113
+ pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g,
114
+ severity: 'critical',
115
+ description: 'Anthropic API key detected',
116
+ },
117
+ {
118
+ name: 'Anthropic API Key (Full)',
119
+ pattern: /sk-ant-api03-[a-zA-Z0-9_-]{90,}/g,
120
+ severity: 'critical',
121
+ description: 'Anthropic API key detected (full format)',
122
+ },
123
+ {
124
+ name: 'GitHub Token',
125
+ pattern: /ghp_[a-zA-Z0-9]{36,}/g,
126
+ severity: 'critical',
127
+ description: 'GitHub personal access token detected',
128
+ },
129
+ {
130
+ name: 'GitHub OAuth Token',
131
+ pattern: /gho_[a-zA-Z0-9]{36,}/g,
132
+ severity: 'critical',
133
+ description: 'GitHub OAuth token detected',
134
+ },
135
+ {
136
+ name: 'GitHub App Token',
137
+ pattern: /ghu_[a-zA-Z0-9]{36,}/g,
138
+ severity: 'critical',
139
+ description: 'GitHub App user token detected',
140
+ },
141
+ {
142
+ name: 'GitHub Refresh Token',
143
+ pattern: /ghr_[a-zA-Z0-9]{36,}/g,
144
+ severity: 'critical',
145
+ description: 'GitHub refresh token detected',
146
+ },
147
+ {
148
+ name: 'Stripe Secret Key',
149
+ pattern: /sk_live_[a-zA-Z0-9]{24,}/g,
150
+ severity: 'critical',
151
+ description: 'Stripe live secret key detected',
152
+ },
153
+ {
154
+ name: 'Stripe Test Key',
155
+ pattern: /sk_test_[a-zA-Z0-9]{24,}/g,
156
+ severity: 'medium',
157
+ description: 'Stripe test secret key detected',
158
+ },
159
+ {
160
+ name: 'Stripe Publishable Key',
161
+ pattern: /pk_(live|test)_[a-zA-Z0-9]{24,}/g,
162
+ severity: 'low',
163
+ description: 'Stripe publishable key detected (usually safe but verify)',
164
+ },
165
+ {
166
+ name: 'Square Access Token',
167
+ pattern: /sq0csp-[a-zA-Z0-9-_]{43}/g,
168
+ severity: 'critical',
169
+ description: 'Square access token detected',
170
+ },
171
+ {
172
+ name: 'AWS Access Key ID',
173
+ pattern: /AKIA[0-9A-Z]{16}/g,
174
+ severity: 'critical',
175
+ description: 'AWS Access Key ID detected',
176
+ },
177
+ {
178
+ name: 'AWS Secret Access Key',
179
+ // AWS secret keys are exactly 40 chars, base64-like, and typically appear near AWS context
180
+ // The pattern requires it to be in an AWS-related context (variable name, nearby AKIA, etc.)
181
+ pattern: /(?:aws[_-]?secret[_-]?(?:access[_-]?)?key|secret[_-]?access[_-]?key|AWS_SECRET)\s*[:=]\s*['"`]?([a-zA-Z0-9/+=]{40})['"`]?/gi,
182
+ severity: 'critical',
183
+ description: 'AWS Secret Access Key detected',
184
+ },
185
+ {
186
+ name: 'Google API Key',
187
+ pattern: /AIza[0-9A-Za-z-_]{35}/g,
188
+ severity: 'high',
189
+ description: 'Google API key detected',
190
+ },
191
+ {
192
+ name: 'Slack Token',
193
+ pattern: /xox[baprs]-[0-9a-zA-Z]{10,}/g,
194
+ severity: 'critical',
195
+ description: 'Slack token detected',
196
+ },
197
+ {
198
+ name: 'Slack Webhook',
199
+ pattern: /https:\/\/hooks\.slack\.com\/services\/T[a-zA-Z0-9_]+\/B[a-zA-Z0-9_]+\/[a-zA-Z0-9_]+/g,
200
+ severity: 'high',
201
+ description: 'Slack webhook URL detected',
202
+ },
203
+ {
204
+ name: 'Discord Webhook',
205
+ pattern: /https:\/\/discord(?:app)?\.com\/api\/webhooks\/[0-9]+\/[a-zA-Z0-9_-]+/g,
206
+ severity: 'high',
207
+ description: 'Discord webhook URL detected',
208
+ },
209
+ {
210
+ name: 'Twilio API Key',
211
+ pattern: /SK[a-f0-9]{32}/g,
212
+ severity: 'critical',
213
+ description: 'Twilio API key detected',
214
+ },
215
+ {
216
+ name: 'SendGrid API Key',
217
+ pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/g,
218
+ severity: 'critical',
219
+ description: 'SendGrid API key detected',
220
+ },
221
+ {
222
+ name: 'Mailgun API Key',
223
+ pattern: /key-[a-zA-Z0-9]{32}/g,
224
+ severity: 'critical',
225
+ description: 'Mailgun API key detected',
226
+ },
227
+ {
228
+ name: 'Firebase API Key',
229
+ pattern: /AIza[0-9A-Za-z-_]{35}/g,
230
+ severity: 'high',
231
+ description: 'Firebase API key detected',
232
+ },
233
+ {
234
+ name: 'Supabase Anon Key',
235
+ pattern: /eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,
236
+ severity: 'low',
237
+ description: 'Supabase anon key detected (usually safe for client-side)',
238
+ },
239
+ {
240
+ name: 'Supabase Service Role Key',
241
+ pattern: /eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,
242
+ severity: 'critical',
243
+ description: 'JWT token detected - verify if this is a service role key',
244
+ },
245
+ {
246
+ name: 'Heroku API Key',
247
+ pattern: /[h|H][e|E][r|R][o|O][k|K][u|U].*[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}/gi,
248
+ severity: 'critical',
249
+ description: 'Heroku API key detected',
250
+ },
251
+ {
252
+ name: 'NPM Token',
253
+ pattern: /npm_[a-zA-Z0-9]{36}/g,
254
+ severity: 'critical',
255
+ description: 'NPM access token detected',
256
+ },
257
+ {
258
+ name: 'PyPI Token',
259
+ pattern: /pypi-[a-zA-Z0-9]{32,}/g,
260
+ severity: 'critical',
261
+ description: 'PyPI API token detected',
262
+ },
263
+ {
264
+ name: 'Private Key',
265
+ pattern: /-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g,
266
+ severity: 'critical',
267
+ description: 'Private key detected',
268
+ },
269
+ {
270
+ name: 'Generic Password in URL',
271
+ pattern: /[a-zA-Z]{3,10}:\/\/[^:]+:[^@]+@/g,
272
+ severity: 'high',
273
+ description: 'Password in URL detected',
274
+ },
275
+ {
276
+ name: 'Database Connection String',
277
+ pattern: /(mongodb|postgres|mysql|redis|amqp):\/\/[^\s"']+/gi,
278
+ severity: 'high',
279
+ description: 'Database connection string detected - may contain credentials',
280
+ },
281
+ // Additional patterns from checklist
282
+ {
283
+ name: 'Hardcoded JWT Token',
284
+ pattern: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g,
285
+ severity: 'high',
286
+ description: 'Hardcoded JWT token detected',
287
+ },
288
+ {
289
+ name: 'PostgreSQL Connection String',
290
+ pattern: /postgres:\/\/[^:]+:[^@]+@[^\s"']+/gi,
291
+ severity: 'critical',
292
+ description: 'PostgreSQL connection string with credentials detected',
293
+ },
294
+ {
295
+ name: 'MongoDB Connection String',
296
+ pattern: /mongodb(\+srv)?:\/\/[^:]+:[^@]+@[^\s"']+/gi,
297
+ severity: 'critical',
298
+ description: 'MongoDB connection string with credentials detected',
299
+ },
300
+ {
301
+ name: 'MySQL Connection String',
302
+ pattern: /mysql:\/\/[^:]+:[^@]+@[^\s"']+/gi,
303
+ severity: 'critical',
304
+ description: 'MySQL connection string with credentials detected',
305
+ },
306
+ {
307
+ name: 'Generic API Key Assignment',
308
+ pattern: /['"']?api[_-]?key['"']?\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
309
+ severity: 'medium',
310
+ description: 'Possible API key assignment detected - requires validation',
311
+ },
312
+ {
313
+ name: 'Generic Secret Key Assignment',
314
+ pattern: /['"']?secret[_-]?key['"']?\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
315
+ severity: 'medium',
316
+ description: 'Possible secret key assignment detected - requires validation',
317
+ },
318
+ {
319
+ name: 'Vercel Token',
320
+ pattern: /vercel_[a-zA-Z0-9]{24,}/gi,
321
+ severity: 'critical',
322
+ description: 'Vercel API token detected',
323
+ },
324
+ {
325
+ name: 'Netlify Token',
326
+ pattern: /nfp_[a-zA-Z0-9]{40,}/gi,
327
+ severity: 'critical',
328
+ description: 'Netlify personal access token detected',
329
+ },
330
+ {
331
+ name: 'Cloudflare API Token',
332
+ pattern: /[a-zA-Z0-9_-]{40}(?=.*cloudflare)/gi,
333
+ severity: 'high',
334
+ description: 'Potential Cloudflare API token detected',
335
+ },
336
+ ];
337
+ function detectKnownPatterns(content, filePath) {
338
+ const vulnerabilities = [];
339
+ const lines = content.split('\n');
340
+ // Skip example files entirely
341
+ if ((0, context_helpers_1.isExampleFile)(filePath)) {
342
+ return vulnerabilities;
343
+ }
344
+ // Skip scanner/fixture files to avoid self-detection
345
+ if ((0, context_helpers_1.isScannerOrFixtureFile)(filePath)) {
346
+ return vulnerabilities;
347
+ }
348
+ // Skip documentation/README files
349
+ if (isDocumentationFile(filePath)) {
350
+ return vulnerabilities;
351
+ }
352
+ // Check context for file-level decisions
353
+ const isServerFile = (0, context_helpers_1.isServerOnlyFile)(filePath);
354
+ const isTestFile = (0, context_helpers_1.isTestOrMockFile)(filePath);
355
+ for (const secretPattern of exports.SECRET_PATTERNS) {
356
+ lines.forEach((line, index) => {
357
+ // Skip comments
358
+ if ((0, context_helpers_1.isComment)(line))
359
+ return;
360
+ // Reset regex state
361
+ const regex = new RegExp(secretPattern.pattern.source, secretPattern.pattern.flags);
362
+ let match;
363
+ while ((match = regex.exec(line)) !== null) {
364
+ const value = match[0];
365
+ // Skip placeholder values
366
+ if ((0, context_helpers_1.isPlaceholderValue)(value, line)) {
367
+ continue;
368
+ }
369
+ // Skip obvious example/sample values
370
+ if (/example|sample|demo|test|dummy|fake|mock/i.test(value)) {
371
+ continue;
372
+ }
373
+ // Skip values that look like format descriptions
374
+ if (/^[a-z]+_[a-z]+_[a-z]+$/i.test(value) || /^your[_-]/i.test(value)) {
375
+ continue;
376
+ }
377
+ // Skip example/placeholder values (more comprehensive check)
378
+ if (isExamplePlaceholder(line, value)) {
379
+ continue;
380
+ }
381
+ // Skip secrets in variables with test/mock names (e.g., TEST_API_KEY, MOCK_SECRET)
382
+ if (hasTestVariableName(line)) {
383
+ continue;
384
+ }
385
+ // Check for BYOK (Bring Your Own Key) context - this is a feature, not a vulnerability
386
+ if ((0, context_helpers_1.isBYOKContext)(line, filePath)) {
387
+ // Skip BYOK patterns entirely if they're properly handled in server context
388
+ if (isServerFile && (0, context_helpers_1.isEnvVarReference)(line)) {
389
+ continue;
390
+ }
391
+ // For client-side BYOK forms, we still don't flag - it's user input
392
+ // Only flag if it's a hardcoded key being exposed
393
+ if (!(0, context_helpers_1.isEnvVarReference)(line) && line.includes('=') && /['"`][a-zA-Z0-9_-]{20,}['"`]/.test(line)) {
394
+ // This might be a hardcoded default key in a BYOK context - needs review
395
+ }
396
+ else {
397
+ continue;
398
+ }
399
+ }
400
+ // Determine severity based on context
401
+ let adjustedSeverity = secretPattern.severity;
402
+ let requiresAIValidation = false;
403
+ let adjustedDescription = secretPattern.description;
404
+ let adjustedConfidence = 'high';
405
+ // Check if this is a Supabase service role key or JWT
406
+ const isSupabaseOrJWT = secretPattern.name.includes('Supabase') ||
407
+ secretPattern.name.includes('JWT') ||
408
+ /eyJ[a-zA-Z0-9_-]+\.eyJ/.test(value);
409
+ if (isSupabaseOrJWT) {
410
+ // Use the comprehensive service role context checker
411
+ const serviceRoleContext = (0, context_helpers_1.getServiceRoleKeyContext)(line, filePath);
412
+ if (serviceRoleContext === 'safe_server') {
413
+ // Server-only + env var = expected pattern, skip entirely
414
+ continue;
415
+ }
416
+ else if (serviceRoleContext === 'client_exposure') {
417
+ // Client exposure = critical
418
+ adjustedSeverity = 'critical';
419
+ requiresAIValidation = true;
420
+ adjustedDescription = (0, context_helpers_1.isNextPublicEnvVar)(line)
421
+ ? `${secretPattern.description} - EXPOSED via NEXT_PUBLIC_ prefix (client-accessible)`
422
+ : `${secretPattern.description} - may be exposed to client bundle`;
423
+ }
424
+ else {
425
+ // needs_review - check more context
426
+ if ((0, context_helpers_1.isEnvVarReference)(line)) {
427
+ // Using env var but context unclear - validate
428
+ adjustedSeverity = 'medium';
429
+ requiresAIValidation = true;
430
+ adjustedDescription = `${secretPattern.description} - verify this is not exposed to client`;
431
+ }
432
+ else if (isServerFile) {
433
+ // Hardcoded in server file - bad but not critical
434
+ adjustedSeverity = 'high';
435
+ requiresAIValidation = true;
436
+ adjustedDescription = `${secretPattern.description} - hardcoded in server file, should use env var`;
437
+ }
438
+ else {
439
+ // Hardcoded in unknown context - critical + needs validation
440
+ adjustedSeverity = 'critical';
441
+ requiresAIValidation = true;
442
+ adjustedDescription = `${secretPattern.description} - hardcoded secret may be exposed`;
443
+ }
444
+ }
445
+ }
446
+ // Downgrade test file severity
447
+ if (isTestFile) {
448
+ if (adjustedSeverity === 'critical') {
449
+ adjustedSeverity = 'medium';
450
+ }
451
+ else if (adjustedSeverity === 'high') {
452
+ adjustedSeverity = 'low';
453
+ }
454
+ else {
455
+ adjustedSeverity = 'info';
456
+ }
457
+ adjustedConfidence = 'low';
458
+ adjustedDescription = `${adjustedDescription} (in test file)`;
459
+ }
460
+ // Generic patterns always require AI validation
461
+ const isGenericPattern = secretPattern.name.includes('Generic');
462
+ const finalRequiresAIValidation = requiresAIValidation || isGenericPattern;
463
+ vulnerabilities.push({
464
+ id: `pattern-${filePath}-${index + 1}-${secretPattern.name}`,
465
+ filePath,
466
+ lineNumber: index + 1,
467
+ lineContent: line.trim(),
468
+ severity: adjustedSeverity,
469
+ category: 'hardcoded_secret',
470
+ title: secretPattern.name,
471
+ description: adjustedDescription,
472
+ suggestedFix: 'Move this secret to an environment variable. Never commit secrets to version control.',
473
+ confidence: adjustedConfidence,
474
+ layer: 1,
475
+ requiresAIValidation: finalRequiresAIValidation,
476
+ });
477
+ }
478
+ });
479
+ }
480
+ return vulnerabilities;
481
+ }
482
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/layer1/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Layer 1: URL Pattern Matching
3
+ * Detects hardcoded sensitive URLs that may indicate security issues
4
+ */
5
+ import type { Vulnerability } from '../types';
6
+ export declare function aggregateLocalhostFindings(vulnerabilities: Vulnerability[]): Vulnerability[];
7
+ export declare function detectSensitiveURLs(content: string, filePath: string): Vulnerability[];
8
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/layer1/urls.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AA+L7C,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,aAAa,EAAE,GAC/B,aAAa,EAAE,CAwCjB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CA0FjB"}