vaspera 2.8.0 → 2.9.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 (303) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +111 -7
  3. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts +5 -0
  4. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts.map +1 -0
  5. package/dist/__tests__/agents/adversary/tactics/api.test.js +369 -0
  6. package/dist/__tests__/agents/adversary/tactics/api.test.js.map +1 -0
  7. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts +5 -0
  8. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts.map +1 -0
  9. package/dist/__tests__/agents/adversary/tactics/llm.test.js +409 -0
  10. package/dist/__tests__/agents/adversary/tactics/llm.test.js.map +1 -0
  11. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts +7 -0
  12. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts.map +1 -0
  13. package/dist/__tests__/agents/adversary/tactics/registry.test.js +74 -0
  14. package/dist/__tests__/agents/adversary/tactics/registry.test.js.map +1 -0
  15. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts +7 -0
  16. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts.map +1 -0
  17. package/dist/__tests__/agents/adversary/tactics/web-app.test.js +374 -0
  18. package/dist/__tests__/agents/adversary/tactics/web-app.test.js.map +1 -0
  19. package/dist/__tests__/compliance-bundle.test.d.ts +9 -0
  20. package/dist/__tests__/compliance-bundle.test.d.ts.map +1 -0
  21. package/dist/__tests__/compliance-bundle.test.js +344 -0
  22. package/dist/__tests__/compliance-bundle.test.js.map +1 -0
  23. package/dist/__tests__/healthcare-compliance.test.d.ts +9 -0
  24. package/dist/__tests__/healthcare-compliance.test.d.ts.map +1 -0
  25. package/dist/__tests__/healthcare-compliance.test.js +233 -0
  26. package/dist/__tests__/healthcare-compliance.test.js.map +1 -0
  27. package/dist/action/diff-mode.d.ts +124 -8
  28. package/dist/action/diff-mode.d.ts.map +1 -1
  29. package/dist/action/diff-mode.js +384 -65
  30. package/dist/action/diff-mode.js.map +1 -1
  31. package/dist/action/diff-mode.test.js +3 -3
  32. package/dist/action/diff-mode.test.js.map +1 -1
  33. package/dist/action/pr-comment.test.js +1 -0
  34. package/dist/action/pr-comment.test.js.map +1 -1
  35. package/dist/action/sarif-upload.test.js +1 -0
  36. package/dist/action/sarif-upload.test.js.map +1 -1
  37. package/dist/agents/adversary/config.d.ts +25 -4
  38. package/dist/agents/adversary/config.d.ts.map +1 -1
  39. package/dist/agents/adversary/config.js +38 -8
  40. package/dist/agents/adversary/config.js.map +1 -1
  41. package/dist/agents/adversary/index.d.ts +7 -0
  42. package/dist/agents/adversary/index.d.ts.map +1 -1
  43. package/dist/agents/adversary/index.js +83 -1
  44. package/dist/agents/adversary/index.js.map +1 -1
  45. package/dist/agents/adversary/reporting/compliance-mapper.d.ts +108 -0
  46. package/dist/agents/adversary/reporting/compliance-mapper.d.ts.map +1 -0
  47. package/dist/agents/adversary/reporting/compliance-mapper.js +391 -0
  48. package/dist/agents/adversary/reporting/compliance-mapper.js.map +1 -0
  49. package/dist/agents/adversary/reporting/index.d.ts +10 -0
  50. package/dist/agents/adversary/reporting/index.d.ts.map +1 -0
  51. package/dist/agents/adversary/reporting/index.js +10 -0
  52. package/dist/agents/adversary/reporting/index.js.map +1 -0
  53. package/dist/agents/adversary/reporting/poc-generator.d.ts +44 -0
  54. package/dist/agents/adversary/reporting/poc-generator.d.ts.map +1 -0
  55. package/dist/agents/adversary/reporting/poc-generator.js +308 -0
  56. package/dist/agents/adversary/reporting/poc-generator.js.map +1 -0
  57. package/dist/agents/adversary/tactics/api.d.ts +13 -0
  58. package/dist/agents/adversary/tactics/api.d.ts.map +1 -0
  59. package/dist/agents/adversary/tactics/api.js +815 -0
  60. package/dist/agents/adversary/tactics/api.js.map +1 -0
  61. package/dist/agents/adversary/tactics/auth.d.ts +13 -0
  62. package/dist/agents/adversary/tactics/auth.d.ts.map +1 -0
  63. package/dist/agents/adversary/tactics/auth.js +676 -0
  64. package/dist/agents/adversary/tactics/auth.js.map +1 -0
  65. package/dist/agents/adversary/tactics/index.d.ts +129 -0
  66. package/dist/agents/adversary/tactics/index.d.ts.map +1 -0
  67. package/dist/agents/adversary/tactics/index.js +199 -0
  68. package/dist/agents/adversary/tactics/index.js.map +1 -0
  69. package/dist/agents/adversary/tactics/infra.d.ts +13 -0
  70. package/dist/agents/adversary/tactics/infra.d.ts.map +1 -0
  71. package/dist/agents/adversary/tactics/infra.js +827 -0
  72. package/dist/agents/adversary/tactics/infra.js.map +1 -0
  73. package/dist/agents/adversary/tactics/injection.d.ts +12 -0
  74. package/dist/agents/adversary/tactics/injection.d.ts.map +1 -0
  75. package/dist/agents/adversary/tactics/injection.js +549 -0
  76. package/dist/agents/adversary/tactics/injection.js.map +1 -0
  77. package/dist/agents/adversary/tactics/llm.d.ts +13 -0
  78. package/dist/agents/adversary/tactics/llm.d.ts.map +1 -0
  79. package/dist/agents/adversary/tactics/llm.js +767 -0
  80. package/dist/agents/adversary/tactics/llm.js.map +1 -0
  81. package/dist/agents/adversary/tactics/web-app.d.ts +13 -0
  82. package/dist/agents/adversary/tactics/web-app.d.ts.map +1 -0
  83. package/dist/agents/adversary/tactics/web-app.js +717 -0
  84. package/dist/agents/adversary/tactics/web-app.js.map +1 -0
  85. package/dist/agents/adversary/types.d.ts +66 -10
  86. package/dist/agents/adversary/types.d.ts.map +1 -1
  87. package/dist/agents/zero-day-hunter.d.ts +1 -1
  88. package/dist/agents/zero-day-hunter.d.ts.map +1 -1
  89. package/dist/analysis/data-flow.d.ts +154 -0
  90. package/dist/analysis/data-flow.d.ts.map +1 -0
  91. package/dist/analysis/data-flow.js +393 -0
  92. package/dist/analysis/data-flow.js.map +1 -0
  93. package/dist/analysis/index.d.ts +9 -0
  94. package/dist/analysis/index.d.ts.map +1 -0
  95. package/dist/analysis/index.js +9 -0
  96. package/dist/analysis/index.js.map +1 -0
  97. package/dist/badge-service/index.d.ts +144 -0
  98. package/dist/badge-service/index.d.ts.map +1 -0
  99. package/dist/badge-service/index.js +206 -0
  100. package/dist/badge-service/index.js.map +1 -0
  101. package/dist/certification/types.d.ts +1 -1
  102. package/dist/certification/types.d.ts.map +1 -1
  103. package/dist/certification/types.js.map +1 -1
  104. package/dist/commands/certification/certify.d.ts.map +1 -1
  105. package/dist/commands/certification/certify.js +18 -4
  106. package/dist/commands/certification/certify.js.map +1 -1
  107. package/dist/compliance/attestation.d.ts +39 -0
  108. package/dist/compliance/attestation.d.ts.map +1 -0
  109. package/dist/compliance/attestation.js +364 -0
  110. package/dist/compliance/attestation.js.map +1 -0
  111. package/dist/compliance/cfr42-part2.d.ts +42 -0
  112. package/dist/compliance/cfr42-part2.d.ts.map +1 -0
  113. package/dist/compliance/cfr42-part2.js +408 -0
  114. package/dist/compliance/cfr42-part2.js.map +1 -0
  115. package/dist/compliance/compliance-bundle.d.ts +100 -0
  116. package/dist/compliance/compliance-bundle.d.ts.map +1 -0
  117. package/dist/compliance/compliance-bundle.js +210 -0
  118. package/dist/compliance/compliance-bundle.js.map +1 -0
  119. package/dist/compliance/healthcare-bundle.d.ts +68 -0
  120. package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
  121. package/dist/compliance/healthcare-bundle.js +104 -0
  122. package/dist/compliance/healthcare-bundle.js.map +1 -0
  123. package/dist/compliance/hipaa.d.ts.map +1 -1
  124. package/dist/compliance/hipaa.js +14 -11
  125. package/dist/compliance/hipaa.js.map +1 -1
  126. package/dist/compliance/index.d.ts +10 -2
  127. package/dist/compliance/index.d.ts.map +1 -1
  128. package/dist/compliance/index.js +9 -3
  129. package/dist/compliance/index.js.map +1 -1
  130. package/dist/compliance/mapper.d.ts.map +1 -1
  131. package/dist/compliance/mapper.js +3 -17
  132. package/dist/compliance/mapper.js.map +1 -1
  133. package/dist/compliance/nist-800-53.d.ts +22 -6
  134. package/dist/compliance/nist-800-53.d.ts.map +1 -1
  135. package/dist/compliance/nist-800-53.js +264 -272
  136. package/dist/compliance/nist-800-53.js.map +1 -1
  137. package/dist/compliance/report.d.ts +31 -2
  138. package/dist/compliance/report.d.ts.map +1 -1
  139. package/dist/compliance/report.js +255 -4
  140. package/dist/compliance/report.js.map +1 -1
  141. package/dist/compliance/types.d.ts +1 -1
  142. package/dist/compliance/types.d.ts.map +1 -1
  143. package/dist/config/flags.d.ts +12 -12
  144. package/dist/cost/index.d.ts +1 -1
  145. package/dist/cost/index.d.ts.map +1 -1
  146. package/dist/cost/index.js +1 -1
  147. package/dist/cost/index.js.map +1 -1
  148. package/dist/cost/tracker.d.ts +64 -0
  149. package/dist/cost/tracker.d.ts.map +1 -1
  150. package/dist/cost/tracker.js +165 -0
  151. package/dist/cost/tracker.js.map +1 -1
  152. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
  153. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
  154. package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
  155. package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
  156. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
  157. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
  158. package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
  159. package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
  160. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
  161. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
  162. package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
  163. package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
  164. package/dist/evidence/collector.d.ts +21 -0
  165. package/dist/evidence/collector.d.ts.map +1 -0
  166. package/dist/evidence/collector.js +340 -0
  167. package/dist/evidence/collector.js.map +1 -0
  168. package/dist/evidence/index.d.ts +11 -0
  169. package/dist/evidence/index.d.ts.map +1 -0
  170. package/dist/evidence/index.js +12 -0
  171. package/dist/evidence/index.js.map +1 -0
  172. package/dist/evidence/store.d.ts +39 -0
  173. package/dist/evidence/store.d.ts.map +1 -0
  174. package/dist/evidence/store.js +173 -0
  175. package/dist/evidence/store.js.map +1 -0
  176. package/dist/evidence/types.d.ts +175 -0
  177. package/dist/evidence/types.d.ts.map +1 -0
  178. package/dist/evidence/types.js +9 -0
  179. package/dist/evidence/types.js.map +1 -0
  180. package/dist/exporters/checkmarx.d.ts +18 -0
  181. package/dist/exporters/checkmarx.d.ts.map +1 -0
  182. package/dist/exporters/checkmarx.js +203 -0
  183. package/dist/exporters/checkmarx.js.map +1 -0
  184. package/dist/exporters/index.d.ts +22 -0
  185. package/dist/exporters/index.d.ts.map +1 -0
  186. package/dist/exporters/index.js +41 -0
  187. package/dist/exporters/index.js.map +1 -0
  188. package/dist/exporters/snyk.d.ts +18 -0
  189. package/dist/exporters/snyk.d.ts.map +1 -0
  190. package/dist/exporters/snyk.js +119 -0
  191. package/dist/exporters/snyk.js.map +1 -0
  192. package/dist/exporters/sonarqube.d.ts +18 -0
  193. package/dist/exporters/sonarqube.d.ts.map +1 -0
  194. package/dist/exporters/sonarqube.js +125 -0
  195. package/dist/exporters/sonarqube.js.map +1 -0
  196. package/dist/exporters/types.d.ts +190 -0
  197. package/dist/exporters/types.d.ts.map +1 -0
  198. package/dist/exporters/types.js +9 -0
  199. package/dist/exporters/types.js.map +1 -0
  200. package/dist/frontier/index.d.ts +12 -0
  201. package/dist/frontier/index.d.ts.map +1 -0
  202. package/dist/frontier/index.js +12 -0
  203. package/dist/frontier/index.js.map +1 -0
  204. package/dist/frontier/orchestrator.d.ts +73 -0
  205. package/dist/frontier/orchestrator.d.ts.map +1 -0
  206. package/dist/frontier/orchestrator.js +312 -0
  207. package/dist/frontier/orchestrator.js.map +1 -0
  208. package/dist/frontier/providers/stub.d.ts +32 -0
  209. package/dist/frontier/providers/stub.d.ts.map +1 -0
  210. package/dist/frontier/providers/stub.js +66 -0
  211. package/dist/frontier/providers/stub.js.map +1 -0
  212. package/dist/frontier/types.d.ts +318 -0
  213. package/dist/frontier/types.d.ts.map +1 -0
  214. package/dist/frontier/types.js +27 -0
  215. package/dist/frontier/types.js.map +1 -0
  216. package/dist/history/index.d.ts +13 -0
  217. package/dist/history/index.d.ts.map +1 -0
  218. package/dist/history/index.js +15 -0
  219. package/dist/history/index.js.map +1 -0
  220. package/dist/history/store.d.ts +74 -0
  221. package/dist/history/store.d.ts.map +1 -0
  222. package/dist/history/store.js +399 -0
  223. package/dist/history/store.js.map +1 -0
  224. package/dist/history/types.d.ts +282 -0
  225. package/dist/history/types.d.ts.map +1 -0
  226. package/dist/history/types.js +41 -0
  227. package/dist/history/types.js.map +1 -0
  228. package/dist/history/verify.d.ts +44 -0
  229. package/dist/history/verify.d.ts.map +1 -0
  230. package/dist/history/verify.js +230 -0
  231. package/dist/history/verify.js.map +1 -0
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +431 -18
  234. package/dist/index.js.map +1 -1
  235. package/dist/multimodel/index.d.ts +1 -0
  236. package/dist/multimodel/index.d.ts.map +1 -1
  237. package/dist/multimodel/index.js +2 -0
  238. package/dist/multimodel/index.js.map +1 -1
  239. package/dist/multimodel/leaderboard.d.ts +116 -0
  240. package/dist/multimodel/leaderboard.d.ts.map +1 -0
  241. package/dist/multimodel/leaderboard.js +262 -0
  242. package/dist/multimodel/leaderboard.js.map +1 -0
  243. package/dist/observability/otel.d.ts.map +1 -1
  244. package/dist/observability/otel.js +1 -3
  245. package/dist/observability/otel.js.map +1 -1
  246. package/dist/plugins/loader.js +1 -1
  247. package/dist/plugins/loader.js.map +1 -1
  248. package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
  249. package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
  250. package/dist/scanners/agent/agent-chain-analysis.js +438 -0
  251. package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
  252. package/dist/scanners/agent/payloads/index.d.ts +2 -1
  253. package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
  254. package/dist/scanners/agent/payloads/index.js +25 -6
  255. package/dist/scanners/agent/payloads/index.js.map +1 -1
  256. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
  257. package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
  258. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
  259. package/dist/scanners/agent/types.d.ts +5 -5
  260. package/dist/scanners/agent/types.d.ts.map +1 -1
  261. package/dist/scanners/agent/types.js.map +1 -1
  262. package/dist/scanners/cache.d.ts +156 -0
  263. package/dist/scanners/cache.d.ts.map +1 -0
  264. package/dist/scanners/cache.js +462 -0
  265. package/dist/scanners/cache.js.map +1 -0
  266. package/dist/scanners/dependencies.js +4 -4
  267. package/dist/scanners/dependencies.js.map +1 -1
  268. package/dist/scanners/gosec.d.ts.map +1 -1
  269. package/dist/scanners/gosec.js +47 -9
  270. package/dist/scanners/gosec.js.map +1 -1
  271. package/dist/scanners/healthcare.d.ts +29 -0
  272. package/dist/scanners/healthcare.d.ts.map +1 -0
  273. package/dist/scanners/healthcare.js +526 -0
  274. package/dist/scanners/healthcare.js.map +1 -0
  275. package/dist/scanners/index.d.ts +1 -0
  276. package/dist/scanners/index.d.ts.map +1 -1
  277. package/dist/scanners/index.js +33 -0
  278. package/dist/scanners/index.js.map +1 -1
  279. package/dist/scanners/index.test.js +6 -6
  280. package/dist/scanners/index.test.js.map +1 -1
  281. package/dist/scanners/secrets.js +4 -4
  282. package/dist/scanners/secrets.js.map +1 -1
  283. package/dist/scanners/semgrep.js +5 -5
  284. package/dist/scanners/semgrep.js.map +1 -1
  285. package/dist/scanners/types.d.ts +1 -1
  286. package/dist/scanners/types.d.ts.map +1 -1
  287. package/dist/scanners/types.js +1 -0
  288. package/dist/scanners/types.js.map +1 -1
  289. package/dist/scanners/typescript.test.js +1 -1
  290. package/dist/scanners/typescript.test.js.map +1 -1
  291. package/dist/telemetry/index.d.ts +10 -0
  292. package/dist/telemetry/index.d.ts.map +1 -0
  293. package/dist/telemetry/index.js +10 -0
  294. package/dist/telemetry/index.js.map +1 -0
  295. package/dist/telemetry/registry.d.ts +178 -0
  296. package/dist/telemetry/registry.d.ts.map +1 -0
  297. package/dist/telemetry/registry.js +297 -0
  298. package/dist/telemetry/registry.js.map +1 -0
  299. package/dist/telemetry/usage.d.ts +197 -0
  300. package/dist/telemetry/usage.d.ts.map +1 -0
  301. package/dist/telemetry/usage.js +244 -0
  302. package/dist/telemetry/usage.js.map +1 -0
  303. package/package.json +1 -1
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Data Flow Analysis Module
3
+ *
4
+ * Tracks data flow from sources (user input, API responses) to sinks
5
+ * (database writes, command execution) to identify potential vulnerabilities.
6
+ *
7
+ * This module provides the foundation for semantic vulnerability detection
8
+ * by identifying risky data flows that bypass sanitization.
9
+ *
10
+ * @module analysis/data-flow
11
+ */
12
+ import { readFile } from "fs/promises";
13
+ import { join, extname } from "path";
14
+ import { logger } from "../logger.js";
15
+ // ============================================================================
16
+ // Pattern Definitions
17
+ // ============================================================================
18
+ /**
19
+ * Patterns for identifying data sources by language
20
+ */
21
+ const SOURCE_PATTERNS = {
22
+ javascript: [
23
+ // Express.js patterns
24
+ { pattern: /req\.body(?:\.\w+)?/g, type: "user-input", trustLevel: "untrusted" },
25
+ { pattern: /req\.params(?:\.\w+)?/g, type: "url-param", trustLevel: "untrusted" },
26
+ { pattern: /req\.query(?:\.\w+)?/g, type: "url-param", trustLevel: "untrusted" },
27
+ { pattern: /req\.headers(?:\[['"][^'"]+['"]\])?/g, type: "header", trustLevel: "untrusted" },
28
+ { pattern: /req\.cookies(?:\.\w+)?/g, type: "cookie", trustLevel: "untrusted" },
29
+ // Fetch/API responses
30
+ { pattern: /\.json\(\)/g, type: "api-response", trustLevel: "semi-trusted" },
31
+ { pattern: /await\s+fetch\([^)]+\)/g, type: "api-response", trustLevel: "semi-trusted" },
32
+ // Environment variables
33
+ { pattern: /process\.env(?:\.\w+|\[['"][^'"]+['"]\])/g, type: "env-var", trustLevel: "trusted" },
34
+ // File reads
35
+ { pattern: /readFile(?:Sync)?\([^)]+\)/g, type: "file-read", trustLevel: "semi-trusted" },
36
+ { pattern: /fs\.read(?:File)?(?:Sync)?\([^)]+\)/g, type: "file-read", trustLevel: "semi-trusted" },
37
+ ],
38
+ typescript: [], // Same as JavaScript, will extend
39
+ python: [
40
+ // Flask patterns
41
+ { pattern: /request\.(?:form|json|args|data|values)(?:\[['"][^'"]+['"]\])?/g, type: "user-input", trustLevel: "untrusted" },
42
+ { pattern: /request\.headers(?:\[['"][^'"]+['"]\])?/g, type: "header", trustLevel: "untrusted" },
43
+ { pattern: /request\.cookies(?:\[['"][^'"]+['"]\])?/g, type: "cookie", trustLevel: "untrusted" },
44
+ // Django patterns
45
+ { pattern: /request\.(?:GET|POST|FILES)(?:\[['"][^'"]+['"]\])?/g, type: "user-input", trustLevel: "untrusted" },
46
+ // Environment
47
+ { pattern: /os\.(?:getenv|environ)(?:\[['"][^'"]+['"]\]|\(['"][^'"]+['"]\))/g, type: "env-var", trustLevel: "trusted" },
48
+ // File reads
49
+ { pattern: /open\([^)]+\)\.read\(\)/g, type: "file-read", trustLevel: "semi-trusted" },
50
+ ],
51
+ };
52
+ /**
53
+ * Patterns for identifying data sinks by language
54
+ */
55
+ const SINK_PATTERNS = {
56
+ javascript: [
57
+ // SQL
58
+ { pattern: /\.query\([^)]+\)/g, type: "sql-query", riskLevel: "critical", function: "query" },
59
+ { pattern: /\.execute\([^)]+\)/g, type: "sql-query", riskLevel: "critical", function: "execute" },
60
+ { pattern: /\.raw\([^)]+\)/g, type: "sql-query", riskLevel: "critical", function: "raw" },
61
+ // Command execution
62
+ { pattern: /exec\([^)]+\)/g, type: "command-exec", riskLevel: "critical", function: "exec" },
63
+ { pattern: /execSync\([^)]+\)/g, type: "command-exec", riskLevel: "critical", function: "execSync" },
64
+ { pattern: /spawn\([^)]+\)/g, type: "command-exec", riskLevel: "high", function: "spawn" },
65
+ // Eval
66
+ { pattern: /eval\([^)]+\)/g, type: "eval", riskLevel: "critical", function: "eval" },
67
+ { pattern: /Function\([^)]+\)/g, type: "eval", riskLevel: "critical", function: "Function" },
68
+ { pattern: /vm\.runInContext\([^)]+\)/g, type: "eval", riskLevel: "critical", function: "vm.runInContext" },
69
+ // File writes
70
+ { pattern: /writeFile(?:Sync)?\([^)]+\)/g, type: "file-write", riskLevel: "high", function: "writeFile" },
71
+ { pattern: /fs\.write(?:File)?(?:Sync)?\([^)]+\)/g, type: "file-write", riskLevel: "high", function: "fs.writeFile" },
72
+ // HTML rendering
73
+ { pattern: /\.innerHTML\s*=/g, type: "html-render", riskLevel: "high", function: "innerHTML" },
74
+ { pattern: /document\.write\([^)]+\)/g, type: "html-render", riskLevel: "high", function: "document.write" },
75
+ // Redirects
76
+ { pattern: /res\.redirect\([^)]+\)/g, type: "redirect", riskLevel: "medium", function: "res.redirect" },
77
+ { pattern: /location\.href\s*=/g, type: "redirect", riskLevel: "medium", function: "location.href" },
78
+ ],
79
+ typescript: [], // Same as JavaScript
80
+ python: [
81
+ // SQL
82
+ { pattern: /\.execute\([^)]+\)/g, type: "sql-query", riskLevel: "critical", function: "execute" },
83
+ { pattern: /cursor\.execute\([^)]+\)/g, type: "sql-query", riskLevel: "critical", function: "cursor.execute" },
84
+ // Command execution
85
+ { pattern: /os\.system\([^)]+\)/g, type: "command-exec", riskLevel: "critical", function: "os.system" },
86
+ { pattern: /subprocess\.(?:run|call|Popen)\([^)]+\)/g, type: "command-exec", riskLevel: "critical", function: "subprocess" },
87
+ // Eval
88
+ { pattern: /eval\([^)]+\)/g, type: "eval", riskLevel: "critical", function: "eval" },
89
+ { pattern: /exec\([^)]+\)/g, type: "eval", riskLevel: "critical", function: "exec" },
90
+ // File writes
91
+ { pattern: /open\([^,]+,\s*['"]w['"]\)/g, type: "file-write", riskLevel: "high", function: "open(write)" },
92
+ ],
93
+ };
94
+ /**
95
+ * Patterns for identifying sanitizers
96
+ */
97
+ const SANITIZER_PATTERNS = {
98
+ javascript: [
99
+ { pattern: /escape(?:Html)?\(/g, function: "escapeHtml", sanitizesFor: ["html-render"] },
100
+ { pattern: /sanitize(?:Html)?\(/g, function: "sanitizeHtml", sanitizesFor: ["html-render"] },
101
+ { pattern: /DOMPurify\.sanitize\(/g, function: "DOMPurify.sanitize", sanitizesFor: ["html-render"] },
102
+ { pattern: /encodeURIComponent\(/g, function: "encodeURIComponent", sanitizesFor: ["redirect", "url-param"] },
103
+ { pattern: /parameterized|prepared|placeholder/gi, function: "prepared statement", sanitizesFor: ["sql-query"] },
104
+ { pattern: /\$\d+|\?/g, function: "parameterized query", sanitizesFor: ["sql-query"] },
105
+ ],
106
+ python: [
107
+ { pattern: /escape\(/g, function: "escape", sanitizesFor: ["html-render"] },
108
+ { pattern: /bleach\.clean\(/g, function: "bleach.clean", sanitizesFor: ["html-render"] },
109
+ { pattern: /quote\(/g, function: "quote", sanitizesFor: ["sql-query"] },
110
+ { pattern: /%s|:\w+/g, function: "parameterized", sanitizesFor: ["sql-query"] },
111
+ ],
112
+ };
113
+ // Copy JS patterns to TS
114
+ SOURCE_PATTERNS.typescript = SOURCE_PATTERNS.javascript;
115
+ SINK_PATTERNS.typescript = SINK_PATTERNS.javascript;
116
+ SANITIZER_PATTERNS.typescript = SANITIZER_PATTERNS.javascript;
117
+ // ============================================================================
118
+ // Analysis Functions
119
+ // ============================================================================
120
+ /**
121
+ * Get language from file extension
122
+ */
123
+ function getLanguage(filePath) {
124
+ const ext = extname(filePath).toLowerCase();
125
+ const langMap = {
126
+ ".js": "javascript",
127
+ ".mjs": "javascript",
128
+ ".cjs": "javascript",
129
+ ".jsx": "javascript",
130
+ ".ts": "typescript",
131
+ ".tsx": "typescript",
132
+ ".py": "python",
133
+ };
134
+ return langMap[ext] || "unknown";
135
+ }
136
+ /**
137
+ * Generate a unique ID
138
+ */
139
+ function generateId(prefix) {
140
+ return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
141
+ }
142
+ /**
143
+ * Find line number for a match position
144
+ */
145
+ function getLineNumber(content, position) {
146
+ return content.slice(0, position).split("\n").length;
147
+ }
148
+ /**
149
+ * Get code snippet around a position
150
+ */
151
+ function getSnippet(content, line, contextLines = 1) {
152
+ const lines = content.split("\n");
153
+ const start = Math.max(0, line - contextLines - 1);
154
+ const end = Math.min(lines.length, line + contextLines);
155
+ return lines.slice(start, end).join("\n");
156
+ }
157
+ /**
158
+ * Identify data sources in a file
159
+ */
160
+ async function identifySourcesInFile(filePath, content) {
161
+ const language = getLanguage(filePath);
162
+ const patterns = SOURCE_PATTERNS[language] || [];
163
+ const sources = [];
164
+ for (const { pattern, type, trustLevel } of patterns) {
165
+ const regex = new RegExp(pattern.source, pattern.flags);
166
+ let match;
167
+ while ((match = regex.exec(content)) !== null) {
168
+ const line = getLineNumber(content, match.index);
169
+ sources.push({
170
+ id: generateId("src"),
171
+ type,
172
+ location: {
173
+ file: filePath,
174
+ line,
175
+ snippet: getSnippet(content, line),
176
+ },
177
+ variable: match[0],
178
+ trustLevel,
179
+ description: `${type} at ${filePath}:${line}`,
180
+ pattern: pattern.source,
181
+ });
182
+ }
183
+ }
184
+ return sources;
185
+ }
186
+ /**
187
+ * Identify data sinks in a file
188
+ */
189
+ async function identifySinksInFile(filePath, content) {
190
+ const language = getLanguage(filePath);
191
+ const patterns = SINK_PATTERNS[language] || [];
192
+ const sinks = [];
193
+ for (const { pattern, type, riskLevel, function: fn } of patterns) {
194
+ const regex = new RegExp(pattern.source, pattern.flags);
195
+ let match;
196
+ while ((match = regex.exec(content)) !== null) {
197
+ const line = getLineNumber(content, match.index);
198
+ sinks.push({
199
+ id: generateId("sink"),
200
+ type,
201
+ location: {
202
+ file: filePath,
203
+ line,
204
+ snippet: getSnippet(content, line),
205
+ },
206
+ function: fn,
207
+ riskLevel,
208
+ description: `${type} (${fn}) at ${filePath}:${line}`,
209
+ pattern: pattern.source,
210
+ });
211
+ }
212
+ }
213
+ return sinks;
214
+ }
215
+ /**
216
+ * Identify sanitizers in a file
217
+ */
218
+ async function identifySanitizersInFile(filePath, content) {
219
+ const language = getLanguage(filePath);
220
+ const patterns = SANITIZER_PATTERNS[language] || [];
221
+ const sanitizers = [];
222
+ for (const { pattern, function: fn, sanitizesFor } of patterns) {
223
+ const regex = new RegExp(pattern.source, pattern.flags);
224
+ let match;
225
+ while ((match = regex.exec(content)) !== null) {
226
+ const line = getLineNumber(content, match.index);
227
+ sanitizers.push({
228
+ id: generateId("san"),
229
+ function: fn,
230
+ location: {
231
+ file: filePath,
232
+ line,
233
+ snippet: getSnippet(content, line),
234
+ },
235
+ sanitizesFor,
236
+ description: `Sanitizer ${fn} at ${filePath}:${line}`,
237
+ });
238
+ }
239
+ }
240
+ return sanitizers;
241
+ }
242
+ /**
243
+ * Determine if a source-sink pair has a sanitizer between them
244
+ */
245
+ function hasSanitizerBetween(source, sink, sanitizers) {
246
+ // Simple heuristic: check if there's a sanitizer in the same file
247
+ // between the source and sink lines, and if it sanitizes for this sink type
248
+ const relevantSanitizers = sanitizers.filter((s) => s.location.file === source.location.file &&
249
+ s.location.file === sink.location.file &&
250
+ s.location.line > source.location.line &&
251
+ s.location.line < sink.location.line &&
252
+ s.sanitizesFor.includes(sink.type));
253
+ return {
254
+ sanitized: relevantSanitizers.length > 0,
255
+ sanitizerLocations: relevantSanitizers.map((s) => s.location),
256
+ };
257
+ }
258
+ /**
259
+ * Calculate risk level for a flow
260
+ */
261
+ function calculateFlowRisk(source, sink, sanitized) {
262
+ if (sanitized) {
263
+ return "info";
264
+ }
265
+ if (source.trustLevel === "untrusted") {
266
+ if (sink.riskLevel === "critical")
267
+ return "critical";
268
+ if (sink.riskLevel === "high")
269
+ return "high";
270
+ return "medium";
271
+ }
272
+ if (source.trustLevel === "semi-trusted") {
273
+ if (sink.riskLevel === "critical")
274
+ return "high";
275
+ if (sink.riskLevel === "high")
276
+ return "medium";
277
+ return "low";
278
+ }
279
+ return "low";
280
+ }
281
+ /**
282
+ * Identify potential data flows between sources and sinks
283
+ */
284
+ function identifyFlows(sources, sinks, sanitizers) {
285
+ const flows = [];
286
+ // Simple heuristic: match sources and sinks in the same file
287
+ // More sophisticated analysis would use actual data flow tracking
288
+ for (const source of sources) {
289
+ for (const sink of sinks) {
290
+ // Only connect sources and sinks in the same file (simplified)
291
+ if (source.location.file !== sink.location.file) {
292
+ continue;
293
+ }
294
+ // Only connect if sink comes after source
295
+ if (sink.location.line <= source.location.line) {
296
+ continue;
297
+ }
298
+ const { sanitized, sanitizerLocations } = hasSanitizerBetween(source, sink, sanitizers);
299
+ const riskLevel = calculateFlowRisk(source, sink, sanitized);
300
+ flows.push({
301
+ source,
302
+ sink,
303
+ path: [source.location, sink.location],
304
+ passesThroughSanitizer: sanitized,
305
+ sanitizerLocations: sanitized ? sanitizerLocations : undefined,
306
+ riskLevel,
307
+ description: sanitized
308
+ ? `Sanitized flow from ${source.type} to ${sink.type}`
309
+ : `Unsanitized ${source.trustLevel} data flows to ${sink.type}`,
310
+ });
311
+ }
312
+ }
313
+ return flows;
314
+ }
315
+ // ============================================================================
316
+ // Public API
317
+ // ============================================================================
318
+ /**
319
+ * Build data flow context for a project
320
+ */
321
+ export async function buildDataFlowContext(projectPath, files) {
322
+ const allSources = [];
323
+ const allSinks = [];
324
+ const allSanitizers = [];
325
+ // If no files provided, this would scan the project
326
+ // For now, accept a list of files to analyze
327
+ const filesToAnalyze = files || [];
328
+ for (const filePath of filesToAnalyze) {
329
+ try {
330
+ const fullPath = join(projectPath, filePath);
331
+ const content = await readFile(fullPath, "utf-8");
332
+ const sources = await identifySourcesInFile(filePath, content);
333
+ const sinks = await identifySinksInFile(filePath, content);
334
+ const sanitizers = await identifySanitizersInFile(filePath, content);
335
+ allSources.push(...sources);
336
+ allSinks.push(...sinks);
337
+ allSanitizers.push(...sanitizers);
338
+ }
339
+ catch (error) {
340
+ logger.warn("data-flow.file_read_error", {
341
+ file: filePath,
342
+ error: error instanceof Error ? error.message : String(error),
343
+ });
344
+ }
345
+ }
346
+ const flows = identifyFlows(allSources, allSinks, allSanitizers);
347
+ const riskyFlows = flows.filter((f) => !f.passesThroughSanitizer);
348
+ const sanitizedFlows = flows.filter((f) => f.passesThroughSanitizer);
349
+ return {
350
+ sources: allSources,
351
+ sinks: allSinks,
352
+ sanitizers: allSanitizers,
353
+ flows,
354
+ stats: {
355
+ totalSources: allSources.length,
356
+ totalSinks: allSinks.length,
357
+ totalSanitizers: allSanitizers.length,
358
+ totalFlows: flows.length,
359
+ riskyFlows: riskyFlows.length,
360
+ sanitizedFlows: sanitizedFlows.length,
361
+ },
362
+ };
363
+ }
364
+ /**
365
+ * Get only risky (unsanitized) flows
366
+ */
367
+ export function getRiskyFlows(context) {
368
+ return context.flows.filter((f) => !f.passesThroughSanitizer);
369
+ }
370
+ /**
371
+ * Get flows by severity
372
+ */
373
+ export function getFlowsBySeverity(context, severity) {
374
+ return context.flows.filter((f) => f.riskLevel === severity);
375
+ }
376
+ /**
377
+ * Format context for LLM analysis
378
+ */
379
+ export function formatContextForLLM(riskyFlows, maxFlows = 10) {
380
+ const flows = riskyFlows.slice(0, maxFlows);
381
+ let output = "# Risky Data Flows Detected\n\n";
382
+ output += `Found ${riskyFlows.length} unsanitized data flows. Showing top ${flows.length}:\n\n`;
383
+ for (const flow of flows) {
384
+ output += `## ${flow.source.type} → ${flow.sink.type} (${flow.riskLevel})\n\n`;
385
+ output += `**Source:** ${flow.source.location.file}:${flow.source.location.line}\n`;
386
+ output += `\`\`\`\n${flow.source.location.snippet || flow.source.variable}\n\`\`\`\n\n`;
387
+ output += `**Sink:** ${flow.sink.location.file}:${flow.sink.location.line}\n`;
388
+ output += `\`\`\`\n${flow.sink.location.snippet || flow.sink.function}\n\`\`\`\n\n`;
389
+ output += `**Risk:** ${flow.description}\n\n---\n\n`;
390
+ }
391
+ return output;
392
+ }
393
+ //# sourceMappingURL=data-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.js","sourceRoot":"","sources":["../../src/analysis/data-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Analysis Module
3
+ *
4
+ * Advanced code analysis capabilities including data flow tracking.
5
+ *
6
+ * @module analysis
7
+ */
8
+ export * from "./data-flow.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Analysis Module
3
+ *
4
+ * Advanced code analysis capabilities including data flow tracking.
5
+ *
6
+ * @module analysis
7
+ */
8
+ export * from "./data-flow.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Badge Service
3
+ *
4
+ * HTTP service for serving certification badges with verification endpoints.
5
+ * Designed for deployment on Vercel/Cloudflare edge with caching.
6
+ *
7
+ * @module badge-service
8
+ */
9
+ import type { CertificationLevel } from "../certification/types.js";
10
+ /**
11
+ * Certification record for badge lookup
12
+ */
13
+ export interface CertificationRecord {
14
+ /** Unique certification ID */
15
+ id: string;
16
+ /** Project identifier (hashed) */
17
+ projectHash: string;
18
+ /** Certification level */
19
+ level: CertificationLevel;
20
+ /** Overall score (0-100) */
21
+ score: number;
22
+ /** When certification was issued */
23
+ issuedAt: string;
24
+ /** Expiration date (30 days from issue) */
25
+ expiresAt: string;
26
+ /** Sigstore bundle for verification */
27
+ sigstoreBundle?: {
28
+ mediaType: string;
29
+ verificationMaterial: Record<string, unknown>;
30
+ messageSignature: Record<string, unknown>;
31
+ };
32
+ /** Rekor transparency log index */
33
+ rekorLogIndex?: number;
34
+ /** Signature URL for verification */
35
+ signatureUrl?: string;
36
+ /** Certificate URL for verification */
37
+ certUrl?: string;
38
+ }
39
+ /**
40
+ * Verification response
41
+ */
42
+ export interface VerificationResponse {
43
+ /** Whether the certification is valid */
44
+ valid: boolean;
45
+ /** Certification ID */
46
+ certificationId: string;
47
+ /** Certification level if valid */
48
+ level?: CertificationLevel;
49
+ /** Score if valid */
50
+ score?: number;
51
+ /** Issue date */
52
+ issuedAt?: string;
53
+ /** Expiration date */
54
+ expiresAt?: string;
55
+ /** Whether it's expired */
56
+ expired?: boolean;
57
+ /** Sigstore bundle if available */
58
+ sigstoreBundle?: CertificationRecord["sigstoreBundle"];
59
+ /** Rekor log index if available */
60
+ rekorLogIndex?: number;
61
+ /** Verification command for CLI */
62
+ verifyCommand?: string;
63
+ /** Error message if invalid */
64
+ error?: string;
65
+ }
66
+ /**
67
+ * Badge embed code formats
68
+ */
69
+ export interface BadgeEmbedCode {
70
+ /** Markdown format */
71
+ markdown: string;
72
+ /** HTML format */
73
+ html: string;
74
+ /** Badge URL */
75
+ url: string;
76
+ /** Verification URL */
77
+ verifyUrl: string;
78
+ }
79
+ /**
80
+ * Interface for certification storage
81
+ */
82
+ export interface CertificationStorage {
83
+ /** Get certification by ID */
84
+ getCertification(id: string): Promise<CertificationRecord | null>;
85
+ /** Store a certification */
86
+ storeCertification(record: CertificationRecord): Promise<void>;
87
+ /** List all certifications */
88
+ listCertifications(): Promise<CertificationRecord[]>;
89
+ }
90
+ /**
91
+ * In-memory storage for development/testing
92
+ */
93
+ export declare class MemoryCertificationStorage implements CertificationStorage {
94
+ private certifications;
95
+ getCertification(id: string): Promise<CertificationRecord | null>;
96
+ storeCertification(record: CertificationRecord): Promise<void>;
97
+ listCertifications(): Promise<CertificationRecord[]>;
98
+ }
99
+ /**
100
+ * Generate an expired/invalid badge SVG
101
+ */
102
+ export declare function generateExpiredBadgeSvg(): string;
103
+ /**
104
+ * Generate a not-found badge SVG
105
+ */
106
+ export declare function generateNotFoundBadgeSvg(): string;
107
+ /**
108
+ * Check if a certification is expired
109
+ */
110
+ export declare function isExpired(cert: CertificationRecord, graceMinutes?: number): boolean;
111
+ /**
112
+ * Add days to a date
113
+ */
114
+ export declare function addDays(dateStr: string, days: number): string;
115
+ /**
116
+ * Generate embed code for a certification badge
117
+ */
118
+ export declare function generateBadgeEmbedCode(certificationId: string, baseUrl?: string): BadgeEmbedCode;
119
+ /**
120
+ * Handle badge SVG request
121
+ */
122
+ export declare function handleBadgeRequest(certId: string, storage: CertificationStorage): Promise<{
123
+ svg: string;
124
+ status: number;
125
+ headers: Record<string, string>;
126
+ }>;
127
+ /**
128
+ * Handle verification request
129
+ */
130
+ export declare function handleVerifyRequest(certId: string, storage: CertificationStorage): Promise<{
131
+ json: VerificationResponse;
132
+ status: number;
133
+ }>;
134
+ /**
135
+ * Handle embed code request
136
+ */
137
+ export declare function handleEmbedRequest(certId: string, storage: CertificationStorage, baseUrl?: string): Promise<{
138
+ json: BadgeEmbedCode | {
139
+ error: string;
140
+ };
141
+ status: number;
142
+ }>;
143
+ export { generateBadgeSvg, generateScoreBadgeSvg, } from "../certification/badge.js";
144
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/badge-service/index.ts"],"names":[],"mappings":"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"}