@oculum/scanner 1.0.13 → 1.0.15

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 (1328) hide show
  1. package/dist/detect/ai-code/index.d.ts +6 -11
  2. package/dist/detect/ai-code/index.d.ts.map +1 -1
  3. package/dist/detect/ai-code/index.js +6 -24
  4. package/dist/detect/ai-code/index.js.map +1 -1
  5. package/dist/detect/ast-rules/agent-tools-ast.d.ts +14 -0
  6. package/dist/detect/ast-rules/agent-tools-ast.d.ts.map +1 -0
  7. package/dist/detect/ast-rules/agent-tools-ast.js +809 -0
  8. package/dist/detect/ast-rules/agent-tools-ast.js.map +1 -0
  9. package/dist/detect/ast-rules/ai-fingerprinting-ast.d.ts +14 -0
  10. package/dist/detect/ast-rules/ai-fingerprinting-ast.d.ts.map +1 -0
  11. package/dist/detect/ast-rules/ai-fingerprinting-ast.js +344 -0
  12. package/dist/detect/ast-rules/ai-fingerprinting-ast.js.map +1 -0
  13. package/dist/detect/ast-rules/auth-patterns-ast.d.ts +14 -0
  14. package/dist/detect/ast-rules/auth-patterns-ast.d.ts.map +1 -0
  15. package/dist/detect/ast-rules/auth-patterns-ast.js +280 -0
  16. package/dist/detect/ast-rules/auth-patterns-ast.js.map +1 -0
  17. package/dist/detect/ast-rules/byok-ast.d.ts +13 -0
  18. package/dist/detect/ast-rules/byok-ast.d.ts.map +1 -0
  19. package/dist/detect/ast-rules/byok-ast.js +180 -0
  20. package/dist/detect/ast-rules/byok-ast.js.map +1 -0
  21. package/dist/detect/ast-rules/child-process-ast.d.ts +13 -0
  22. package/dist/detect/ast-rules/child-process-ast.d.ts.map +1 -0
  23. package/dist/detect/ast-rules/child-process-ast.js +252 -0
  24. package/dist/detect/ast-rules/child-process-ast.js.map +1 -0
  25. package/dist/detect/ast-rules/dangerous-eval-ast.d.ts +13 -0
  26. package/dist/detect/ast-rules/dangerous-eval-ast.d.ts.map +1 -0
  27. package/dist/detect/ast-rules/dangerous-eval-ast.js +218 -0
  28. package/dist/detect/ast-rules/dangerous-eval-ast.js.map +1 -0
  29. package/dist/detect/ast-rules/data-exposure-ast.d.ts +13 -0
  30. package/dist/detect/ast-rules/data-exposure-ast.d.ts.map +1 -0
  31. package/dist/detect/ast-rules/data-exposure-ast.js +158 -0
  32. package/dist/detect/ast-rules/data-exposure-ast.js.map +1 -0
  33. package/dist/detect/ast-rules/dom-xss-ast.d.ts +14 -0
  34. package/dist/detect/ast-rules/dom-xss-ast.d.ts.map +1 -0
  35. package/dist/detect/ast-rules/dom-xss-ast.js +217 -0
  36. package/dist/detect/ast-rules/dom-xss-ast.js.map +1 -0
  37. package/dist/detect/ast-rules/endpoint-protection-ast.d.ts +13 -0
  38. package/dist/detect/ast-rules/endpoint-protection-ast.d.ts.map +1 -0
  39. package/dist/detect/ast-rules/endpoint-protection-ast.js +228 -0
  40. package/dist/detect/ast-rules/endpoint-protection-ast.js.map +1 -0
  41. package/dist/detect/ast-rules/entropy-ast.d.ts +17 -0
  42. package/dist/detect/ast-rules/entropy-ast.d.ts.map +1 -0
  43. package/dist/detect/ast-rules/entropy-ast.js +265 -0
  44. package/dist/detect/ast-rules/entropy-ast.js.map +1 -0
  45. package/dist/detect/ast-rules/flask-debug-ast.d.ts +10 -0
  46. package/dist/detect/ast-rules/flask-debug-ast.d.ts.map +1 -0
  47. package/dist/detect/ast-rules/flask-debug-ast.js +125 -0
  48. package/dist/detect/ast-rules/flask-debug-ast.js.map +1 -0
  49. package/dist/detect/ast-rules/framework-checks-ast.d.ts +13 -0
  50. package/dist/detect/ast-rules/framework-checks-ast.d.ts.map +1 -0
  51. package/dist/detect/ast-rules/framework-checks-ast.js +185 -0
  52. package/dist/detect/ast-rules/framework-checks-ast.js.map +1 -0
  53. package/dist/detect/ast-rules/helpers/call-analysis.d.ts +62 -0
  54. package/dist/detect/ast-rules/helpers/call-analysis.d.ts.map +1 -0
  55. package/dist/detect/ast-rules/helpers/call-analysis.js +217 -0
  56. package/dist/detect/ast-rules/helpers/call-analysis.js.map +1 -0
  57. package/dist/detect/ast-rules/helpers/context-detection.d.ts +33 -0
  58. package/dist/detect/ast-rules/helpers/context-detection.d.ts.map +1 -0
  59. package/dist/detect/ast-rules/helpers/context-detection.js +256 -0
  60. package/dist/detect/ast-rules/helpers/context-detection.js.map +1 -0
  61. package/dist/detect/ast-rules/helpers/control-flow.d.ts +40 -0
  62. package/dist/detect/ast-rules/helpers/control-flow.d.ts.map +1 -0
  63. package/dist/detect/ast-rules/helpers/control-flow.js +174 -0
  64. package/dist/detect/ast-rules/helpers/control-flow.js.map +1 -0
  65. package/dist/detect/ast-rules/helpers/import-analysis.d.ts +43 -0
  66. package/dist/detect/ast-rules/helpers/import-analysis.d.ts.map +1 -0
  67. package/dist/detect/ast-rules/helpers/import-analysis.js +149 -0
  68. package/dist/detect/ast-rules/helpers/import-analysis.js.map +1 -0
  69. package/dist/detect/ast-rules/helpers/index.d.ts +16 -0
  70. package/dist/detect/ast-rules/helpers/index.d.ts.map +1 -0
  71. package/dist/detect/ast-rules/helpers/index.js +112 -0
  72. package/dist/detect/ast-rules/helpers/index.js.map +1 -0
  73. package/dist/detect/ast-rules/helpers/python-helpers.d.ts +215 -0
  74. package/dist/detect/ast-rules/helpers/python-helpers.d.ts.map +1 -0
  75. package/dist/detect/ast-rules/helpers/python-helpers.js +935 -0
  76. package/dist/detect/ast-rules/helpers/python-helpers.js.map +1 -0
  77. package/dist/detect/ast-rules/helpers/scope-analysis.d.ts +50 -0
  78. package/dist/detect/ast-rules/helpers/scope-analysis.d.ts.map +1 -0
  79. package/dist/detect/ast-rules/helpers/scope-analysis.js +194 -0
  80. package/dist/detect/ast-rules/helpers/scope-analysis.js.map +1 -0
  81. package/dist/detect/ast-rules/helpers/string-analysis.d.ts +57 -0
  82. package/dist/detect/ast-rules/helpers/string-analysis.d.ts.map +1 -0
  83. package/dist/detect/ast-rules/helpers/string-analysis.js +184 -0
  84. package/dist/detect/ast-rules/helpers/string-analysis.js.map +1 -0
  85. package/dist/detect/ast-rules/helpers/type-extraction.d.ts +44 -0
  86. package/dist/detect/ast-rules/helpers/type-extraction.d.ts.map +1 -0
  87. package/dist/detect/ast-rules/helpers/type-extraction.js +125 -0
  88. package/dist/detect/ast-rules/helpers/type-extraction.js.map +1 -0
  89. package/dist/detect/ast-rules/helpers/user-input.d.ts +35 -0
  90. package/dist/detect/ast-rules/helpers/user-input.d.ts.map +1 -0
  91. package/dist/detect/ast-rules/helpers/user-input.js +243 -0
  92. package/dist/detect/ast-rules/helpers/user-input.js.map +1 -0
  93. package/dist/detect/ast-rules/index.d.ts +112 -0
  94. package/dist/detect/ast-rules/index.d.ts.map +1 -0
  95. package/dist/detect/ast-rules/index.js +232 -0
  96. package/dist/detect/ast-rules/index.js.map +1 -0
  97. package/dist/detect/ast-rules/json-parse-ast.d.ts +13 -0
  98. package/dist/detect/ast-rules/json-parse-ast.d.ts.map +1 -0
  99. package/dist/detect/ast-rules/json-parse-ast.js +143 -0
  100. package/dist/detect/ast-rules/json-parse-ast.js.map +1 -0
  101. package/dist/detect/ast-rules/log-injection-ast.d.ts +14 -0
  102. package/dist/detect/ast-rules/log-injection-ast.d.ts.map +1 -0
  103. package/dist/detect/ast-rules/log-injection-ast.js +235 -0
  104. package/dist/detect/ast-rules/log-injection-ast.js.map +1 -0
  105. package/dist/detect/ast-rules/logic-gates-ast.d.ts +14 -0
  106. package/dist/detect/ast-rules/logic-gates-ast.d.ts.map +1 -0
  107. package/dist/detect/ast-rules/logic-gates-ast.js +312 -0
  108. package/dist/detect/ast-rules/logic-gates-ast.js.map +1 -0
  109. package/dist/detect/ast-rules/mcp-security-ast.d.ts +14 -0
  110. package/dist/detect/ast-rules/mcp-security-ast.d.ts.map +1 -0
  111. package/dist/detect/ast-rules/mcp-security-ast.js +755 -0
  112. package/dist/detect/ast-rules/mcp-security-ast.js.map +1 -0
  113. package/dist/detect/ast-rules/model-supply-chain-ast.d.ts +13 -0
  114. package/dist/detect/ast-rules/model-supply-chain-ast.d.ts.map +1 -0
  115. package/dist/detect/ast-rules/model-supply-chain-ast.js +188 -0
  116. package/dist/detect/ast-rules/model-supply-chain-ast.js.map +1 -0
  117. package/dist/detect/ast-rules/package-hallucination-ast.d.ts +13 -0
  118. package/dist/detect/ast-rules/package-hallucination-ast.d.ts.map +1 -0
  119. package/dist/detect/ast-rules/package-hallucination-ast.js +607 -0
  120. package/dist/detect/ast-rules/package-hallucination-ast.js.map +1 -0
  121. package/dist/detect/ast-rules/prompt-hygiene-ast.d.ts +15 -0
  122. package/dist/detect/ast-rules/prompt-hygiene-ast.d.ts.map +1 -0
  123. package/dist/detect/ast-rules/prompt-hygiene-ast.js +332 -0
  124. package/dist/detect/ast-rules/prompt-hygiene-ast.js.map +1 -0
  125. package/dist/detect/ast-rules/rag-safety-ast.d.ts +18 -0
  126. package/dist/detect/ast-rules/rag-safety-ast.d.ts.map +1 -0
  127. package/dist/detect/ast-rules/rag-safety-ast.js +640 -0
  128. package/dist/detect/ast-rules/rag-safety-ast.js.map +1 -0
  129. package/dist/detect/ast-rules/request-validation-ast.d.ts +13 -0
  130. package/dist/detect/ast-rules/request-validation-ast.d.ts.map +1 -0
  131. package/dist/detect/ast-rules/request-validation-ast.js +116 -0
  132. package/dist/detect/ast-rules/request-validation-ast.js.map +1 -0
  133. package/dist/detect/ast-rules/risky-imports-ast.d.ts +14 -0
  134. package/dist/detect/ast-rules/risky-imports-ast.d.ts.map +1 -0
  135. package/dist/detect/ast-rules/risky-imports-ast.js +114 -0
  136. package/dist/detect/ast-rules/risky-imports-ast.js.map +1 -0
  137. package/dist/detect/ast-rules/schema-validation-ast.d.ts +14 -0
  138. package/dist/detect/ast-rules/schema-validation-ast.d.ts.map +1 -0
  139. package/dist/detect/ast-rules/schema-validation-ast.js +233 -0
  140. package/dist/detect/ast-rules/schema-validation-ast.js.map +1 -0
  141. package/dist/detect/ast-rules/secret-patterns-ast.d.ts +17 -0
  142. package/dist/detect/ast-rules/secret-patterns-ast.d.ts.map +1 -0
  143. package/dist/detect/ast-rules/secret-patterns-ast.js +199 -0
  144. package/dist/detect/ast-rules/secret-patterns-ast.js.map +1 -0
  145. package/dist/detect/ast-rules/security-headers-ast.d.ts +14 -0
  146. package/dist/detect/ast-rules/security-headers-ast.d.ts.map +1 -0
  147. package/dist/detect/ast-rules/security-headers-ast.js +187 -0
  148. package/dist/detect/ast-rules/security-headers-ast.js.map +1 -0
  149. package/dist/detect/ast-rules/sql-injection-ast.d.ts +17 -0
  150. package/dist/detect/ast-rules/sql-injection-ast.d.ts.map +1 -0
  151. package/dist/detect/ast-rules/sql-injection-ast.js +497 -0
  152. package/dist/detect/ast-rules/sql-injection-ast.js.map +1 -0
  153. package/dist/detect/ast-rules/ssrf-ast.d.ts +14 -0
  154. package/dist/detect/ast-rules/ssrf-ast.d.ts.map +1 -0
  155. package/dist/detect/ast-rules/ssrf-ast.js +573 -0
  156. package/dist/detect/ast-rules/ssrf-ast.js.map +1 -0
  157. package/dist/detect/ast-rules/taint-fix-templates.d.ts +18 -0
  158. package/dist/detect/ast-rules/taint-fix-templates.d.ts.map +1 -0
  159. package/dist/detect/ast-rules/taint-fix-templates.js +92 -0
  160. package/dist/detect/ast-rules/taint-fix-templates.js.map +1 -0
  161. package/dist/detect/ast-rules/taint-flow-ast.d.ts +24 -0
  162. package/dist/detect/ast-rules/taint-flow-ast.d.ts.map +1 -0
  163. package/dist/detect/ast-rules/taint-flow-ast.js +340 -0
  164. package/dist/detect/ast-rules/taint-flow-ast.js.map +1 -0
  165. package/dist/detect/ast-rules/variables-ast.d.ts +24 -0
  166. package/dist/detect/ast-rules/variables-ast.d.ts.map +1 -0
  167. package/dist/detect/ast-rules/variables-ast.js +362 -0
  168. package/dist/detect/ast-rules/variables-ast.js.map +1 -0
  169. package/dist/detect/ast-rules/weak-crypto-ast.d.ts +15 -0
  170. package/dist/detect/ast-rules/weak-crypto-ast.d.ts.map +1 -0
  171. package/dist/detect/ast-rules/weak-crypto-ast.js +406 -0
  172. package/dist/detect/ast-rules/weak-crypto-ast.js.map +1 -0
  173. package/dist/detect/ast-rules/xxe-ast.d.ts +13 -0
  174. package/dist/detect/ast-rules/xxe-ast.d.ts.map +1 -0
  175. package/dist/detect/ast-rules/xxe-ast.js +157 -0
  176. package/dist/detect/ast-rules/xxe-ast.js.map +1 -0
  177. package/dist/detect/config/agent-skill-injection.d.ts.map +1 -1
  178. package/dist/detect/config/agent-skill-injection.js +2 -24
  179. package/dist/detect/config/agent-skill-injection.js.map +1 -1
  180. package/dist/detect/config/index.d.ts +1 -0
  181. package/dist/detect/config/index.d.ts.map +1 -1
  182. package/dist/detect/config/index.js +3 -1
  183. package/dist/detect/config/index.js.map +1 -1
  184. package/dist/detect/config/osv-check.d.ts.map +1 -1
  185. package/dist/detect/config/osv-check.js +6 -1
  186. package/dist/detect/config/osv-check.js.map +1 -1
  187. package/dist/detect/config/package-check.d.ts.map +1 -1
  188. package/dist/detect/config/package-check.js +6 -1
  189. package/dist/detect/config/package-check.js.map +1 -1
  190. package/dist/detect/config/rules-file-backdoor.d.ts +36 -0
  191. package/dist/detect/config/rules-file-backdoor.d.ts.map +1 -0
  192. package/dist/detect/config/rules-file-backdoor.js +379 -0
  193. package/dist/detect/config/rules-file-backdoor.js.map +1 -0
  194. package/dist/detect/index.d.ts +43 -6
  195. package/dist/detect/index.d.ts.map +1 -1
  196. package/dist/detect/index.js +70 -7
  197. package/dist/detect/index.js.map +1 -1
  198. package/dist/detect/secrets/config-audit.d.ts +5 -0
  199. package/dist/detect/secrets/config-audit.d.ts.map +1 -1
  200. package/dist/detect/secrets/config-audit.js +131 -3
  201. package/dist/detect/secrets/config-audit.js.map +1 -1
  202. package/dist/detect/secrets/entropy.d.ts.map +1 -1
  203. package/dist/detect/secrets/entropy.js +180 -0
  204. package/dist/detect/secrets/entropy.js.map +1 -1
  205. package/dist/detect/secrets/index.d.ts +0 -2
  206. package/dist/detect/secrets/index.d.ts.map +1 -1
  207. package/dist/detect/secrets/index.js +7 -17
  208. package/dist/detect/secrets/index.js.map +1 -1
  209. package/dist/detect/structural/index.d.ts +15 -28
  210. package/dist/detect/structural/index.d.ts.map +1 -1
  211. package/dist/detect/structural/index.js +20 -497
  212. package/dist/detect/structural/index.js.map +1 -1
  213. package/dist/index.d.ts +3 -0
  214. package/dist/index.d.ts.map +1 -1
  215. package/dist/index.js +9 -1
  216. package/dist/index.js.map +1 -1
  217. package/dist/model/auth-helper-detector.d.ts.map +1 -1
  218. package/dist/model/auth-helper-detector.js +2 -7
  219. package/dist/model/auth-helper-detector.js.map +1 -1
  220. package/dist/model/import-resolver.d.ts.map +1 -1
  221. package/dist/model/import-resolver.js +94 -0
  222. package/dist/model/import-resolver.js.map +1 -1
  223. package/dist/model/imported-auth-detector.js +8 -8
  224. package/dist/model/imported-auth-detector.js.map +1 -1
  225. package/dist/model/index.d.ts +8 -0
  226. package/dist/model/index.d.ts.map +1 -1
  227. package/dist/model/index.js +198 -73
  228. package/dist/model/index.js.map +1 -1
  229. package/dist/model/module-graph.d.ts.map +1 -1
  230. package/dist/model/module-graph.js +22 -9
  231. package/dist/model/module-graph.js.map +1 -1
  232. package/dist/model/project-context.d.ts +1 -1
  233. package/dist/model/project-context.d.ts.map +1 -1
  234. package/dist/model/project-context.js +34 -0
  235. package/dist/model/project-context.js.map +1 -1
  236. package/dist/model/route-auth-resolver.d.ts.map +1 -1
  237. package/dist/model/route-auth-resolver.js +17 -2
  238. package/dist/model/route-auth-resolver.js.map +1 -1
  239. package/dist/model/route-discovery/index.js +1 -1
  240. package/dist/model/route-discovery/index.js.map +1 -1
  241. package/dist/model/route-discovery/nextjs.js +1 -1
  242. package/dist/model/route-discovery/nextjs.js.map +1 -1
  243. package/dist/model/route-discovery/python.d.ts +6 -3
  244. package/dist/model/route-discovery/python.d.ts.map +1 -1
  245. package/dist/model/route-discovery/python.js +132 -9
  246. package/dist/model/route-discovery/python.js.map +1 -1
  247. package/dist/model/route-discovery/types.d.ts +1 -1
  248. package/dist/model/route-discovery/types.d.ts.map +1 -1
  249. package/dist/model/route-discovery/utils.d.ts +8 -0
  250. package/dist/model/route-discovery/utils.d.ts.map +1 -1
  251. package/dist/model/route-discovery/utils.js +70 -0
  252. package/dist/model/route-discovery/utils.js.map +1 -1
  253. package/dist/model/taint-types.d.ts +0 -4
  254. package/dist/model/taint-types.d.ts.map +1 -1
  255. package/dist/parse/ast.d.ts +58 -0
  256. package/dist/parse/ast.d.ts.map +1 -0
  257. package/dist/parse/ast.js +230 -0
  258. package/dist/parse/ast.js.map +1 -0
  259. package/dist/parse/call-graph.d.ts +41 -0
  260. package/dist/parse/call-graph.d.ts.map +1 -0
  261. package/dist/parse/call-graph.js +386 -0
  262. package/dist/parse/call-graph.js.map +1 -0
  263. package/dist/parse/file-classifier.d.ts +11 -0
  264. package/dist/parse/file-classifier.d.ts.map +1 -1
  265. package/dist/parse/file-classifier.js +63 -15
  266. package/dist/parse/file-classifier.js.map +1 -1
  267. package/dist/parse/node-index.d.ts +32 -0
  268. package/dist/parse/node-index.d.ts.map +1 -0
  269. package/dist/parse/node-index.js +103 -0
  270. package/dist/parse/node-index.js.map +1 -0
  271. package/dist/parse/type-extractor.d.ts +50 -0
  272. package/dist/parse/type-extractor.d.ts.map +1 -0
  273. package/dist/parse/type-extractor.js +243 -0
  274. package/dist/parse/type-extractor.js.map +1 -0
  275. package/dist/pipeline/config.d.ts +10 -2
  276. package/dist/pipeline/config.d.ts.map +1 -1
  277. package/dist/pipeline/config.js.map +1 -1
  278. package/dist/pipeline/index.d.ts +3 -3
  279. package/dist/pipeline/index.d.ts.map +1 -1
  280. package/dist/pipeline/index.js +214 -65
  281. package/dist/pipeline/index.js.map +1 -1
  282. package/dist/pipeline/modes/incremental.d.ts.map +1 -1
  283. package/dist/pipeline/modes/incremental.js +2 -7
  284. package/dist/pipeline/modes/incremental.js.map +1 -1
  285. package/dist/postprocess/dedup.d.ts +5 -2
  286. package/dist/postprocess/dedup.d.ts.map +1 -1
  287. package/dist/postprocess/dedup.js +47 -16
  288. package/dist/postprocess/dedup.js.map +1 -1
  289. package/dist/report/build-result.d.ts +9 -4
  290. package/dist/report/build-result.d.ts.map +1 -1
  291. package/dist/report/build-result.js +15 -4
  292. package/dist/report/build-result.js.map +1 -1
  293. package/dist/report/formatters/cli-terminal.d.ts +1 -1
  294. package/dist/report/formatters/cli-terminal.d.ts.map +1 -1
  295. package/dist/report/formatters/cli-terminal.js +434 -231
  296. package/dist/report/formatters/cli-terminal.js.map +1 -1
  297. package/dist/report/sanitize.d.ts +10 -0
  298. package/dist/report/sanitize.d.ts.map +1 -0
  299. package/dist/report/sanitize.js +19 -0
  300. package/dist/report/sanitize.js.map +1 -0
  301. package/dist/score/adjustments.d.ts +20 -2
  302. package/dist/score/adjustments.d.ts.map +1 -1
  303. package/dist/score/adjustments.js +108 -37
  304. package/dist/score/adjustments.js.map +1 -1
  305. package/dist/score/confidence.d.ts +6 -0
  306. package/dist/score/confidence.d.ts.map +1 -1
  307. package/dist/score/confidence.js +10 -4
  308. package/dist/score/confidence.js.map +1 -1
  309. package/dist/score/evidence.d.ts +25 -0
  310. package/dist/score/evidence.d.ts.map +1 -0
  311. package/dist/score/evidence.js +51 -0
  312. package/dist/score/evidence.js.map +1 -0
  313. package/dist/score/index.d.ts +3 -1
  314. package/dist/score/index.d.ts.map +1 -1
  315. package/dist/score/index.js +25 -50
  316. package/dist/score/index.js.map +1 -1
  317. package/dist/score/types.d.ts +5 -1
  318. package/dist/score/types.d.ts.map +1 -1
  319. package/dist/shared/category-filter.d.ts.map +1 -1
  320. package/dist/shared/category-filter.js +12 -0
  321. package/dist/shared/category-filter.js.map +1 -1
  322. package/dist/shared/regex-utils.d.ts +3 -0
  323. package/dist/shared/regex-utils.d.ts.map +1 -0
  324. package/dist/shared/regex-utils.js +8 -0
  325. package/dist/shared/regex-utils.js.map +1 -0
  326. package/dist/shared/registry-clients.d.ts +7 -0
  327. package/dist/shared/registry-clients.d.ts.map +1 -1
  328. package/dist/shared/registry-clients.js +94 -17
  329. package/dist/shared/registry-clients.js.map +1 -1
  330. package/dist/shared/rules/metadata.d.ts.map +1 -1
  331. package/dist/shared/rules/metadata.js +17 -0
  332. package/dist/shared/rules/metadata.js.map +1 -1
  333. package/dist/shared/types.d.ts +60 -16
  334. package/dist/shared/types.d.ts.map +1 -1
  335. package/dist/shared/types.js +38 -21
  336. package/dist/shared/types.js.map +1 -1
  337. package/dist/taint/async-flow.d.ts +44 -0
  338. package/dist/taint/async-flow.d.ts.map +1 -0
  339. package/dist/taint/async-flow.js +271 -0
  340. package/dist/taint/async-flow.js.map +1 -0
  341. package/dist/taint/cfg-builder.d.ts +35 -0
  342. package/dist/taint/cfg-builder.d.ts.map +1 -0
  343. package/dist/taint/cfg-builder.js +980 -0
  344. package/dist/taint/cfg-builder.js.map +1 -0
  345. package/dist/taint/cfg-types.d.ts +76 -0
  346. package/dist/taint/cfg-types.d.ts.map +1 -0
  347. package/dist/taint/cfg-types.js +13 -0
  348. package/dist/taint/cfg-types.js.map +1 -0
  349. package/dist/taint/constant-propagation.d.ts +34 -0
  350. package/dist/taint/constant-propagation.d.ts.map +1 -0
  351. package/dist/taint/constant-propagation.js +164 -0
  352. package/dist/taint/constant-propagation.js.map +1 -0
  353. package/dist/taint/cross-file-analyzer.d.ts +27 -0
  354. package/dist/taint/cross-file-analyzer.d.ts.map +1 -0
  355. package/dist/taint/cross-file-analyzer.js +99 -0
  356. package/dist/taint/cross-file-analyzer.js.map +1 -0
  357. package/dist/taint/cross-file-index.d.ts +59 -0
  358. package/dist/taint/cross-file-index.d.ts.map +1 -0
  359. package/dist/taint/cross-file-index.js +183 -0
  360. package/dist/taint/cross-file-index.js.map +1 -0
  361. package/dist/taint/def-use.d.ts +27 -0
  362. package/dist/taint/def-use.d.ts.map +1 -0
  363. package/dist/taint/def-use.js +519 -0
  364. package/dist/taint/def-use.js.map +1 -0
  365. package/dist/taint/file-analysis-cache.d.ts +47 -0
  366. package/dist/taint/file-analysis-cache.d.ts.map +1 -0
  367. package/dist/taint/file-analysis-cache.js +107 -0
  368. package/dist/taint/file-analysis-cache.js.map +1 -0
  369. package/dist/taint/framework-models.d.ts +77 -0
  370. package/dist/taint/framework-models.d.ts.map +1 -0
  371. package/dist/taint/framework-models.js +258 -0
  372. package/dist/taint/framework-models.js.map +1 -0
  373. package/dist/taint/helpers.d.ts +31 -0
  374. package/dist/taint/helpers.d.ts.map +1 -0
  375. package/dist/taint/helpers.js +130 -0
  376. package/dist/taint/helpers.js.map +1 -0
  377. package/dist/taint/index.d.ts +28 -0
  378. package/dist/taint/index.d.ts.map +1 -0
  379. package/dist/taint/index.js +77 -0
  380. package/dist/taint/index.js.map +1 -0
  381. package/dist/taint/llm-registry.d.ts +47 -0
  382. package/dist/taint/llm-registry.d.ts.map +1 -0
  383. package/dist/taint/llm-registry.js +152 -0
  384. package/dist/taint/llm-registry.js.map +1 -0
  385. package/dist/taint/llm-risk-scoring.d.ts +54 -0
  386. package/dist/taint/llm-risk-scoring.d.ts.map +1 -0
  387. package/dist/taint/llm-risk-scoring.js +376 -0
  388. package/dist/taint/llm-risk-scoring.js.map +1 -0
  389. package/dist/taint/propagation-types.d.ts +104 -0
  390. package/dist/taint/propagation-types.d.ts.map +1 -0
  391. package/dist/taint/propagation-types.js +98 -0
  392. package/dist/taint/propagation-types.js.map +1 -0
  393. package/dist/taint/propagation.d.ts +111 -0
  394. package/dist/taint/propagation.d.ts.map +1 -0
  395. package/dist/taint/propagation.js +1576 -0
  396. package/dist/taint/propagation.js.map +1 -0
  397. package/dist/taint/sanitizer-registry.d.ts +26 -0
  398. package/dist/taint/sanitizer-registry.d.ts.map +1 -0
  399. package/dist/taint/sanitizer-registry.js +422 -0
  400. package/dist/taint/sanitizer-registry.js.map +1 -0
  401. package/dist/taint/sink-classifier.d.ts +27 -0
  402. package/dist/taint/sink-classifier.d.ts.map +1 -0
  403. package/dist/taint/sink-classifier.js +1166 -0
  404. package/dist/taint/sink-classifier.js.map +1 -0
  405. package/dist/taint/source-classifier.d.ts +29 -0
  406. package/dist/taint/source-classifier.d.ts.map +1 -0
  407. package/dist/taint/source-classifier.js +814 -0
  408. package/dist/taint/source-classifier.js.map +1 -0
  409. package/dist/taint/taint-analyzer.d.ts +33 -0
  410. package/dist/taint/taint-analyzer.d.ts.map +1 -0
  411. package/dist/taint/taint-analyzer.js +88 -0
  412. package/dist/taint/taint-analyzer.js.map +1 -0
  413. package/dist/taint/taint-summary.d.ts +37 -0
  414. package/dist/taint/taint-summary.d.ts.map +1 -0
  415. package/dist/taint/taint-summary.js +293 -0
  416. package/dist/taint/taint-summary.js.map +1 -0
  417. package/dist/taint/types.d.ts +47 -0
  418. package/dist/taint/types.d.ts.map +1 -0
  419. package/dist/taint/types.js +19 -0
  420. package/dist/taint/types.js.map +1 -0
  421. package/dist/tiers.d.ts +2 -2
  422. package/dist/tiers.js +1 -1
  423. package/dist/validate/clients.d.ts +2 -1
  424. package/dist/validate/clients.d.ts.map +1 -1
  425. package/dist/validate/clients.js +3 -2
  426. package/dist/validate/clients.js.map +1 -1
  427. package/dist/validate/index.d.ts +5 -6
  428. package/dist/validate/index.d.ts.map +1 -1
  429. package/dist/validate/index.js +22 -21
  430. package/dist/validate/index.js.map +1 -1
  431. package/dist/validate/prompts/modules/ai-patterns.d.ts +1 -1
  432. package/dist/validate/prompts/modules/ai-patterns.d.ts.map +1 -1
  433. package/dist/validate/prompts/modules/ai-patterns.js +16 -0
  434. package/dist/validate/prompts/modules/ai-patterns.js.map +1 -1
  435. package/dist/validate/prompts/modules/common.d.ts +1 -1
  436. package/dist/validate/prompts/modules/common.d.ts.map +1 -1
  437. package/dist/validate/prompts/modules/common.js +12 -3
  438. package/dist/validate/prompts/modules/common.js.map +1 -1
  439. package/dist/validate/providers/anthropic.d.ts +4 -4
  440. package/dist/validate/providers/anthropic.d.ts.map +1 -1
  441. package/dist/validate/providers/anthropic.js +85 -58
  442. package/dist/validate/providers/anthropic.js.map +1 -1
  443. package/dist/validate/providers/openai.d.ts +4 -4
  444. package/dist/validate/providers/openai.d.ts.map +1 -1
  445. package/dist/validate/providers/openai.js +149 -99
  446. package/dist/validate/providers/openai.js.map +1 -1
  447. package/dist/validate/request-builder.d.ts +2 -8
  448. package/dist/validate/request-builder.d.ts.map +1 -1
  449. package/dist/validate/request-builder.js +4 -34
  450. package/dist/validate/request-builder.js.map +1 -1
  451. package/dist/validate/types.d.ts +9 -0
  452. package/dist/validate/types.d.ts.map +1 -1
  453. package/dist/validate/types.js.map +1 -1
  454. package/dist/validate/utils/path-helpers.js +2 -2
  455. package/dist/validate/utils/path-helpers.js.map +1 -1
  456. package/dist/validate/utils/response-parser.d.ts +10 -0
  457. package/dist/validate/utils/response-parser.d.ts.map +1 -1
  458. package/dist/validate/utils/response-parser.js +21 -2
  459. package/dist/validate/utils/response-parser.js.map +1 -1
  460. package/dist/validate/utils/retry.d.ts.map +1 -1
  461. package/dist/validate/utils/retry.js +19 -4
  462. package/dist/validate/utils/retry.js.map +1 -1
  463. package/package.json +7 -4
  464. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1 -1
  465. package/src/__tests__/benchmark/planted-benchmark.test.ts +337 -0
  466. package/src/__tests__/benchmark/utils/test-runner.ts +38 -4
  467. package/src/__tests__/category-filter.test.ts +5 -1
  468. package/src/__tests__/context-engine/route-discovery/python.test.ts +726 -0
  469. package/src/__tests__/detect/ast-rules.test.ts +1043 -0
  470. package/src/__tests__/detect/offline-mode.test.ts +147 -0
  471. package/src/__tests__/detect/postinstall-enrichment.test.ts +300 -0
  472. package/src/__tests__/detect/python-ast-rules.test.ts +569 -0
  473. package/src/__tests__/detect/python-helpers.test.ts +536 -0
  474. package/src/__tests__/detect/python-sast-rules.test.ts +453 -0
  475. package/src/__tests__/detect/rules-file-backdoor-decoders.test.ts +151 -0
  476. package/src/__tests__/detect/rules-file-backdoor.test.ts +284 -0
  477. package/src/__tests__/detect/taint-fix-templates.test.ts +150 -0
  478. package/src/__tests__/detect/taint-path-serialization.test.ts +170 -0
  479. package/src/__tests__/parse/call-graph.test.ts +300 -0
  480. package/src/__tests__/parse/python-parser.test.ts +274 -0
  481. package/src/__tests__/regression/known-false-positives.test.ts +491 -9
  482. package/src/__tests__/regression/rules-file-backdoor.test.ts +137 -0
  483. package/src/__tests__/score/adjustments.test.ts +34 -16
  484. package/src/__tests__/score/confidence.test.ts +84 -57
  485. package/src/__tests__/score/evidence-scoring.test.ts +249 -0
  486. package/src/__tests__/score/evidence.test.ts +144 -0
  487. package/src/__tests__/score/scoring-integration.test.ts +56 -34
  488. package/src/__tests__/score/taint-adjustments.test.ts +14 -228
  489. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +65 -59
  490. package/src/__tests__/snapshots/scan-depth.test.ts +39 -7
  491. package/src/__tests__/taint/async-flow.test.ts +247 -0
  492. package/src/__tests__/taint/cfg-builder.test.ts +835 -0
  493. package/src/__tests__/taint/constant-propagation.test.ts +302 -0
  494. package/src/__tests__/taint/cross-file-index.test.ts +683 -0
  495. package/src/__tests__/taint/cross-file-integration.test.ts +275 -0
  496. package/src/__tests__/taint/cross-file-propagation.test.ts +910 -0
  497. package/src/__tests__/taint/def-use.test.ts +132 -0
  498. package/src/__tests__/taint/field-sensitive-sinks.test.ts +179 -0
  499. package/src/__tests__/taint/field-sensitivity.test.ts +342 -0
  500. package/src/__tests__/taint/file-analysis-cache.test.ts +290 -0
  501. package/src/__tests__/taint/framework-models.test.ts +227 -0
  502. package/src/__tests__/taint/llm-flow-graph.test.ts +850 -0
  503. package/src/__tests__/taint/llm-risk-scoring.test.ts +439 -0
  504. package/src/__tests__/taint/performance-parity.test.ts +315 -0
  505. package/src/__tests__/taint/propagation.test.ts +621 -0
  506. package/src/__tests__/taint/python-cross-file.test.ts +494 -0
  507. package/src/__tests__/taint/python-taint.test.ts +1344 -0
  508. package/src/__tests__/taint/sanitizer-registry.test.ts +304 -0
  509. package/src/__tests__/taint/sanitizer-regression.test.ts +111 -0
  510. package/src/__tests__/taint/sink-classifier.test.ts +537 -0
  511. package/src/__tests__/taint/source-classifier.test.ts +367 -0
  512. package/src/__tests__/taint/taint-pipeline.test.ts +418 -0
  513. package/src/__tests__/taint/taint-smoke.test.ts +400 -0
  514. package/src/__tests__/taint/taint-summary.test.ts +472 -0
  515. package/src/detect/ai-code/index.ts +6 -11
  516. package/src/detect/ast-rules/agent-tools-ast.ts +861 -0
  517. package/src/detect/ast-rules/ai-fingerprinting-ast.ts +451 -0
  518. package/src/detect/ast-rules/auth-patterns-ast.ts +304 -0
  519. package/src/detect/ast-rules/byok-ast.ts +195 -0
  520. package/src/detect/ast-rules/child-process-ast.ts +276 -0
  521. package/src/detect/ast-rules/dangerous-eval-ast.ts +227 -0
  522. package/src/detect/ast-rules/data-exposure-ast.ts +162 -0
  523. package/src/detect/ast-rules/dom-xss-ast.ts +260 -0
  524. package/src/detect/ast-rules/endpoint-protection-ast.ts +231 -0
  525. package/src/detect/ast-rules/entropy-ast.ts +268 -0
  526. package/src/detect/ast-rules/flask-debug-ast.ts +148 -0
  527. package/src/detect/ast-rules/framework-checks-ast.ts +200 -0
  528. package/src/detect/ast-rules/helpers/call-analysis.ts +256 -0
  529. package/src/detect/ast-rules/helpers/context-detection.ts +277 -0
  530. package/src/detect/ast-rules/helpers/control-flow.ts +179 -0
  531. package/src/detect/ast-rules/helpers/import-analysis.ts +185 -0
  532. package/src/detect/ast-rules/helpers/index.ts +133 -0
  533. package/src/detect/ast-rules/helpers/python-helpers.ts +1054 -0
  534. package/src/detect/ast-rules/helpers/scope-analysis.ts +224 -0
  535. package/src/detect/ast-rules/helpers/string-analysis.ts +215 -0
  536. package/src/detect/ast-rules/helpers/type-extraction.ts +138 -0
  537. package/src/detect/ast-rules/helpers/user-input.ts +256 -0
  538. package/src/detect/ast-rules/index.ts +311 -0
  539. package/src/detect/ast-rules/json-parse-ast.ts +162 -0
  540. package/src/detect/ast-rules/log-injection-ast.ts +243 -0
  541. package/src/detect/ast-rules/logic-gates-ast.ts +343 -0
  542. package/src/detect/ast-rules/mcp-security-ast.ts +808 -0
  543. package/src/detect/ast-rules/model-supply-chain-ast.ts +202 -0
  544. package/src/detect/ast-rules/package-hallucination-ast.ts +664 -0
  545. package/src/detect/ast-rules/prompt-hygiene-ast.ts +329 -0
  546. package/src/detect/ast-rules/rag-safety-ast.ts +689 -0
  547. package/src/detect/ast-rules/request-validation-ast.ts +122 -0
  548. package/src/detect/ast-rules/risky-imports-ast.ts +133 -0
  549. package/src/detect/ast-rules/schema-validation-ast.ts +244 -0
  550. package/src/detect/ast-rules/secret-patterns-ast.ts +223 -0
  551. package/src/detect/ast-rules/security-headers-ast.ts +206 -0
  552. package/src/detect/ast-rules/sql-injection-ast.ts +614 -0
  553. package/src/detect/ast-rules/ssrf-ast.ts +601 -0
  554. package/src/detect/ast-rules/taint-fix-templates.ts +108 -0
  555. package/src/detect/ast-rules/taint-flow-ast.ts +416 -0
  556. package/src/detect/ast-rules/variables-ast.ts +446 -0
  557. package/src/detect/ast-rules/weak-crypto-ast.ts +441 -0
  558. package/src/detect/ast-rules/xxe-ast.ts +184 -0
  559. package/src/detect/config/agent-skill-injection.ts +2 -24
  560. package/src/detect/config/index.ts +1 -0
  561. package/src/detect/config/osv-check.ts +6 -1
  562. package/src/detect/config/package-check.ts +6 -1
  563. package/src/detect/config/rules-file-backdoor.ts +438 -0
  564. package/src/detect/index.ts +146 -52
  565. package/src/detect/secrets/config-audit.ts +148 -3
  566. package/src/detect/secrets/entropy.ts +195 -0
  567. package/src/detect/secrets/index.ts +7 -16
  568. package/src/detect/structural/index.ts +23 -566
  569. package/src/index.ts +7 -0
  570. package/src/model/auth-helper-detector.ts +1 -7
  571. package/src/model/import-resolver.ts +104 -0
  572. package/src/model/imported-auth-detector.ts +1 -1
  573. package/src/model/index.ts +240 -80
  574. package/src/model/module-graph.ts +17 -5
  575. package/src/model/project-context.ts +28 -1
  576. package/src/model/route-auth-resolver.ts +18 -3
  577. package/src/model/route-discovery/index.ts +1 -1
  578. package/src/model/route-discovery/nextjs.ts +1 -1
  579. package/src/model/route-discovery/python.ts +156 -9
  580. package/src/model/route-discovery/types.ts +1 -1
  581. package/src/model/route-discovery/utils.ts +73 -0
  582. package/src/model/taint-types.ts +1 -6
  583. package/src/parse/ast.ts +271 -0
  584. package/src/parse/call-graph.ts +419 -0
  585. package/src/parse/file-classifier.ts +69 -15
  586. package/src/parse/node-index.ts +118 -0
  587. package/src/parse/type-extractor.ts +293 -0
  588. package/src/pipeline/config.ts +10 -1
  589. package/src/pipeline/index.ts +475 -187
  590. package/src/pipeline/modes/incremental.ts +1 -7
  591. package/src/postprocess/dedup.ts +48 -17
  592. package/src/report/build-result.ts +57 -29
  593. package/src/report/formatters/cli-terminal.ts +731 -415
  594. package/src/report/sanitize.ts +27 -0
  595. package/src/score/adjustments.ts +113 -40
  596. package/src/score/confidence.ts +10 -5
  597. package/src/score/evidence.ts +55 -0
  598. package/src/score/index.ts +27 -55
  599. package/src/score/types.ts +4 -0
  600. package/src/shared/category-filter.ts +12 -0
  601. package/src/shared/regex-utils.ts +4 -0
  602. package/src/shared/registry-clients.ts +106 -18
  603. package/src/shared/rules/__tests__/metadata.test.ts +5 -1
  604. package/src/shared/rules/metadata.ts +19 -0
  605. package/src/shared/types.ts +373 -254
  606. package/src/taint/async-flow.ts +301 -0
  607. package/src/taint/cfg-builder.ts +1127 -0
  608. package/src/taint/cfg-types.ts +110 -0
  609. package/src/taint/constant-propagation.ts +170 -0
  610. package/src/taint/cross-file-analyzer.ts +118 -0
  611. package/src/taint/cross-file-index.ts +275 -0
  612. package/src/taint/def-use.ts +556 -0
  613. package/src/taint/file-analysis-cache.ts +145 -0
  614. package/src/taint/framework-models.ts +313 -0
  615. package/src/taint/helpers.ts +138 -0
  616. package/src/taint/index.ts +71 -0
  617. package/src/taint/llm-registry.ts +174 -0
  618. package/src/taint/llm-risk-scoring.ts +412 -0
  619. package/src/taint/propagation-types.ts +188 -0
  620. package/src/taint/propagation.ts +1750 -0
  621. package/src/taint/sanitizer-registry.ts +490 -0
  622. package/src/taint/sink-classifier.ts +1402 -0
  623. package/src/taint/source-classifier.ts +859 -0
  624. package/src/taint/taint-analyzer.ts +112 -0
  625. package/src/taint/taint-summary.ts +341 -0
  626. package/src/taint/types.ts +86 -0
  627. package/src/tiers.ts +2 -2
  628. package/src/validate/clients.ts +3 -2
  629. package/src/validate/index.ts +89 -53
  630. package/src/validate/prompts/modules/ai-patterns.ts +16 -0
  631. package/src/validate/prompts/modules/common.ts +12 -3
  632. package/src/validate/providers/anthropic.ts +254 -148
  633. package/src/validate/providers/openai.ts +363 -218
  634. package/src/validate/request-builder.ts +2 -45
  635. package/src/validate/types.ts +9 -0
  636. package/src/validate/utils/path-helpers.ts +2 -2
  637. package/src/validate/utils/response-parser.ts +32 -3
  638. package/src/validate/utils/retry.ts +19 -4
  639. package/dist/ai-context/index.d.ts +0 -6
  640. package/dist/ai-context/index.d.ts.map +0 -1
  641. package/dist/ai-context/index.js +0 -13
  642. package/dist/ai-context/index.js.map +0 -1
  643. package/dist/ai-context/manager.d.ts +0 -67
  644. package/dist/ai-context/manager.d.ts.map +0 -1
  645. package/dist/ai-context/manager.js +0 -104
  646. package/dist/ai-context/manager.js.map +0 -1
  647. package/dist/baseline/diff.d.ts +0 -32
  648. package/dist/baseline/diff.d.ts.map +0 -1
  649. package/dist/baseline/diff.js +0 -119
  650. package/dist/baseline/diff.js.map +0 -1
  651. package/dist/baseline/index.d.ts +0 -9
  652. package/dist/baseline/index.d.ts.map +0 -1
  653. package/dist/baseline/index.js +0 -19
  654. package/dist/baseline/index.js.map +0 -1
  655. package/dist/baseline/manager.d.ts +0 -67
  656. package/dist/baseline/manager.d.ts.map +0 -1
  657. package/dist/baseline/manager.js +0 -180
  658. package/dist/baseline/manager.js.map +0 -1
  659. package/dist/baseline/types.d.ts +0 -91
  660. package/dist/baseline/types.d.ts.map +0 -1
  661. package/dist/baseline/types.js +0 -12
  662. package/dist/baseline/types.js.map +0 -1
  663. package/dist/category-filter.d.ts +0 -125
  664. package/dist/category-filter.d.ts.map +0 -1
  665. package/dist/category-filter.js +0 -360
  666. package/dist/category-filter.js.map +0 -1
  667. package/dist/detect/ai-code/agent-tools.d.ts +0 -22
  668. package/dist/detect/ai-code/agent-tools.d.ts.map +0 -1
  669. package/dist/detect/ai-code/agent-tools.js +0 -1509
  670. package/dist/detect/ai-code/agent-tools.js.map +0 -1
  671. package/dist/detect/ai-code/byok-patterns.d.ts +0 -15
  672. package/dist/detect/ai-code/byok-patterns.d.ts.map +0 -1
  673. package/dist/detect/ai-code/byok-patterns.js +0 -313
  674. package/dist/detect/ai-code/byok-patterns.js.map +0 -1
  675. package/dist/detect/ai-code/endpoint-protection.d.ts +0 -38
  676. package/dist/detect/ai-code/endpoint-protection.d.ts.map +0 -1
  677. package/dist/detect/ai-code/endpoint-protection.js +0 -349
  678. package/dist/detect/ai-code/endpoint-protection.js.map +0 -1
  679. package/dist/detect/ai-code/execution-sinks.d.ts +0 -21
  680. package/dist/detect/ai-code/execution-sinks.d.ts.map +0 -1
  681. package/dist/detect/ai-code/execution-sinks.js +0 -1158
  682. package/dist/detect/ai-code/execution-sinks.js.map +0 -1
  683. package/dist/detect/ai-code/fingerprinting.d.ts +0 -10
  684. package/dist/detect/ai-code/fingerprinting.d.ts.map +0 -1
  685. package/dist/detect/ai-code/fingerprinting.js +0 -665
  686. package/dist/detect/ai-code/fingerprinting.js.map +0 -1
  687. package/dist/detect/ai-code/mcp-security.d.ts +0 -20
  688. package/dist/detect/ai-code/mcp-security.d.ts.map +0 -1
  689. package/dist/detect/ai-code/mcp-security.js +0 -880
  690. package/dist/detect/ai-code/mcp-security.js.map +0 -1
  691. package/dist/detect/ai-code/model-supply-chain.d.ts +0 -23
  692. package/dist/detect/ai-code/model-supply-chain.d.ts.map +0 -1
  693. package/dist/detect/ai-code/model-supply-chain.js +0 -447
  694. package/dist/detect/ai-code/model-supply-chain.js.map +0 -1
  695. package/dist/detect/ai-code/package-hallucination.d.ts +0 -22
  696. package/dist/detect/ai-code/package-hallucination.d.ts.map +0 -1
  697. package/dist/detect/ai-code/package-hallucination.js +0 -841
  698. package/dist/detect/ai-code/package-hallucination.js.map +0 -1
  699. package/dist/detect/ai-code/prompt-hygiene.d.ts +0 -22
  700. package/dist/detect/ai-code/prompt-hygiene.d.ts.map +0 -1
  701. package/dist/detect/ai-code/prompt-hygiene.js +0 -1177
  702. package/dist/detect/ai-code/prompt-hygiene.js.map +0 -1
  703. package/dist/detect/ai-code/rag-safety.d.ts +0 -24
  704. package/dist/detect/ai-code/rag-safety.d.ts.map +0 -1
  705. package/dist/detect/ai-code/rag-safety.js +0 -913
  706. package/dist/detect/ai-code/rag-safety.js.map +0 -1
  707. package/dist/detect/ai-code/schema-validation.d.ts +0 -28
  708. package/dist/detect/ai-code/schema-validation.d.ts.map +0 -1
  709. package/dist/detect/ai-code/schema-validation.js +0 -378
  710. package/dist/detect/ai-code/schema-validation.js.map +0 -1
  711. package/dist/detect/secrets/patterns.d.ts +0 -11
  712. package/dist/detect/secrets/patterns.d.ts.map +0 -1
  713. package/dist/detect/secrets/patterns.js +0 -518
  714. package/dist/detect/secrets/patterns.js.map +0 -1
  715. package/dist/detect/secrets/weak-crypto.d.ts +0 -10
  716. package/dist/detect/secrets/weak-crypto.d.ts.map +0 -1
  717. package/dist/detect/secrets/weak-crypto.js +0 -432
  718. package/dist/detect/secrets/weak-crypto.js.map +0 -1
  719. package/dist/detect/structural/auth-patterns.d.ts +0 -22
  720. package/dist/detect/structural/auth-patterns.d.ts.map +0 -1
  721. package/dist/detect/structural/auth-patterns.js +0 -533
  722. package/dist/detect/structural/auth-patterns.js.map +0 -1
  723. package/dist/detect/structural/dangerous-functions/child-process.d.ts +0 -16
  724. package/dist/detect/structural/dangerous-functions/child-process.d.ts.map +0 -1
  725. package/dist/detect/structural/dangerous-functions/child-process.js +0 -74
  726. package/dist/detect/structural/dangerous-functions/child-process.js.map +0 -1
  727. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts +0 -34
  728. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts.map +0 -1
  729. package/dist/detect/structural/dangerous-functions/dom-xss.js +0 -230
  730. package/dist/detect/structural/dangerous-functions/dom-xss.js.map +0 -1
  731. package/dist/detect/structural/dangerous-functions/index.d.ts +0 -16
  732. package/dist/detect/structural/dangerous-functions/index.d.ts.map +0 -1
  733. package/dist/detect/structural/dangerous-functions/index.js +0 -1193
  734. package/dist/detect/structural/dangerous-functions/index.js.map +0 -1
  735. package/dist/detect/structural/dangerous-functions/json-parse.d.ts +0 -31
  736. package/dist/detect/structural/dangerous-functions/json-parse.d.ts.map +0 -1
  737. package/dist/detect/structural/dangerous-functions/json-parse.js +0 -326
  738. package/dist/detect/structural/dangerous-functions/json-parse.js.map +0 -1
  739. package/dist/detect/structural/dangerous-functions/math-random.d.ts +0 -111
  740. package/dist/detect/structural/dangerous-functions/math-random.d.ts.map +0 -1
  741. package/dist/detect/structural/dangerous-functions/math-random.js +0 -684
  742. package/dist/detect/structural/dangerous-functions/math-random.js.map +0 -1
  743. package/dist/detect/structural/dangerous-functions/patterns.d.ts +0 -21
  744. package/dist/detect/structural/dangerous-functions/patterns.d.ts.map +0 -1
  745. package/dist/detect/structural/dangerous-functions/patterns.js +0 -163
  746. package/dist/detect/structural/dangerous-functions/patterns.js.map +0 -1
  747. package/dist/detect/structural/dangerous-functions/request-validation.d.ts +0 -13
  748. package/dist/detect/structural/dangerous-functions/request-validation.d.ts.map +0 -1
  749. package/dist/detect/structural/dangerous-functions/request-validation.js +0 -126
  750. package/dist/detect/structural/dangerous-functions/request-validation.js.map +0 -1
  751. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts +0 -24
  752. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts.map +0 -1
  753. package/dist/detect/structural/dangerous-functions/utils/control-flow.js +0 -70
  754. package/dist/detect/structural/dangerous-functions/utils/control-flow.js.map +0 -1
  755. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts +0 -31
  756. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts.map +0 -1
  757. package/dist/detect/structural/dangerous-functions/utils/helpers.js +0 -147
  758. package/dist/detect/structural/dangerous-functions/utils/helpers.js.map +0 -1
  759. package/dist/detect/structural/dangerous-functions/utils/index.d.ts +0 -9
  760. package/dist/detect/structural/dangerous-functions/utils/index.d.ts.map +0 -1
  761. package/dist/detect/structural/dangerous-functions/utils/index.js +0 -23
  762. package/dist/detect/structural/dangerous-functions/utils/index.js.map +0 -1
  763. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts +0 -22
  764. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts.map +0 -1
  765. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js +0 -102
  766. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js.map +0 -1
  767. package/dist/detect/structural/data-exposure.d.ts +0 -19
  768. package/dist/detect/structural/data-exposure.d.ts.map +0 -1
  769. package/dist/detect/structural/data-exposure.js +0 -262
  770. package/dist/detect/structural/data-exposure.js.map +0 -1
  771. package/dist/detect/structural/framework-checks.d.ts +0 -10
  772. package/dist/detect/structural/framework-checks.d.ts.map +0 -1
  773. package/dist/detect/structural/framework-checks.js +0 -389
  774. package/dist/detect/structural/framework-checks.js.map +0 -1
  775. package/dist/detect/structural/log-injection.d.ts +0 -18
  776. package/dist/detect/structural/log-injection.d.ts.map +0 -1
  777. package/dist/detect/structural/log-injection.js +0 -217
  778. package/dist/detect/structural/log-injection.js.map +0 -1
  779. package/dist/detect/structural/logic-gates.d.ts +0 -10
  780. package/dist/detect/structural/logic-gates.d.ts.map +0 -1
  781. package/dist/detect/structural/logic-gates.js +0 -227
  782. package/dist/detect/structural/logic-gates.js.map +0 -1
  783. package/dist/detect/structural/risky-imports.d.ts +0 -10
  784. package/dist/detect/structural/risky-imports.d.ts.map +0 -1
  785. package/dist/detect/structural/risky-imports.js +0 -168
  786. package/dist/detect/structural/risky-imports.js.map +0 -1
  787. package/dist/detect/structural/security-headers.d.ts +0 -18
  788. package/dist/detect/structural/security-headers.d.ts.map +0 -1
  789. package/dist/detect/structural/security-headers.js +0 -196
  790. package/dist/detect/structural/security-headers.js.map +0 -1
  791. package/dist/detect/structural/ssrf-detection.d.ts +0 -18
  792. package/dist/detect/structural/ssrf-detection.d.ts.map +0 -1
  793. package/dist/detect/structural/ssrf-detection.js +0 -263
  794. package/dist/detect/structural/ssrf-detection.js.map +0 -1
  795. package/dist/detect/structural/variables.d.ts +0 -11
  796. package/dist/detect/structural/variables.d.ts.map +0 -1
  797. package/dist/detect/structural/variables.js +0 -159
  798. package/dist/detect/structural/variables.js.map +0 -1
  799. package/dist/detect/structural/xxe-detection.d.ts +0 -18
  800. package/dist/detect/structural/xxe-detection.d.ts.map +0 -1
  801. package/dist/detect/structural/xxe-detection.js +0 -245
  802. package/dist/detect/structural/xxe-detection.js.map +0 -1
  803. package/dist/filtering/context-adjustments.d.ts +0 -23
  804. package/dist/filtering/context-adjustments.d.ts.map +0 -1
  805. package/dist/filtering/context-adjustments.js +0 -100
  806. package/dist/filtering/context-adjustments.js.map +0 -1
  807. package/dist/filtering/index.d.ts +0 -3
  808. package/dist/filtering/index.d.ts.map +0 -1
  809. package/dist/filtering/index.js +0 -8
  810. package/dist/filtering/index.js.map +0 -1
  811. package/dist/filtering/pipeline.d.ts +0 -48
  812. package/dist/filtering/pipeline.d.ts.map +0 -1
  813. package/dist/filtering/pipeline.js +0 -76
  814. package/dist/filtering/pipeline.js.map +0 -1
  815. package/dist/formatters/ai-context.d.ts +0 -23
  816. package/dist/formatters/ai-context.d.ts.map +0 -1
  817. package/dist/formatters/ai-context.js +0 -238
  818. package/dist/formatters/ai-context.js.map +0 -1
  819. package/dist/formatters/cli-terminal.d.ts +0 -65
  820. package/dist/formatters/cli-terminal.d.ts.map +0 -1
  821. package/dist/formatters/cli-terminal.js +0 -735
  822. package/dist/formatters/cli-terminal.js.map +0 -1
  823. package/dist/formatters/github-comment.d.ts +0 -41
  824. package/dist/formatters/github-comment.d.ts.map +0 -1
  825. package/dist/formatters/github-comment.js +0 -370
  826. package/dist/formatters/github-comment.js.map +0 -1
  827. package/dist/formatters/grouping.d.ts +0 -52
  828. package/dist/formatters/grouping.d.ts.map +0 -1
  829. package/dist/formatters/grouping.js +0 -152
  830. package/dist/formatters/grouping.js.map +0 -1
  831. package/dist/formatters/ide/claude-code.d.ts +0 -17
  832. package/dist/formatters/ide/claude-code.d.ts.map +0 -1
  833. package/dist/formatters/ide/claude-code.js +0 -94
  834. package/dist/formatters/ide/claude-code.js.map +0 -1
  835. package/dist/formatters/ide/cursor.d.ts +0 -13
  836. package/dist/formatters/ide/cursor.d.ts.map +0 -1
  837. package/dist/formatters/ide/cursor.js +0 -125
  838. package/dist/formatters/ide/cursor.js.map +0 -1
  839. package/dist/formatters/ide/index.d.ts +0 -62
  840. package/dist/formatters/ide/index.d.ts.map +0 -1
  841. package/dist/formatters/ide/index.js +0 -184
  842. package/dist/formatters/ide/index.js.map +0 -1
  843. package/dist/formatters/ide/windsurf.d.ts +0 -13
  844. package/dist/formatters/ide/windsurf.d.ts.map +0 -1
  845. package/dist/formatters/ide/windsurf.js +0 -117
  846. package/dist/formatters/ide/windsurf.js.map +0 -1
  847. package/dist/formatters/index.d.ts +0 -11
  848. package/dist/formatters/index.d.ts.map +0 -1
  849. package/dist/formatters/index.js +0 -54
  850. package/dist/formatters/index.js.map +0 -1
  851. package/dist/formatters/vscode-diagnostic.d.ts +0 -103
  852. package/dist/formatters/vscode-diagnostic.d.ts.map +0 -1
  853. package/dist/formatters/vscode-diagnostic.js +0 -151
  854. package/dist/formatters/vscode-diagnostic.js.map +0 -1
  855. package/dist/layer1/comments.d.ts +0 -11
  856. package/dist/layer1/comments.d.ts.map +0 -1
  857. package/dist/layer1/comments.js +0 -203
  858. package/dist/layer1/comments.js.map +0 -1
  859. package/dist/layer1/config-audit.d.ts +0 -11
  860. package/dist/layer1/config-audit.d.ts.map +0 -1
  861. package/dist/layer1/config-audit.js +0 -311
  862. package/dist/layer1/config-audit.js.map +0 -1
  863. package/dist/layer1/config-mcp-audit.d.ts +0 -23
  864. package/dist/layer1/config-mcp-audit.d.ts.map +0 -1
  865. package/dist/layer1/config-mcp-audit.js +0 -239
  866. package/dist/layer1/config-mcp-audit.js.map +0 -1
  867. package/dist/layer1/entropy.d.ts +0 -11
  868. package/dist/layer1/entropy.d.ts.map +0 -1
  869. package/dist/layer1/entropy.js +0 -741
  870. package/dist/layer1/entropy.js.map +0 -1
  871. package/dist/layer1/file-flags.d.ts +0 -10
  872. package/dist/layer1/file-flags.d.ts.map +0 -1
  873. package/dist/layer1/file-flags.js +0 -119
  874. package/dist/layer1/file-flags.js.map +0 -1
  875. package/dist/layer1/index.d.ts +0 -38
  876. package/dist/layer1/index.d.ts.map +0 -1
  877. package/dist/layer1/index.js +0 -170
  878. package/dist/layer1/index.js.map +0 -1
  879. package/dist/layer1/patterns.d.ts +0 -11
  880. package/dist/layer1/patterns.d.ts.map +0 -1
  881. package/dist/layer1/patterns.js +0 -512
  882. package/dist/layer1/patterns.js.map +0 -1
  883. package/dist/layer1/urls.d.ts +0 -11
  884. package/dist/layer1/urls.d.ts.map +0 -1
  885. package/dist/layer1/urls.js +0 -444
  886. package/dist/layer1/urls.js.map +0 -1
  887. package/dist/layer1/weak-crypto.d.ts +0 -10
  888. package/dist/layer1/weak-crypto.d.ts.map +0 -1
  889. package/dist/layer1/weak-crypto.js +0 -428
  890. package/dist/layer1/weak-crypto.js.map +0 -1
  891. package/dist/layer2/ai-agent-tools.d.ts +0 -22
  892. package/dist/layer2/ai-agent-tools.d.ts.map +0 -1
  893. package/dist/layer2/ai-agent-tools.js +0 -1490
  894. package/dist/layer2/ai-agent-tools.js.map +0 -1
  895. package/dist/layer2/ai-endpoint-protection.d.ts +0 -38
  896. package/dist/layer2/ai-endpoint-protection.d.ts.map +0 -1
  897. package/dist/layer2/ai-endpoint-protection.js +0 -346
  898. package/dist/layer2/ai-endpoint-protection.js.map +0 -1
  899. package/dist/layer2/ai-execution-sinks.d.ts +0 -21
  900. package/dist/layer2/ai-execution-sinks.d.ts.map +0 -1
  901. package/dist/layer2/ai-execution-sinks.js +0 -1155
  902. package/dist/layer2/ai-execution-sinks.js.map +0 -1
  903. package/dist/layer2/ai-fingerprinting.d.ts +0 -10
  904. package/dist/layer2/ai-fingerprinting.d.ts.map +0 -1
  905. package/dist/layer2/ai-fingerprinting.js +0 -650
  906. package/dist/layer2/ai-fingerprinting.js.map +0 -1
  907. package/dist/layer2/ai-mcp-security.d.ts +0 -20
  908. package/dist/layer2/ai-mcp-security.d.ts.map +0 -1
  909. package/dist/layer2/ai-mcp-security.js +0 -877
  910. package/dist/layer2/ai-mcp-security.js.map +0 -1
  911. package/dist/layer2/ai-package-hallucination.d.ts +0 -22
  912. package/dist/layer2/ai-package-hallucination.d.ts.map +0 -1
  913. package/dist/layer2/ai-package-hallucination.js +0 -828
  914. package/dist/layer2/ai-package-hallucination.js.map +0 -1
  915. package/dist/layer2/ai-prompt-hygiene.d.ts +0 -22
  916. package/dist/layer2/ai-prompt-hygiene.d.ts.map +0 -1
  917. package/dist/layer2/ai-prompt-hygiene.js +0 -1156
  918. package/dist/layer2/ai-prompt-hygiene.js.map +0 -1
  919. package/dist/layer2/ai-rag-safety.d.ts +0 -24
  920. package/dist/layer2/ai-rag-safety.d.ts.map +0 -1
  921. package/dist/layer2/ai-rag-safety.js +0 -910
  922. package/dist/layer2/ai-rag-safety.js.map +0 -1
  923. package/dist/layer2/ai-schema-validation.d.ts +0 -28
  924. package/dist/layer2/ai-schema-validation.d.ts.map +0 -1
  925. package/dist/layer2/ai-schema-validation.js +0 -375
  926. package/dist/layer2/ai-schema-validation.js.map +0 -1
  927. package/dist/layer2/auth-antipatterns.d.ts +0 -22
  928. package/dist/layer2/auth-antipatterns.d.ts.map +0 -1
  929. package/dist/layer2/auth-antipatterns.js +0 -522
  930. package/dist/layer2/auth-antipatterns.js.map +0 -1
  931. package/dist/layer2/byok-patterns.d.ts +0 -15
  932. package/dist/layer2/byok-patterns.d.ts.map +0 -1
  933. package/dist/layer2/byok-patterns.js +0 -302
  934. package/dist/layer2/byok-patterns.js.map +0 -1
  935. package/dist/layer2/dangerous-functions/child-process.d.ts +0 -16
  936. package/dist/layer2/dangerous-functions/child-process.d.ts.map +0 -1
  937. package/dist/layer2/dangerous-functions/child-process.js +0 -74
  938. package/dist/layer2/dangerous-functions/child-process.js.map +0 -1
  939. package/dist/layer2/dangerous-functions/dom-xss.d.ts +0 -34
  940. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +0 -1
  941. package/dist/layer2/dangerous-functions/dom-xss.js +0 -230
  942. package/dist/layer2/dangerous-functions/dom-xss.js.map +0 -1
  943. package/dist/layer2/dangerous-functions/index.d.ts +0 -16
  944. package/dist/layer2/dangerous-functions/index.d.ts.map +0 -1
  945. package/dist/layer2/dangerous-functions/index.js +0 -1152
  946. package/dist/layer2/dangerous-functions/index.js.map +0 -1
  947. package/dist/layer2/dangerous-functions/json-parse.d.ts +0 -31
  948. package/dist/layer2/dangerous-functions/json-parse.d.ts.map +0 -1
  949. package/dist/layer2/dangerous-functions/json-parse.js +0 -319
  950. package/dist/layer2/dangerous-functions/json-parse.js.map +0 -1
  951. package/dist/layer2/dangerous-functions/math-random.d.ts +0 -111
  952. package/dist/layer2/dangerous-functions/math-random.d.ts.map +0 -1
  953. package/dist/layer2/dangerous-functions/math-random.js +0 -684
  954. package/dist/layer2/dangerous-functions/math-random.js.map +0 -1
  955. package/dist/layer2/dangerous-functions/patterns.d.ts +0 -21
  956. package/dist/layer2/dangerous-functions/patterns.d.ts.map +0 -1
  957. package/dist/layer2/dangerous-functions/patterns.js +0 -163
  958. package/dist/layer2/dangerous-functions/patterns.js.map +0 -1
  959. package/dist/layer2/dangerous-functions/request-validation.d.ts +0 -13
  960. package/dist/layer2/dangerous-functions/request-validation.d.ts.map +0 -1
  961. package/dist/layer2/dangerous-functions/request-validation.js +0 -119
  962. package/dist/layer2/dangerous-functions/request-validation.js.map +0 -1
  963. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +0 -24
  964. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +0 -1
  965. package/dist/layer2/dangerous-functions/utils/control-flow.js +0 -70
  966. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +0 -1
  967. package/dist/layer2/dangerous-functions/utils/helpers.d.ts +0 -31
  968. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +0 -1
  969. package/dist/layer2/dangerous-functions/utils/helpers.js +0 -147
  970. package/dist/layer2/dangerous-functions/utils/helpers.js.map +0 -1
  971. package/dist/layer2/dangerous-functions/utils/index.d.ts +0 -9
  972. package/dist/layer2/dangerous-functions/utils/index.d.ts.map +0 -1
  973. package/dist/layer2/dangerous-functions/utils/index.js +0 -23
  974. package/dist/layer2/dangerous-functions/utils/index.js.map +0 -1
  975. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +0 -22
  976. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +0 -1
  977. package/dist/layer2/dangerous-functions/utils/schema-validation.js +0 -102
  978. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +0 -1
  979. package/dist/layer2/data-exposure.d.ts +0 -19
  980. package/dist/layer2/data-exposure.d.ts.map +0 -1
  981. package/dist/layer2/data-exposure.js +0 -255
  982. package/dist/layer2/data-exposure.js.map +0 -1
  983. package/dist/layer2/framework-checks.d.ts +0 -10
  984. package/dist/layer2/framework-checks.d.ts.map +0 -1
  985. package/dist/layer2/framework-checks.js +0 -384
  986. package/dist/layer2/framework-checks.js.map +0 -1
  987. package/dist/layer2/index.d.ts +0 -74
  988. package/dist/layer2/index.d.ts.map +0 -1
  989. package/dist/layer2/index.js +0 -544
  990. package/dist/layer2/index.js.map +0 -1
  991. package/dist/layer2/log-injection.d.ts +0 -18
  992. package/dist/layer2/log-injection.d.ts.map +0 -1
  993. package/dist/layer2/log-injection.js +0 -214
  994. package/dist/layer2/log-injection.js.map +0 -1
  995. package/dist/layer2/logic-gates.d.ts +0 -10
  996. package/dist/layer2/logic-gates.d.ts.map +0 -1
  997. package/dist/layer2/logic-gates.js +0 -220
  998. package/dist/layer2/logic-gates.js.map +0 -1
  999. package/dist/layer2/model-supply-chain.d.ts +0 -23
  1000. package/dist/layer2/model-supply-chain.d.ts.map +0 -1
  1001. package/dist/layer2/model-supply-chain.js +0 -444
  1002. package/dist/layer2/model-supply-chain.js.map +0 -1
  1003. package/dist/layer2/risky-imports.d.ts +0 -10
  1004. package/dist/layer2/risky-imports.d.ts.map +0 -1
  1005. package/dist/layer2/risky-imports.js +0 -165
  1006. package/dist/layer2/risky-imports.js.map +0 -1
  1007. package/dist/layer2/security-headers.d.ts +0 -18
  1008. package/dist/layer2/security-headers.d.ts.map +0 -1
  1009. package/dist/layer2/security-headers.js +0 -187
  1010. package/dist/layer2/security-headers.js.map +0 -1
  1011. package/dist/layer2/ssrf-detection.d.ts +0 -18
  1012. package/dist/layer2/ssrf-detection.d.ts.map +0 -1
  1013. package/dist/layer2/ssrf-detection.js +0 -252
  1014. package/dist/layer2/ssrf-detection.js.map +0 -1
  1015. package/dist/layer2/variables.d.ts +0 -11
  1016. package/dist/layer2/variables.d.ts.map +0 -1
  1017. package/dist/layer2/variables.js +0 -156
  1018. package/dist/layer2/variables.js.map +0 -1
  1019. package/dist/layer2/xxe-detection.d.ts +0 -18
  1020. package/dist/layer2/xxe-detection.d.ts.map +0 -1
  1021. package/dist/layer2/xxe-detection.js +0 -242
  1022. package/dist/layer2/xxe-detection.js.map +0 -1
  1023. package/dist/layer3/anthropic/auto-dismiss.d.ts +0 -24
  1024. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +0 -1
  1025. package/dist/layer3/anthropic/auto-dismiss.js +0 -199
  1026. package/dist/layer3/anthropic/auto-dismiss.js.map +0 -1
  1027. package/dist/layer3/anthropic/clients.d.ts +0 -44
  1028. package/dist/layer3/anthropic/clients.d.ts.map +0 -1
  1029. package/dist/layer3/anthropic/clients.js +0 -81
  1030. package/dist/layer3/anthropic/clients.js.map +0 -1
  1031. package/dist/layer3/anthropic/index.d.ts +0 -41
  1032. package/dist/layer3/anthropic/index.d.ts.map +0 -1
  1033. package/dist/layer3/anthropic/index.js +0 -141
  1034. package/dist/layer3/anthropic/index.js.map +0 -1
  1035. package/dist/layer3/anthropic/prompts/index.d.ts +0 -8
  1036. package/dist/layer3/anthropic/prompts/index.d.ts.map +0 -1
  1037. package/dist/layer3/anthropic/prompts/index.js +0 -16
  1038. package/dist/layer3/anthropic/prompts/index.js.map +0 -1
  1039. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts +0 -19
  1040. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts.map +0 -1
  1041. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js +0 -156
  1042. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js.map +0 -1
  1043. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts +0 -9
  1044. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts.map +0 -1
  1045. package/dist/layer3/anthropic/prompts/modules/auth-access.js +0 -25
  1046. package/dist/layer3/anthropic/prompts/modules/auth-access.js.map +0 -1
  1047. package/dist/layer3/anthropic/prompts/modules/common.d.ts +0 -11
  1048. package/dist/layer3/anthropic/prompts/modules/common.d.ts.map +0 -1
  1049. package/dist/layer3/anthropic/prompts/modules/common.js +0 -152
  1050. package/dist/layer3/anthropic/prompts/modules/common.js.map +0 -1
  1051. package/dist/layer3/anthropic/prompts/modules/index.d.ts +0 -54
  1052. package/dist/layer3/anthropic/prompts/modules/index.d.ts.map +0 -1
  1053. package/dist/layer3/anthropic/prompts/modules/index.js +0 -185
  1054. package/dist/layer3/anthropic/prompts/modules/index.js.map +0 -1
  1055. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts +0 -8
  1056. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts.map +0 -1
  1057. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js +0 -84
  1058. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js.map +0 -1
  1059. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts +0 -8
  1060. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts.map +0 -1
  1061. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js +0 -68
  1062. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js.map +0 -1
  1063. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts +0 -8
  1064. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts.map +0 -1
  1065. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js +0 -22
  1066. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js.map +0 -1
  1067. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +0 -15
  1068. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +0 -1
  1069. package/dist/layer3/anthropic/prompts/semantic-analysis.js +0 -169
  1070. package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +0 -1
  1071. package/dist/layer3/anthropic/prompts/validation.d.ts +0 -18
  1072. package/dist/layer3/anthropic/prompts/validation.d.ts.map +0 -1
  1073. package/dist/layer3/anthropic/prompts/validation.js +0 -25
  1074. package/dist/layer3/anthropic/prompts/validation.js.map +0 -1
  1075. package/dist/layer3/anthropic/providers/anthropic.d.ts +0 -21
  1076. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +0 -1
  1077. package/dist/layer3/anthropic/providers/anthropic.js +0 -269
  1078. package/dist/layer3/anthropic/providers/anthropic.js.map +0 -1
  1079. package/dist/layer3/anthropic/providers/index.d.ts +0 -8
  1080. package/dist/layer3/anthropic/providers/index.d.ts.map +0 -1
  1081. package/dist/layer3/anthropic/providers/index.js +0 -15
  1082. package/dist/layer3/anthropic/providers/index.js.map +0 -1
  1083. package/dist/layer3/anthropic/providers/openai.d.ts +0 -18
  1084. package/dist/layer3/anthropic/providers/openai.d.ts.map +0 -1
  1085. package/dist/layer3/anthropic/providers/openai.js +0 -343
  1086. package/dist/layer3/anthropic/providers/openai.js.map +0 -1
  1087. package/dist/layer3/anthropic/request-builder.d.ts +0 -27
  1088. package/dist/layer3/anthropic/request-builder.d.ts.map +0 -1
  1089. package/dist/layer3/anthropic/request-builder.js +0 -150
  1090. package/dist/layer3/anthropic/request-builder.js.map +0 -1
  1091. package/dist/layer3/anthropic/types.d.ts +0 -88
  1092. package/dist/layer3/anthropic/types.d.ts.map +0 -1
  1093. package/dist/layer3/anthropic/types.js +0 -38
  1094. package/dist/layer3/anthropic/types.js.map +0 -1
  1095. package/dist/layer3/anthropic/utils/context-extractor.d.ts +0 -55
  1096. package/dist/layer3/anthropic/utils/context-extractor.d.ts.map +0 -1
  1097. package/dist/layer3/anthropic/utils/context-extractor.js +0 -161
  1098. package/dist/layer3/anthropic/utils/context-extractor.js.map +0 -1
  1099. package/dist/layer3/anthropic/utils/index.d.ts +0 -11
  1100. package/dist/layer3/anthropic/utils/index.d.ts.map +0 -1
  1101. package/dist/layer3/anthropic/utils/index.js +0 -27
  1102. package/dist/layer3/anthropic/utils/index.js.map +0 -1
  1103. package/dist/layer3/anthropic/utils/path-helpers.d.ts +0 -21
  1104. package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +0 -1
  1105. package/dist/layer3/anthropic/utils/path-helpers.js +0 -69
  1106. package/dist/layer3/anthropic/utils/path-helpers.js.map +0 -1
  1107. package/dist/layer3/anthropic/utils/response-parser.d.ts +0 -40
  1108. package/dist/layer3/anthropic/utils/response-parser.d.ts.map +0 -1
  1109. package/dist/layer3/anthropic/utils/response-parser.js +0 -285
  1110. package/dist/layer3/anthropic/utils/response-parser.js.map +0 -1
  1111. package/dist/layer3/anthropic/utils/retry.d.ts +0 -15
  1112. package/dist/layer3/anthropic/utils/retry.d.ts.map +0 -1
  1113. package/dist/layer3/anthropic/utils/retry.js +0 -62
  1114. package/dist/layer3/anthropic/utils/retry.js.map +0 -1
  1115. package/dist/layer3/index.d.ts +0 -27
  1116. package/dist/layer3/index.d.ts.map +0 -1
  1117. package/dist/layer3/index.js +0 -150
  1118. package/dist/layer3/index.js.map +0 -1
  1119. package/dist/layer3/osv-check.d.ts +0 -75
  1120. package/dist/layer3/osv-check.d.ts.map +0 -1
  1121. package/dist/layer3/osv-check.js +0 -308
  1122. package/dist/layer3/osv-check.js.map +0 -1
  1123. package/dist/layer3/package-check.d.ts +0 -63
  1124. package/dist/layer3/package-check.d.ts.map +0 -1
  1125. package/dist/layer3/package-check.js +0 -508
  1126. package/dist/layer3/package-check.js.map +0 -1
  1127. package/dist/model/cross-file-taint.d.ts +0 -40
  1128. package/dist/model/cross-file-taint.d.ts.map +0 -1
  1129. package/dist/model/cross-file-taint.js +0 -290
  1130. package/dist/model/cross-file-taint.js.map +0 -1
  1131. package/dist/model/function-classifier.d.ts +0 -32
  1132. package/dist/model/function-classifier.d.ts.map +0 -1
  1133. package/dist/model/function-classifier.js +0 -143
  1134. package/dist/model/function-classifier.js.map +0 -1
  1135. package/dist/model/sanitiser-detection.d.ts +0 -27
  1136. package/dist/model/sanitiser-detection.d.ts.map +0 -1
  1137. package/dist/model/sanitiser-detection.js +0 -224
  1138. package/dist/model/sanitiser-detection.js.map +0 -1
  1139. package/dist/model/sink-matcher.d.ts +0 -17
  1140. package/dist/model/sink-matcher.d.ts.map +0 -1
  1141. package/dist/model/sink-matcher.js +0 -141
  1142. package/dist/model/sink-matcher.js.map +0 -1
  1143. package/dist/model/sink-patterns.d.ts +0 -19
  1144. package/dist/model/sink-patterns.d.ts.map +0 -1
  1145. package/dist/model/sink-patterns.js +0 -88
  1146. package/dist/model/sink-patterns.js.map +0 -1
  1147. package/dist/model/source-discovery.d.ts +0 -15
  1148. package/dist/model/source-discovery.d.ts.map +0 -1
  1149. package/dist/model/source-discovery.js +0 -170
  1150. package/dist/model/source-discovery.js.map +0 -1
  1151. package/dist/model/taint-tracker.d.ts +0 -21
  1152. package/dist/model/taint-tracker.d.ts.map +0 -1
  1153. package/dist/model/taint-tracker.js +0 -281
  1154. package/dist/model/taint-tracker.js.map +0 -1
  1155. package/dist/modes/incremental.d.ts +0 -66
  1156. package/dist/modes/incremental.d.ts.map +0 -1
  1157. package/dist/modes/incremental.js +0 -200
  1158. package/dist/modes/incremental.js.map +0 -1
  1159. package/dist/rules/framework-fixes.d.ts +0 -48
  1160. package/dist/rules/framework-fixes.d.ts.map +0 -1
  1161. package/dist/rules/framework-fixes.js +0 -439
  1162. package/dist/rules/framework-fixes.js.map +0 -1
  1163. package/dist/rules/index.d.ts +0 -8
  1164. package/dist/rules/index.d.ts.map +0 -1
  1165. package/dist/rules/index.js +0 -18
  1166. package/dist/rules/index.js.map +0 -1
  1167. package/dist/rules/metadata.d.ts +0 -43
  1168. package/dist/rules/metadata.d.ts.map +0 -1
  1169. package/dist/rules/metadata.js +0 -800
  1170. package/dist/rules/metadata.js.map +0 -1
  1171. package/dist/score/auto-dismiss.d.ts +0 -28
  1172. package/dist/score/auto-dismiss.d.ts.map +0 -1
  1173. package/dist/score/auto-dismiss.js +0 -200
  1174. package/dist/score/auto-dismiss.js.map +0 -1
  1175. package/dist/suppression/config-loader.d.ts +0 -74
  1176. package/dist/suppression/config-loader.d.ts.map +0 -1
  1177. package/dist/suppression/config-loader.js +0 -424
  1178. package/dist/suppression/config-loader.js.map +0 -1
  1179. package/dist/suppression/hash.d.ts +0 -48
  1180. package/dist/suppression/hash.d.ts.map +0 -1
  1181. package/dist/suppression/hash.js +0 -88
  1182. package/dist/suppression/hash.js.map +0 -1
  1183. package/dist/suppression/index.d.ts +0 -11
  1184. package/dist/suppression/index.d.ts.map +0 -1
  1185. package/dist/suppression/index.js +0 -39
  1186. package/dist/suppression/index.js.map +0 -1
  1187. package/dist/suppression/inline-parser.d.ts +0 -39
  1188. package/dist/suppression/inline-parser.d.ts.map +0 -1
  1189. package/dist/suppression/inline-parser.js +0 -218
  1190. package/dist/suppression/inline-parser.js.map +0 -1
  1191. package/dist/suppression/manager.d.ts +0 -94
  1192. package/dist/suppression/manager.d.ts.map +0 -1
  1193. package/dist/suppression/manager.js +0 -292
  1194. package/dist/suppression/manager.js.map +0 -1
  1195. package/dist/suppression/types.d.ts +0 -151
  1196. package/dist/suppression/types.d.ts.map +0 -1
  1197. package/dist/suppression/types.js +0 -28
  1198. package/dist/suppression/types.js.map +0 -1
  1199. package/dist/types.d.ts +0 -331
  1200. package/dist/types.d.ts.map +0 -1
  1201. package/dist/types.js +0 -124
  1202. package/dist/types.js.map +0 -1
  1203. package/dist/utils/auth-helper-detector.d.ts +0 -56
  1204. package/dist/utils/auth-helper-detector.d.ts.map +0 -1
  1205. package/dist/utils/auth-helper-detector.js +0 -360
  1206. package/dist/utils/auth-helper-detector.js.map +0 -1
  1207. package/dist/utils/code-analysis.d.ts +0 -39
  1208. package/dist/utils/code-analysis.d.ts.map +0 -1
  1209. package/dist/utils/code-analysis.js +0 -159
  1210. package/dist/utils/code-analysis.js.map +0 -1
  1211. package/dist/utils/comment-analyzer.d.ts +0 -38
  1212. package/dist/utils/comment-analyzer.d.ts.map +0 -1
  1213. package/dist/utils/comment-analyzer.js +0 -218
  1214. package/dist/utils/comment-analyzer.js.map +0 -1
  1215. package/dist/utils/context-helpers.d.ts +0 -219
  1216. package/dist/utils/context-helpers.d.ts.map +0 -1
  1217. package/dist/utils/context-helpers.js +0 -886
  1218. package/dist/utils/context-helpers.js.map +0 -1
  1219. package/dist/utils/diff-detector.d.ts +0 -53
  1220. package/dist/utils/diff-detector.d.ts.map +0 -1
  1221. package/dist/utils/diff-detector.js +0 -104
  1222. package/dist/utils/diff-detector.js.map +0 -1
  1223. package/dist/utils/diff-parser.d.ts +0 -80
  1224. package/dist/utils/diff-parser.d.ts.map +0 -1
  1225. package/dist/utils/diff-parser.js +0 -202
  1226. package/dist/utils/diff-parser.js.map +0 -1
  1227. package/dist/utils/environment-context.d.ts +0 -76
  1228. package/dist/utils/environment-context.d.ts.map +0 -1
  1229. package/dist/utils/environment-context.js +0 -271
  1230. package/dist/utils/environment-context.js.map +0 -1
  1231. package/dist/utils/imported-auth-detector.d.ts +0 -37
  1232. package/dist/utils/imported-auth-detector.d.ts.map +0 -1
  1233. package/dist/utils/imported-auth-detector.js +0 -251
  1234. package/dist/utils/imported-auth-detector.js.map +0 -1
  1235. package/dist/utils/intent-detector.d.ts +0 -66
  1236. package/dist/utils/intent-detector.d.ts.map +0 -1
  1237. package/dist/utils/intent-detector.js +0 -282
  1238. package/dist/utils/intent-detector.js.map +0 -1
  1239. package/dist/utils/middleware-detector.d.ts +0 -55
  1240. package/dist/utils/middleware-detector.d.ts.map +0 -1
  1241. package/dist/utils/middleware-detector.js +0 -260
  1242. package/dist/utils/middleware-detector.js.map +0 -1
  1243. package/dist/utils/oauth-flow-detector.d.ts +0 -41
  1244. package/dist/utils/oauth-flow-detector.d.ts.map +0 -1
  1245. package/dist/utils/oauth-flow-detector.js +0 -202
  1246. package/dist/utils/oauth-flow-detector.js.map +0 -1
  1247. package/dist/utils/parsed-file.d.ts +0 -51
  1248. package/dist/utils/parsed-file.d.ts.map +0 -1
  1249. package/dist/utils/parsed-file.js +0 -95
  1250. package/dist/utils/parsed-file.js.map +0 -1
  1251. package/dist/utils/path-exclusions.d.ts +0 -55
  1252. package/dist/utils/path-exclusions.d.ts.map +0 -1
  1253. package/dist/utils/path-exclusions.js +0 -224
  1254. package/dist/utils/path-exclusions.js.map +0 -1
  1255. package/dist/utils/project-context-builder.d.ts +0 -119
  1256. package/dist/utils/project-context-builder.d.ts.map +0 -1
  1257. package/dist/utils/project-context-builder.js +0 -534
  1258. package/dist/utils/project-context-builder.js.map +0 -1
  1259. package/dist/utils/registry-clients.d.ts +0 -93
  1260. package/dist/utils/registry-clients.d.ts.map +0 -1
  1261. package/dist/utils/registry-clients.js +0 -273
  1262. package/dist/utils/registry-clients.js.map +0 -1
  1263. package/dist/utils/route-hierarchy.d.ts +0 -50
  1264. package/dist/utils/route-hierarchy.d.ts.map +0 -1
  1265. package/dist/utils/route-hierarchy.js +0 -226
  1266. package/dist/utils/route-hierarchy.js.map +0 -1
  1267. package/dist/utils/schema-semantics.d.ts +0 -45
  1268. package/dist/utils/schema-semantics.d.ts.map +0 -1
  1269. package/dist/utils/schema-semantics.js +0 -193
  1270. package/dist/utils/schema-semantics.js.map +0 -1
  1271. package/dist/utils/trpc-analyzer.d.ts +0 -78
  1272. package/dist/utils/trpc-analyzer.d.ts.map +0 -1
  1273. package/dist/utils/trpc-analyzer.js +0 -297
  1274. package/dist/utils/trpc-analyzer.js.map +0 -1
  1275. package/src/__tests__/context-engine/cross-file-taint.test.ts +0 -284
  1276. package/src/__tests__/context-engine/function-classifier.test.ts +0 -146
  1277. package/src/__tests__/context-engine/integration.test.ts +0 -320
  1278. package/src/__tests__/context-engine/sanitiser-detection.test.ts +0 -187
  1279. package/src/__tests__/context-engine/sink-matcher.test.ts +0 -251
  1280. package/src/__tests__/context-engine/source-discovery.test.ts +0 -186
  1281. package/src/__tests__/context-engine/taint-tracker.test.ts +0 -182
  1282. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +0 -750
  1283. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +0 -555
  1284. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +0 -321
  1285. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +0 -439
  1286. package/src/detect/ai-code/agent-tools.ts +0 -1662
  1287. package/src/detect/ai-code/byok-patterns.ts +0 -354
  1288. package/src/detect/ai-code/endpoint-protection.ts +0 -406
  1289. package/src/detect/ai-code/execution-sinks.ts +0 -1310
  1290. package/src/detect/ai-code/fingerprinting.ts +0 -774
  1291. package/src/detect/ai-code/mcp-security.ts +0 -937
  1292. package/src/detect/ai-code/model-supply-chain.ts +0 -535
  1293. package/src/detect/ai-code/package-hallucination.ts +0 -955
  1294. package/src/detect/ai-code/prompt-hygiene.ts +0 -1314
  1295. package/src/detect/ai-code/rag-safety.ts +0 -977
  1296. package/src/detect/ai-code/schema-validation.ts +0 -427
  1297. package/src/detect/secrets/patterns.ts +0 -561
  1298. package/src/detect/secrets/weak-crypto.ts +0 -485
  1299. package/src/detect/structural/__tests__/math-random-enhanced.test.ts +0 -405
  1300. package/src/detect/structural/auth-patterns.ts +0 -621
  1301. package/src/detect/structural/dangerous-functions/child-process.ts +0 -98
  1302. package/src/detect/structural/dangerous-functions/dom-xss.ts +0 -292
  1303. package/src/detect/structural/dangerous-functions/index.ts +0 -1556
  1304. package/src/detect/structural/dangerous-functions/json-parse.ts +0 -393
  1305. package/src/detect/structural/dangerous-functions/math-random.ts +0 -789
  1306. package/src/detect/structural/dangerous-functions/patterns.ts +0 -176
  1307. package/src/detect/structural/dangerous-functions/request-validation.ts +0 -153
  1308. package/src/detect/structural/dangerous-functions/utils/control-flow.ts +0 -35
  1309. package/src/detect/structural/dangerous-functions/utils/helpers.ts +0 -170
  1310. package/src/detect/structural/dangerous-functions/utils/index.ts +0 -25
  1311. package/src/detect/structural/dangerous-functions/utils/schema-validation.ts +0 -106
  1312. package/src/detect/structural/data-exposure.ts +0 -302
  1313. package/src/detect/structural/framework-checks.ts +0 -439
  1314. package/src/detect/structural/log-injection.ts +0 -254
  1315. package/src/detect/structural/logic-gates.ts +0 -256
  1316. package/src/detect/structural/risky-imports.ts +0 -197
  1317. package/src/detect/structural/security-headers.ts +0 -231
  1318. package/src/detect/structural/ssrf-detection.ts +0 -300
  1319. package/src/detect/structural/variables.ts +0 -177
  1320. package/src/detect/structural/xxe-detection.ts +0 -295
  1321. package/src/model/cross-file-taint.ts +0 -374
  1322. package/src/model/function-classifier.ts +0 -184
  1323. package/src/model/sanitiser-detection.ts +0 -268
  1324. package/src/model/sink-matcher.ts +0 -178
  1325. package/src/model/sink-patterns.ts +0 -109
  1326. package/src/model/source-discovery.ts +0 -209
  1327. package/src/model/taint-tracker.ts +0 -333
  1328. package/src/score/auto-dismiss.ts +0 -224
@@ -1,1152 +0,0 @@
1
- "use strict";
2
- /**
3
- * Layer 2: Dangerous Function Call Analysis
4
- *
5
- * Detects usage of dangerous functions that can lead to security vulnerabilities.
6
- * This module orchestrates detection across multiple specialized modules.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.DANGEROUS_FUNCTIONS = void 0;
10
- exports.detectDangerousFunctions = detectDangerousFunctions;
11
- const context_helpers_1 = require("../../utils/context-helpers");
12
- // Pattern definitions
13
- const patterns_1 = require("./patterns");
14
- // Child process detection
15
- const child_process_1 = require("./child-process");
16
- // DOM/XSS detection
17
- const dom_xss_1 = require("./dom-xss");
18
- // JSON.parse detection
19
- const json_parse_1 = require("./json-parse");
20
- // Math.random detection
21
- const math_random_1 = require("./math-random");
22
- // Request validation detection
23
- const request_validation_1 = require("./request-validation");
24
- // Utilities
25
- const control_flow_1 = require("./utils/control-flow");
26
- const schema_validation_1 = require("./utils/schema-validation");
27
- const helpers_1 = require("./utils/helpers");
28
- // Re-export types and patterns for external use
29
- var patterns_2 = require("./patterns");
30
- Object.defineProperty(exports, "DANGEROUS_FUNCTIONS", { enumerable: true, get: function () { return patterns_2.DANGEROUS_FUNCTIONS; } });
31
- /**
32
- * Main detection function for dangerous function calls
33
- */
34
- function detectDangerousFunctions(content, filePath, options) {
35
- const vulnerabilities = [];
36
- // Skip scanner/fixture files to avoid self-detection
37
- if ((0, context_helpers_1.isScannerOrFixtureFile)(filePath)) {
38
- return vulnerabilities;
39
- }
40
- const lines = options?.parsed?.lines ?? content.split('\n');
41
- const isTestFile = (0, context_helpers_1.isTestOrMockFile)(filePath);
42
- lines.forEach((line, index) => {
43
- // Skip comment lines
44
- if ((0, context_helpers_1.isComment)(line))
45
- return;
46
- for (const funcPattern of patterns_1.DANGEROUS_FUNCTIONS) {
47
- // Check language filter
48
- if (!(0, patterns_1.matchesLanguage)(filePath, funcPattern.languages))
49
- continue;
50
- const regex = new RegExp(funcPattern.pattern.source, funcPattern.pattern.flags);
51
- if (regex.test(line)) {
52
- // Special handling for innerHTML patterns
53
- if (funcPattern.name === 'innerHTML assignment' ||
54
- funcPattern.name === 'dangerouslySetInnerHTML') {
55
- handleInnerHTMLPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
56
- break;
57
- }
58
- // Note: JSON.parse is now handled by standalone detectJSONParseSafe() function
59
- // which provides better source-aware severity classification
60
- // Special handling for eval and Function constructor
61
- if (funcPattern.name === 'eval() usage' ||
62
- funcPattern.name === 'Function constructor') {
63
- if (handleEvalPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities)) {
64
- break;
65
- }
66
- continue;
67
- }
68
- // Special handling for child_process exec - verify it's not RegExp.exec
69
- if (funcPattern.name === 'child_process exec') {
70
- if (handleChildProcessPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines)) {
71
- break;
72
- }
73
- continue;
74
- }
75
- // Special handling for SQL patterns - check for whitelist validation
76
- if (funcPattern.name === 'Raw SQL query construction' ||
77
- funcPattern.name === 'SQL template literal') {
78
- handleSQLPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
79
- break;
80
- }
81
- // Special handling for dynamic file paths - check for path traversal protection
82
- if (funcPattern.name === 'Dynamic file path' ||
83
- funcPattern.name === 'Path traversal risk') {
84
- handleFilePathPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
85
- break;
86
- }
87
- // Special handling for Math.random
88
- if (funcPattern.name === 'Math.random for security') {
89
- handleMathRandomPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities);
90
- break;
91
- }
92
- // Special handling for Python subprocess/os.system
93
- if (funcPattern.name === 'os.system/subprocess (Python)') {
94
- handlePythonSubprocessPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
95
- break;
96
- }
97
- // Special handling for regex patterns - check for escaped input
98
- if (funcPattern.name === 'Potentially unsafe regex') {
99
- handleRegexPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
100
- break;
101
- }
102
- // Special handling for spread operator with user input
103
- if (funcPattern.name === 'Spread operator with user input') {
104
- handleSpreadPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines);
105
- break;
106
- }
107
- // Standard handling for all other patterns
108
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
109
- break; // Only report once per line
110
- }
111
- }
112
- });
113
- // Additional standalone checks (not in DANGEROUS_FUNCTIONS array)
114
- // JSON.parse source-aware detection
115
- (0, json_parse_1.detectJSONParseSafe)(content, filePath, isTestFile, vulnerabilities);
116
- // request.json() / req.json() schema validation suggestion
117
- (0, request_validation_1.detectRequestJsonValidation)(content, filePath, isTestFile, vulnerabilities);
118
- return vulnerabilities;
119
- }
120
- /**
121
- * Handle innerHTML/dangerouslySetInnerHTML patterns
122
- */
123
- function handleInnerHTMLPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
124
- // Check if this is a style element (CSS injection is not XSS)
125
- if ((0, dom_xss_1.isStyleElementInnerHTML)(line, content, index, lines)) {
126
- // Style elements with CSS are safe - don't report anything
127
- // CSS cannot execute JavaScript, so there's no XSS risk
128
- return;
129
- }
130
- // Check if this uses static content only - skip entirely (safe)
131
- if ((0, dom_xss_1.isStaticHTMLContent)(line, content, index, lines)) {
132
- return; // Static HTML is safe - no finding needed
133
- }
134
- // Check if DOMPurify or similar sanitization is used - skip entirely (safe)
135
- if ((0, dom_xss_1.hasDOMPurifySanitization)(line, content, index, lines)) {
136
- return; // Sanitized HTML is safe - no finding needed
137
- }
138
- // Check if this is a static bootstrap script (e.g., theme/font loader) - skip entirely (safe)
139
- if ((0, dom_xss_1.isStaticBootstrapScript)(line, content, index, lines)) {
140
- return; // Static bootstrap scripts are safe - no finding needed
141
- }
142
- // Check if this uses output from trusted HTML rendering libraries (Shiki, highlight.js, marked, etc.)
143
- // These libraries produce sanitized HTML output
144
- if ((0, dom_xss_1.isTrustedLibraryHTMLOutput)(line, content, index, lines)) {
145
- return; // Trusted library output is safe - no finding needed
146
- }
147
- // Check if this is in LLM prompt context (not XSS - it's prompt injection)
148
- if ((0, dom_xss_1.isLLMPromptContext)(line, content, filePath)) {
149
- vulnerabilities.push({
150
- id: `dangerous-func-${filePath}-${index + 1}-prompt-injection`,
151
- filePath,
152
- lineNumber: index + 1,
153
- lineContent: line.trim(),
154
- severity: 'info',
155
- category: 'ai_pattern',
156
- title: 'Potential prompt injection risk',
157
- description: 'User content is being used in an LLM prompt context. This is NOT XSS (the content goes to an AI, not a DOM). However, untrusted content in prompts may lead to prompt injection attacks.',
158
- suggestedFix: 'Consider input validation, content filtering, or structured prompts to limit prompt injection risk.',
159
- confidence: 'low',
160
- layer: 2,
161
- });
162
- return;
163
- }
164
- // Dynamic content - full severity, needs AI validation
165
- let severity = funcPattern.severity;
166
- if (isTestFile) {
167
- severity = 'low';
168
- }
169
- vulnerabilities.push({
170
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
171
- filePath,
172
- lineNumber: index + 1,
173
- lineContent: line.trim(),
174
- severity,
175
- category: 'dangerous_function',
176
- title: funcPattern.name,
177
- description: funcPattern.description +
178
- ' This appears to use dynamic content which increases XSS risk.' +
179
- (isTestFile ? ' (in test file)' : ''),
180
- suggestedFix: funcPattern.suggestedFix,
181
- confidence: isTestFile ? 'low' : 'high',
182
- layer: 2,
183
- requiresAIValidation: true, // Dynamic HTML needs validation
184
- });
185
- }
186
- /**
187
- * Handle eval and Function constructor patterns
188
- * Returns true if a finding was added, false otherwise
189
- */
190
- function handleEvalPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities) {
191
- // Check if "eval" or "Function" appears inside a string literal
192
- // e.g., const docs = "Don't use eval() in production"
193
- // This is NOT an actual eval call, just documentation/comments
194
- const evalInsideStringPattern = /(['"`])(?:[^\\]|\\.)*?\beval\s*\(.*?\1/;
195
- const functionInsideStringPattern = /(['"`])(?:[^\\]|\\.)*?\bFunction\s*\(.*?\1/;
196
- if (evalInsideStringPattern.test(line) || functionInsideStringPattern.test(line)) {
197
- return true; // Skip - this is just a string mentioning eval, not actual eval()
198
- }
199
- // Suppress entirely in test files - test files legitimately test eval behavior
200
- if (isTestFile) {
201
- return true; // Skip reporting entirely
202
- }
203
- // Check if eval is inside a test assertion (expect(), test(), it(), describe())
204
- const testAssertionPattern = /\b(expect|test|it|describe)\s*\(/;
205
- if (testAssertionPattern.test(line)) {
206
- return true; // Skip reporting - this is testing eval behavior
207
- }
208
- // Check if inputs are static literals (low risk) - skip entirely
209
- if ((0, helpers_1.hasOnlyStaticInputs)(line, content, index)) {
210
- return true; // Static eval is safe enough - no finding needed
211
- }
212
- vulnerabilities.push({
213
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
214
- filePath,
215
- lineNumber: index + 1,
216
- lineContent: line.trim(),
217
- severity: funcPattern.severity,
218
- category: 'dangerous_function',
219
- title: funcPattern.name,
220
- description: funcPattern.description,
221
- suggestedFix: funcPattern.suggestedFix,
222
- confidence: 'high',
223
- layer: 2,
224
- requiresAIValidation: true, // Code execution patterns need validation
225
- });
226
- return true;
227
- }
228
- /**
229
- * Handle child_process exec patterns
230
- * Returns true if a finding was added, false otherwise
231
- */
232
- function handleChildProcessPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
233
- // First check if this is actually from child_process (not RegExp.exec)
234
- const isExecMatch = /\bexec\s*\(/.test(line);
235
- const isOtherMatch = /\b(execSync|spawn|spawnSync|execFile)\s*\(/.test(line);
236
- if (isExecMatch && !isOtherMatch) {
237
- // This matched 'exec(' - verify it's from child_process
238
- if (!(0, child_process_1.isChildProcessExec)(content, line)) {
239
- // This is RegExp.exec or similar - skip
240
- return false;
241
- }
242
- }
243
- else if (isOtherMatch) {
244
- // This matched spawn/execSync/etc - verify child_process import
245
- if (!(0, child_process_1.isChildProcessSpawn)(content, line)) {
246
- // No child_process import - skip
247
- return false;
248
- }
249
- }
250
- // Check if arguments are validated via allowlist
251
- const _lines = lines ?? content.split('\n');
252
- const contextStart = Math.max(0, index - 15);
253
- const contextEnd = Math.min(_lines.length, index + 5);
254
- const context = _lines.slice(contextStart, contextEnd).join('\n');
255
- // Detect allowlist validation patterns before exec/spawn
256
- const hasArgAllowlist = /allowedArgs\.includes\s*\(/i.test(context) ||
257
- /if\s*\(\s*!?allowedArgs\.includes/i.test(context) ||
258
- /if\s*\(\s*!?\w+Args\.includes/i.test(context) ||
259
- /validArgs\.includes/i.test(context) ||
260
- // ALLOWED_COMMANDS pattern (common naming convention)
261
- /ALLOWED_\w+\.includes\s*\(/i.test(context) ||
262
- /if\s*\(\s*!?ALLOWED_\w+\.includes/i.test(context) ||
263
- // allowedCommands, validCommands, safeCommands
264
- /allowed(?:Commands?|Cmds?)\.includes\s*\(/i.test(context) ||
265
- /valid(?:Commands?|Cmds?)\.includes\s*\(/i.test(context) ||
266
- /safe(?:Commands?|Cmds?)\.includes\s*\(/i.test(context) ||
267
- // Generic whitelist/allowlist check
268
- /(?:whitelist|allowlist)\.includes\s*\(/i.test(context);
269
- // execFile with hardcoded command is safe (safer than exec)
270
- const isExecFileWithHardcodedCmd = /execFile\s*\(\s*['"][^'"]+['"]/i.test(line);
271
- if (hasArgAllowlist || isExecFileWithHardcodedCmd) {
272
- return true; // Allowlisted or execFile with hardcoded command - safe
273
- }
274
- if ((0, helpers_1.hasOnlyStaticInputs)(line, content, index)) {
275
- return true; // Static command is safe - no finding needed
276
- }
277
- // Check for build/script context with hardcoded command + args array
278
- const isBuildScript = /(build|generate|format|lint|setup|deploy|migrate|compile)/i.test(filePath) ||
279
- /\/(scripts?|tools?|bin)\//i.test(filePath);
280
- if (isBuildScript) {
281
- // spawnSync("cmd", ["arg1", "arg2"]) with string literal command is safe in build scripts
282
- const hasHardcodedCommand = /spawn(?:Sync)?\s*\(\s*['"][^'"]+['"]/.test(line);
283
- if (hasHardcodedCommand) {
284
- vulnerabilities.push({
285
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
286
- filePath,
287
- lineNumber: index + 1,
288
- lineContent: line.trim(),
289
- severity: 'info',
290
- category: 'dangerous_function',
291
- title: funcPattern.name + ' (build script)',
292
- description: 'Shell command execution in build/tooling script with hardcoded command. Build scripts are developer-controlled.',
293
- suggestedFix: 'Ensure this script is not exposed to untrusted input.',
294
- confidence: 'low',
295
- layer: 2,
296
- });
297
- return true;
298
- }
299
- }
300
- // Check for desktop app or MCP server context
301
- // These contexts legitimately spawn processes
302
- const isDesktopApp = (0, context_helpers_1.isDesktopAppContext)(filePath);
303
- const isMcpServer = (0, context_helpers_1.isMcpServerContext)(filePath);
304
- if (isDesktopApp || isMcpServer) {
305
- // Desktop apps and MCP servers legitimately spawn processes
306
- // Still report but with reduced severity and context
307
- const contextType = isDesktopApp ? 'desktop app' : 'MCP server';
308
- vulnerabilities.push({
309
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
310
- filePath,
311
- lineNumber: index + 1,
312
- lineContent: line.trim(),
313
- severity: 'medium', // Reduced from high
314
- category: 'dangerous_function',
315
- title: `${funcPattern.name} (${contextType})`,
316
- description: `${funcPattern.description} (Expected in ${contextType} context - verify input validation)`,
317
- suggestedFix: 'Ensure command arguments from IPC are validated against an allowlist.',
318
- confidence: 'medium',
319
- layer: 2,
320
- });
321
- return true;
322
- }
323
- // Dynamic command - report with standard severity
324
- let severity = funcPattern.severity;
325
- let confidence = 'high';
326
- if (isTestFile) {
327
- if (severity === 'critical') {
328
- severity = 'medium';
329
- }
330
- else if (severity === 'high') {
331
- severity = 'low';
332
- }
333
- else {
334
- severity = 'info';
335
- }
336
- confidence = 'low';
337
- }
338
- vulnerabilities.push({
339
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
340
- filePath,
341
- lineNumber: index + 1,
342
- lineContent: line.trim(),
343
- severity,
344
- category: 'dangerous_function',
345
- title: funcPattern.name,
346
- description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
347
- suggestedFix: funcPattern.suggestedFix,
348
- confidence,
349
- layer: 2,
350
- });
351
- return true;
352
- }
353
- /**
354
- * Handle SQL injection patterns
355
- */
356
- function handleSQLPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
357
- // Check for whitelist validation - skip entirely (safe)
358
- if ((0, schema_validation_1.hasSQLWhitelistValidation)(content, index)) {
359
- return; // Whitelist validated - safe, no finding needed
360
- }
361
- // Check for ORM methods (not raw SQL) - skip entirely (safe)
362
- // Prisma: prisma.user.findMany({ where: {...} })
363
- // Sequelize: Model.findAll({ where: {...} })
364
- // TypeORM: repository.find({ where: {...} })
365
- const ormMethodPattern = /\.(findMany|findUnique|findFirst|findAll|find|create|update|delete|upsert)\s*\(\s*\{/i;
366
- if (ormMethodPattern.test(line)) {
367
- return; // ORM method - safe, no finding needed
368
- }
369
- // Check for parameterized queries - skip entirely (safe)
370
- // e.g., db.query('SELECT * FROM users WHERE id = $1', [userId])
371
- const parameterizedQueryPattern = /\.\s*(query|execute)\s*\(\s*['"`][^${}]+['"`]\s*,\s*\[/;
372
- if (parameterizedQueryPattern.test(line)) {
373
- return; // Parameterized query - safe, no finding needed
374
- }
375
- // Knex .raw() with ? placeholders and array binding - this IS parameterized
376
- // e.g., db.raw(`"table"."col" + ?`, [value]) or db.raw('SELECT ... WHERE id = ?', [id])
377
- const knexRawParameterized = /\.raw\s*\(\s*[`'"]/i.test(line) &&
378
- /\?\s*[`'"]\s*,\s*\[/.test(line);
379
- if (knexRawParameterized) {
380
- return; // Knex .raw() with ? placeholders is parameterized - safe
381
- }
382
- // Knex .raw() with only const enum/table name interpolation (not user input)
383
- // e.g., db.raw(`"${TableName.Users}"."col"`) where TableName is a const enum
384
- const knexRawConstInterpolation = /\.raw\s*\(\s*`/.test(line) &&
385
- /\$\{[A-Z][A-Za-z]*\.[A-Z]/.test(line);
386
- if (knexRawConstInterpolation) {
387
- const interpolations = line.match(/\$\{([^}]+)\}/g) || [];
388
- const allConst = interpolations.every(i => /^\$\{[A-Z_][A-Z_a-z]*\./.test(i));
389
- if (allConst) {
390
- return; // Only const enum interpolation - safe
391
- }
392
- }
393
- // Knex .raw() for SET statement_timeout (infrastructure, not user input)
394
- // e.g., trx.raw(`SET statement_timeout = ${QUERY_TIMEOUT_MS}`)
395
- const isSetStatement = /\.raw\s*\(\s*[`'"]SET\s+/i.test(line);
396
- if (isSetStatement) {
397
- return; // SET statements are infrastructure config, not queries with user data
398
- }
399
- // DROP TRIGGER / DDL statements from migration/schema files
400
- const isDDLStatement = /\.raw\s*\(\s*[`'"](DROP|CREATE|ALTER)\s+/i.test(line) &&
401
- /(migration|schema|seed)/i.test(filePath);
402
- if (isDDLStatement) {
403
- return; // DDL in migration/schema files - not user-facing
404
- }
405
- // Check for Prisma tagged template literal - these ARE parameterized (safe)
406
- // Prisma's $queryRaw`...${var}...` treats ${} as parameterized values, not string interpolation
407
- // e.g., prisma.$queryRaw`SELECT * FROM users WHERE id = ${userId}`
408
- const prismaTaggedTemplatePattern = /\$queryRaw\s*`[^`]*\$\{/i;
409
- if (prismaTaggedTemplatePattern.test(line)) {
410
- return; // Prisma tagged template - parameterized and safe, no finding needed
411
- }
412
- // Check for schema-validated input (zod .enum() for table/column names)
413
- // e.g., z.enum(['users', 'posts']).parse(input) followed by SQL
414
- const _lines = lines ?? content.split('\n');
415
- const contextStart = Math.max(0, index - 20);
416
- const contextEnd = index;
417
- const previousContext = _lines.slice(contextStart, contextEnd).join('\n');
418
- // Detect zod enum validation for SQL identifiers
419
- const hasSchemaValidation = /z\s*\.\s*enum\s*\(\s*\[['"][^'"]+['"]/i.test(previousContext) ||
420
- /\.parse\s*\(\s*JSON\.parse/.test(previousContext) ||
421
- // Allow validated table/column names from parsed schema
422
- /schema\.parse/.test(previousContext) ||
423
- /const\s+parsed\s*=\s*schema/.test(previousContext);
424
- if (hasSchemaValidation) {
425
- return; // Schema-validated SQL identifiers - safe, no finding needed
426
- }
427
- // No whitelist - report with standard severity
428
- let severity = funcPattern.severity;
429
- let confidence = 'high';
430
- if (isTestFile) {
431
- if (severity === 'critical') {
432
- severity = 'medium';
433
- }
434
- else if (severity === 'high') {
435
- severity = 'low';
436
- }
437
- else {
438
- severity = 'info';
439
- }
440
- confidence = 'low';
441
- }
442
- vulnerabilities.push({
443
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
444
- filePath,
445
- lineNumber: index + 1,
446
- lineContent: line.trim(),
447
- severity,
448
- category: 'dangerous_function',
449
- title: funcPattern.name,
450
- description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
451
- suggestedFix: funcPattern.suggestedFix,
452
- confidence,
453
- layer: 2,
454
- });
455
- }
456
- /**
457
- * Handle dynamic file path patterns
458
- */
459
- function handleFilePathPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
460
- // Check for desktop app context (Electron, Tauri, etc.)
461
- // Desktop apps legitimately access filesystem
462
- const isDesktopApp = (0, context_helpers_1.isDesktopAppContext)(filePath);
463
- // Check for file loader context
464
- // File loaders legitimately access filesystem to process files
465
- const isFileLoader = (0, context_helpers_1.isFileLoaderContext)(filePath);
466
- // Desktop apps and file loaders are expected to access filesystem
467
- if (isDesktopApp || isFileLoader) {
468
- const contextType = isDesktopApp ? 'desktop app' : 'file loader';
469
- vulnerabilities.push({
470
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
471
- filePath,
472
- lineNumber: index + 1,
473
- lineContent: line.trim(),
474
- severity: 'info',
475
- category: 'dangerous_function',
476
- title: `${funcPattern.name} (${contextType})`,
477
- description: `Dynamic file path in ${contextType} context. File system access is expected functionality. Verify path inputs are validated.`,
478
- suggestedFix: 'Ensure file paths are validated and constrained to expected directories.',
479
- confidence: 'low',
480
- layer: 2,
481
- });
482
- return;
483
- }
484
- // Check file context for CLI/tooling (lower risk)
485
- const isCLITool = /\/(cli|scripts?|tools?|bin)\//i.test(filePath) ||
486
- /cli\.(ts|js)$/i.test(filePath);
487
- // Check for GitHub Action context (workflow-controlled paths)
488
- const isGitHubAction = /\/(github-action|actions?)\//i.test(filePath) ||
489
- /action\.(ts|js)$/i.test(filePath);
490
- // Check for utility/helper file context (called by trusted code)
491
- const isUtilityFile = /\/(utils?|helpers?|lib|common|shared)\//i.test(filePath) ||
492
- /(util(s)?|helper(s)?|checksum|hash)\.(ts|js)$/i.test(filePath);
493
- // Check for server infrastructure/config files (transport, signing, credentials)
494
- // These files read/write config-controlled paths, not user input
495
- const isServerInfrastructureFile = /\/(transports?|signing|credentials?|certificates?|certs?)\//i.test(filePath) ||
496
- /\/(config|infrastructure|provisioning)\//i.test(filePath) ||
497
- /(transport|signer|credential|certificate)\.(ts|js)$/i.test(filePath);
498
- // Get surrounding context for protection check
499
- const _lines = lines ?? content.split('\n');
500
- const contextStart = Math.max(0, index - 10);
501
- const contextEnd = Math.min(_lines.length, index + 10);
502
- const context = _lines.slice(contextStart, contextEnd).join('\n');
503
- // Check if path comes from directory iteration (fs.readdir, fs.readdirSync)
504
- // These paths are filesystem-controlled, not user input
505
- const hasDirectoryIteration = /\b(readdir|readdirSync|opendir|opendirSync)\s*\(/.test(content) &&
506
- (/for\s*\(\s*(const|let|var)\s+\w+\s+of/.test(context) ||
507
- /\.forEach\s*\(/.test(context) ||
508
- /\.map\s*\(/.test(context) || // array.map() iteration
509
- /pMap\s*\(/.test(context) || // p-map library (parallel map)
510
- /Promise\.all\s*\(/.test(context) || // Promise.all mapping
511
- /entry\.(name|isFile|isDirectory)/.test(context) ||
512
- /dirent\.(name|isFile|isDirectory)/.test(context));
513
- if ((0, helpers_1.hasPathTraversalProtection)(context, line)) {
514
- vulnerabilities.push({
515
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
516
- filePath,
517
- lineNumber: index + 1,
518
- lineContent: line.trim(),
519
- severity: 'info',
520
- category: 'dangerous_function',
521
- title: funcPattern.name + ' (protected)',
522
- description: 'Dynamic file path with path traversal protection detected. Verify the protection is complete and covers all attack vectors.',
523
- suggestedFix: 'Ensure path normalization and base directory checks are applied consistently.',
524
- confidence: 'low',
525
- layer: 2,
526
- });
527
- return;
528
- }
529
- // Directory iteration paths are filesystem-controlled (not user input)
530
- if (hasDirectoryIteration) {
531
- // Skip entirely - paths from fs.readdir are not user-controlled
532
- return;
533
- }
534
- // Check for Object.entries/keys/values over hardcoded objects
535
- // Pattern: for (const [key, val] of Object.entries(STATIC_OBJ))
536
- const hasHardcodedObjectIteration = (() => {
537
- // Look for Object.entries/keys/values in context
538
- const hasObjectIteration = /Object\.(entries|keys|values)\s*\(/.test(context);
539
- if (!hasObjectIteration)
540
- return false;
541
- // Check if the object being iterated is defined as a const literal nearby
542
- // Pattern: const objName = { ... }; ... Object.entries(objName)
543
- const objectMatch = context.match(/Object\.(entries|keys|values)\s*\(\s*(\w+)\s*\)/);
544
- if (!objectMatch)
545
- return false;
546
- const objName = objectMatch[2];
547
- // Check if objName is defined as a const object literal in the file
548
- const isConstObject = new RegExp(`const\\s+${objName}\\s*=\\s*\\{`).test(content);
549
- return isConstObject;
550
- })();
551
- if (hasHardcodedObjectIteration) {
552
- // Skip entirely - iterating over hardcoded object, not user input
553
- return;
554
- }
555
- // GitHub Action paths are workflow-controlled (not arbitrary user input)
556
- if (isGitHubAction) {
557
- vulnerabilities.push({
558
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
559
- filePath,
560
- lineNumber: index + 1,
561
- lineContent: line.trim(),
562
- severity: 'info',
563
- category: 'dangerous_function',
564
- title: funcPattern.name + ' (GitHub Action)',
565
- description: 'Dynamic file path in GitHub Action. Paths are typically controlled by workflow configuration, not arbitrary user input.',
566
- suggestedFix: 'Verify paths come from trusted action inputs or environment variables.',
567
- confidence: 'low',
568
- layer: 2,
569
- });
570
- return;
571
- }
572
- // CLI tools with dynamic paths are lower risk (trusted operator)
573
- if (isCLITool) {
574
- vulnerabilities.push({
575
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
576
- filePath,
577
- lineNumber: index + 1,
578
- lineContent: line.trim(),
579
- severity: 'info',
580
- category: 'dangerous_function',
581
- title: funcPattern.name + ' (CLI tool)',
582
- description: 'Dynamic file path in CLI tool. CLI tools typically have trusted operators, but consider adding path validation if user input is involved.',
583
- suggestedFix: 'Add path validation if accepting paths from untrusted sources.',
584
- confidence: 'low',
585
- layer: 2,
586
- });
587
- return;
588
- }
589
- // Utility/helper files with function parameters are lower risk (called by trusted code)
590
- // Check if path variable appears to be a function parameter, not from request
591
- const hasRequestData = /req\.(params|query|body)|request\.(params|query|body)/i.test(context);
592
- if (isUtilityFile && !hasRequestData) {
593
- // Skip entirely - utility functions receive paths from trusted callers
594
- return;
595
- }
596
- // Server infrastructure files (signing, transport, credentials) use config-controlled paths
597
- // These paths come from environment variables or internal configuration, not user input
598
- if (isServerInfrastructureFile && !hasRequestData) {
599
- // Check if path comes from environment variables or function parameters
600
- const hasEnvVarPath = /process\.env\.|import\.meta\.env\.|env\s*\(/i.test(context);
601
- const hasConfigPath = /config\.|settings\.|credentials?\./i.test(context);
602
- const hasCertPath = /certPath|keyPath|credentialsPath|googleApplicationCredentials/i.test(context);
603
- if (hasEnvVarPath || hasConfigPath || hasCertPath) {
604
- // Skip entirely - paths from env vars/config are not user-controlled
605
- return;
606
- }
607
- }
608
- // Check if file path variable comes from environment variable wrapper function
609
- // Common pattern: env('VAR_NAME') || 'default', process.env.VAR, etc.
610
- const hasEnvVarSource = /env\s*\(\s*['"][^'"]+['"]\s*\)|process\.env\.\w+|import\.meta\.env\.\w+/i.test(context);
611
- const hasOnlyConfigSource = hasEnvVarSource && !hasRequestData;
612
- if (hasOnlyConfigSource) {
613
- // Path comes from environment variable, not user input - skip
614
- return;
615
- }
616
- // Standard handling for unprotected paths
617
- let severity = funcPattern.severity;
618
- let confidence = 'high';
619
- if (isTestFile) {
620
- if (severity === 'critical') {
621
- severity = 'medium';
622
- }
623
- else if (severity === 'high') {
624
- severity = 'low';
625
- }
626
- else {
627
- severity = 'info';
628
- }
629
- confidence = 'low';
630
- }
631
- vulnerabilities.push({
632
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
633
- filePath,
634
- lineNumber: index + 1,
635
- lineContent: line.trim(),
636
- severity,
637
- category: 'dangerous_function',
638
- title: funcPattern.name,
639
- description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
640
- suggestedFix: funcPattern.suggestedFix,
641
- confidence,
642
- layer: 2,
643
- });
644
- }
645
- /**
646
- * Handle Math.random patterns with context-aware severity
647
- */
648
- function handleMathRandomPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities) {
649
- // Skip entirely for certain contexts
650
- if ((0, math_random_1.shouldSkipMathRandom)(content, filePath, index)) {
651
- return;
652
- }
653
- // Analyze context
654
- const functionName = (0, control_flow_1.extractFunctionContext)(content, index);
655
- const functionIntent = (0, math_random_1.classifyFunctionIntent)(functionName);
656
- const toStringPattern = (0, math_random_1.analyzeToStringPattern)(line);
657
- const variableName = (0, math_random_1.extractMathRandomVariableName)(line);
658
- const variableRisk = (0, math_random_1.classifyVariableNameRisk)(variableName);
659
- const context = (0, math_random_1.analyzeMathRandomContext)(content, filePath, index);
660
- // Determine severity based on all factors
661
- let severity;
662
- let confidence;
663
- let description;
664
- let suggestedFix;
665
- let explanation = '';
666
- // Variable name indicates security risk - check this FIRST before toString patterns
667
- // This ensures 'secret', 'token', 'key' etc. are always flagged as high
668
- if (variableRisk === 'high') {
669
- severity = 'high';
670
- confidence = 'high';
671
- // Update context description to indicate security context
672
- context.contextDescription = 'security-sensitive variable';
673
- description = `Math.random() assigned to security-sensitive variable '${variableName}'. Math.random() is NOT cryptographically secure.`;
674
- suggestedFix =
675
- 'Use crypto.randomBytes() or crypto.getRandomValues() for security-sensitive values.';
676
- }
677
- // Security-sensitive contexts get high severity
678
- else if (context.inSecurityContext || functionIntent === 'security') {
679
- severity = 'high';
680
- confidence = 'high';
681
- description =
682
- 'Math.random() is being used in a security-sensitive context. This is NOT cryptographically secure and should be replaced.';
683
- suggestedFix =
684
- 'Use crypto.randomBytes() for Node.js or crypto.getRandomValues() for browsers.';
685
- }
686
- // Test contexts get info severity
687
- else if (context.inTestContext) {
688
- severity = 'info';
689
- confidence = 'low';
690
- description =
691
- 'Math.random() in test context. Acceptable for test data generation.';
692
- suggestedFix = 'No change needed for test data.';
693
- }
694
- // UUID/CAPTCHA generation - legitimate use
695
- else if (functionIntent === 'uuid' || functionIntent === 'captcha') {
696
- severity = 'info';
697
- confidence = 'low';
698
- description = `Math.random() used for ${functionIntent === 'uuid' ? 'ID generation' : 'CAPTCHA/puzzle'} (not security-sensitive).`;
699
- suggestedFix =
700
- 'For truly unique IDs, consider crypto.randomUUID(). For security tokens, use crypto.randomBytes().';
701
- }
702
- // Demo/seed data - legitimate use
703
- else if (functionIntent === 'demo') {
704
- severity = 'info';
705
- confidence = 'low';
706
- description =
707
- 'Math.random() for demo/seed data generation. Acceptable for non-production data.';
708
- suggestedFix = 'No change needed for demo/seed data.';
709
- }
710
- // Short UI IDs (.toString(36).substring(2,9)) - info
711
- else if (toStringPattern.intent === 'short-ui-id') {
712
- severity = 'info';
713
- confidence = 'low';
714
- explanation = ` (${toStringPattern.truncationLength || '?'}-char string)`;
715
- // Override context description for UI IDs
716
- context.contextDescription = 'UI identifier generation';
717
- description = `Math.random() generating short UI identifier${explanation}. Acceptable for React keys, temp IDs.`;
718
- suggestedFix =
719
- 'For security tokens, use crypto.randomBytes(). For unique IDs, crypto.randomUUID().';
720
- }
721
- // Business IDs (.toString(36) with medium truncation) - low
722
- else if (toStringPattern.intent === 'business-id') {
723
- severity = 'low';
724
- confidence = 'low';
725
- explanation = variableName ? ` (variable: ${variableName})` : '';
726
- description = `Math.random() generating business identifier${explanation}. Verify this is not used for security purposes.`;
727
- suggestedFix =
728
- 'For business IDs, crypto.randomUUID() is preferred. For security tokens, use crypto.randomBytes().';
729
- }
730
- // Full token (.toString(36) without truncation) - severity based on variable name
731
- else if (toStringPattern.intent === 'full-token') {
732
- // Note: high-risk variable names are already handled above
733
- if (variableRisk === 'low') {
734
- severity = 'low';
735
- confidence = 'low';
736
- }
737
- else {
738
- severity = 'medium';
739
- confidence = 'medium';
740
- }
741
- explanation = variableName ? ` (variable: ${variableName})` : '';
742
- description = `Math.random() generating full-length random string${explanation}. This pattern is often used for security tokens.`;
743
- suggestedFix =
744
- 'Use crypto.randomBytes() for security tokens. Use crypto.randomUUID() for unique IDs.';
745
- }
746
- // UI/cosmetic context - info (skeleton widths, animations, visual effects)
747
- else if (context.inUIContext) {
748
- severity = 'info';
749
- confidence = 'low';
750
- description =
751
- 'Math.random() in UI/cosmetic context. Acceptable for visual effects, skeleton loading, animations.';
752
- suggestedFix = 'No change needed for UI/cosmetic randomness.';
753
- }
754
- // Business logic context - low
755
- else if (context.inBusinessLogicContext) {
756
- severity = 'low';
757
- confidence = 'low';
758
- description =
759
- 'Math.random() in business logic context (backoff, sampling, experiments). Verify this is not for security.';
760
- suggestedFix =
761
- 'If used for security, replace with crypto.randomBytes(). Otherwise, usage is acceptable.';
762
- }
763
- // Unknown context - medium
764
- else {
765
- severity = 'medium';
766
- confidence = 'medium';
767
- description =
768
- 'Math.random() is being used. Verify this is not for security-critical purposes like tokens, session IDs, or cryptographic operations.';
769
- suggestedFix =
770
- 'If used for security, replace with crypto.randomBytes(). For unique IDs, use crypto.randomUUID()';
771
- }
772
- // Update title with context
773
- const title = `Math.random() in ${context.contextDescription}${explanation}`;
774
- vulnerabilities.push({
775
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
776
- filePath,
777
- lineNumber: index + 1,
778
- lineContent: line.trim(),
779
- severity,
780
- category: 'dangerous_function',
781
- title,
782
- description,
783
- suggestedFix,
784
- confidence,
785
- layer: 2,
786
- });
787
- }
788
- /**
789
- * Extract the full Python function call block starting from the trigger line.
790
- * Uses paren-balancing to collect up to `maxLines` forward, capturing multi-line calls.
791
- * Returns the joined block string.
792
- */
793
- function extractPythonCallBlock(lines, startIndex, maxLines = 10) {
794
- let depth = 0;
795
- let started = false;
796
- const blockLines = [];
797
- for (let i = startIndex; i < Math.min(lines.length, startIndex + maxLines); i++) {
798
- const ln = lines[i];
799
- blockLines.push(ln);
800
- for (const ch of ln) {
801
- if (ch === '(') {
802
- depth++;
803
- started = true;
804
- }
805
- else if (ch === ')') {
806
- depth--;
807
- }
808
- }
809
- // Once we've opened at least one paren and balanced back to 0, we're done
810
- if (started && depth <= 0)
811
- break;
812
- }
813
- return blockLines.join('\n');
814
- }
815
- /**
816
- * Check if a Python list (as a string) contains only static string literals.
817
- * Returns true if every element is a plain string literal (no f-strings, no variables).
818
- */
819
- function isPythonListAllStatic(listContent) {
820
- // Remove the outer brackets
821
- const inner = listContent.replace(/^\[/, '').replace(/\]$/, '').trim();
822
- if (!inner)
823
- return true; // empty list
824
- // Split on commas (rough — good enough for typical subprocess args)
825
- const elements = inner.split(',').map(e => e.trim()).filter(e => e.length > 0);
826
- for (const el of elements) {
827
- // Must be a plain string literal: 'foo', "bar", or """...""" / '''...'''
828
- // Reject f-strings, variables, function calls
829
- if (/^f['"`]/.test(el))
830
- return false; // f-string
831
- if (/^['"]/.test(el) && /['"]$/.test(el))
832
- continue; // simple string literal
833
- if (/^"""/.test(el) || /^'''/.test(el))
834
- continue; // triple-quoted
835
- return false; // variable, function call, or other expression
836
- }
837
- return true;
838
- }
839
- /**
840
- * Handle Python subprocess/os.system patterns with multi-line awareness.
841
- *
842
- * Decision tree:
843
- * 1. os.system(...) → HIGH (always dangerous)
844
- * 2. shell=True in call block? → HIGH
845
- * 3. First arg is inline list [...]?
846
- * a. All string literals, no f-strings → SKIP (safe)
847
- * b. Has f-strings or variables → LOW (list args prevent shell injection)
848
- * 4. First arg is a variable name?
849
- * a. Resolved to list nearby, all static → SKIP
850
- * b. Resolved to list nearby, has dynamics → LOW
851
- * c. Can't resolve → LOW (unresolved, flag for review)
852
- * 5. f-string as direct arg (not in list)? → HIGH (command injection)
853
- * 6. Everything else → HIGH (fallback)
854
- */
855
- function handlePythonSubprocessPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
856
- // 1. os.system is always dangerous - no safe usage
857
- if (/os\.system\s*\(/i.test(line)) {
858
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
859
- return;
860
- }
861
- const _lines = lines ?? content.split('\n');
862
- // Extract the full multi-line call block (up to 10 lines forward)
863
- const callBlock = extractPythonCallBlock(_lines, index);
864
- // 2. Check for shell=True across the entire call block
865
- const hasShellTrue = /shell\s*=\s*True/i.test(callBlock);
866
- if (hasShellTrue) {
867
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
868
- return;
869
- }
870
- // 3. Check for inline list args in the call block (not just same line)
871
- const inlineListMatch = callBlock.match(/subprocess\.(run|call|check_output|Popen)\s*\(\s*\[([\s\S]*?)\]/i);
872
- if (inlineListMatch) {
873
- const listContent = '[' + inlineListMatch[2] + ']';
874
- if (isPythonListAllStatic(listContent)) {
875
- // 3a. All static string literals → SKIP (safe)
876
- return;
877
- }
878
- // 3b. Has f-strings or variables → LOW (list args prevent shell injection)
879
- vulnerabilities.push({
880
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
881
- filePath,
882
- lineNumber: index + 1,
883
- lineContent: line.trim(),
884
- severity: isTestFile ? 'info' : 'low',
885
- category: 'dangerous_function',
886
- title: funcPattern.name + ' (list args)',
887
- description: 'subprocess with list arguments (safer than shell=True). Some arguments contain variables or f-strings — verify they are validated.',
888
- suggestedFix: 'Ensure dynamic arguments are validated and sanitized.',
889
- confidence: 'low',
890
- layer: 2,
891
- });
892
- return;
893
- }
894
- // 4. Check for variable reference as first arg
895
- // Pattern: subprocess.run(args, ...) or subprocess.check_output(cmd, ...)
896
- const varArgMatch = callBlock.match(/subprocess\.(run|call|check_output|Popen)\s*\(\s*([a-zA-Z_]\w*)\s*[,)]/i);
897
- if (varArgMatch) {
898
- const varName = varArgMatch[2];
899
- // Look backwards up to 15 lines for assignment: varName = [...]
900
- const searchStart = Math.max(0, index - 15);
901
- const previousLines = _lines.slice(searchStart, index + 1).join('\n');
902
- // Match varName = [...] assignment (possibly multi-line)
903
- const assignmentPattern = new RegExp(varName + '\\s*=\\s*\\[([\\s\\S]*?)\\]', 'i');
904
- const assignmentMatch = previousLines.match(assignmentPattern);
905
- if (assignmentMatch) {
906
- const listContent = '[' + assignmentMatch[1] + ']';
907
- if (isPythonListAllStatic(listContent)) {
908
- // 4a. Variable resolves to all-static list → SKIP
909
- return;
910
- }
911
- // 4b. Variable resolves to list with dynamic elements → LOW
912
- vulnerabilities.push({
913
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
914
- filePath,
915
- lineNumber: index + 1,
916
- lineContent: line.trim(),
917
- severity: isTestFile ? 'info' : 'low',
918
- category: 'dangerous_function',
919
- title: funcPattern.name + ' (list args via variable)',
920
- description: `subprocess called with variable '${varName}' which resolves to a list. List arguments prevent shell injection, but some elements are dynamic.`,
921
- suggestedFix: 'Ensure dynamic list elements are validated and sanitized.',
922
- confidence: 'low',
923
- layer: 2,
924
- });
925
- return;
926
- }
927
- // 4c. Can't resolve the variable — flag for review at LOW
928
- vulnerabilities.push({
929
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
930
- filePath,
931
- lineNumber: index + 1,
932
- lineContent: line.trim(),
933
- severity: isTestFile ? 'info' : 'low',
934
- category: 'dangerous_function',
935
- title: funcPattern.name + ' (unresolved variable)',
936
- description: `subprocess called with variable '${varName}' — could not resolve its value nearby. If it is a list, shell injection risk is low.`,
937
- suggestedFix: 'Verify the variable is a list (not a string) and arguments are validated.',
938
- confidence: 'low',
939
- layer: 2,
940
- });
941
- return;
942
- }
943
- // 5. f-string as direct arg (not inside a list) → HIGH (command injection)
944
- const hasFStringDirectArg = /subprocess\.(run|call|check_output|Popen)\s*\(\s*f['"`]/i.test(callBlock);
945
- if (hasFStringDirectArg) {
946
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
947
- return;
948
- }
949
- // 6. Everything else → HIGH (fallback)
950
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
951
- }
952
- /**
953
- * Handle regex patterns - check for escaped input
954
- * Pattern: new RegExp(escapedInput) or new RegExp(input.replaceAll(...escaped...))
955
- */
956
- function handleRegexPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
957
- const _lines = lines ?? content.split('\n');
958
- const contextStart = Math.max(0, index - 15);
959
- const contextEnd = Math.min(_lines.length, index + 3);
960
- const context = _lines.slice(contextStart, contextEnd).join('\n');
961
- // Check for RegExp object property access (.source, .flags)
962
- // This indicates input is already a validated RegExp, not user string
963
- // e.g., new RegExp(existingRegex.source, existingRegex.flags)
964
- const isRegExpFromRegExp = /\.source\s*[,)\s]/.test(line);
965
- if (isRegExpFromRegExp) {
966
- return; // Safe - .source only exists on RegExp objects (already validated)
967
- }
968
- // Check for escaping ON THE SAME LINE as new RegExp() - this is a strong signal
969
- const sameLineEscapingPatterns = [
970
- /\.replaceAll\s*\([^)]*\)\s*[,)]/i, // .replaceAll(...)) - escaping before RegExp
971
- /escape\w*\s*\([^)]*\)\s*[,)]/i, // escapeRegExp(input)) - function result used
972
- /\.replace\s*\([^,]+,[^)]+\)\s*[,)]/i, // .replace(..., ...) followed by closing
973
- ];
974
- if (sameLineEscapingPatterns.some(p => p.test(line))) {
975
- return; // Safe - escaping applied on same line before RegExp construction
976
- }
977
- // Check previous 5 lines for escaping assignment (extended from 3 to catch multi-line patterns)
978
- const prevLinesStart = Math.max(0, index - 5);
979
- const prevLines = _lines.slice(prevLinesStart, index + 1).join('\n');
980
- // Check for escaping patterns before new RegExp
981
- const escapingPatterns = [
982
- // Direct escaping function calls
983
- /escapeRegExp\s*\(/i, // escapeRegExp(input)
984
- /escapeString\s*\(/i, // escapeString(input)
985
- /escape\s*\(\s*pattern/i, // escape(pattern)
986
- /escapeForRegex\s*\(/i, // escapeForRegex(input)
987
- /regexEscape\s*\(/i, // regexEscape(input)
988
- // replaceAll with regex escape pattern - original strict patterns
989
- /\.replaceAll\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replaceAll(/[special]/g, '\\$&')
990
- /\.replace\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replace(/[special]/g, '\\$&')
991
- // More permissive $& replacement detection (the escape marker)
992
- // $& is the regex replacement marker that inserts the matched string - used for escaping
993
- /\.replace(?:All)?[\s\S]*?['"`]\\*\$&['"`]/, // .replace/.replaceAll with $& anywhere in call
994
- /\.replaceAll?[^;]*\$&/, // .replace/.replaceAll until semicolon with $&
995
- // Lodash/underscore escapeRegExp
996
- /_\.escapeRegExp\s*\(/, // _.escapeRegExp(input)
997
- /lodash.*escapeRegExp/i, // lodash.escapeRegExp
998
- // Variable assignment with escaping (check previous lines)
999
- /escaped\w*\s*=.*\.replace/i, // escapedInput = input.replace(...)
1000
- /safe\w*\s*=.*escape/i, // safePattern = escapeRegExp(...)
1001
- ];
1002
- // Check both previous lines and full context
1003
- const hasEscaping = escapingPatterns.some(p => p.test(line) || p.test(prevLines) || p.test(context));
1004
- // Check for try-catch wrapping (ReDoS contained)
1005
- const hasTryCatch = /try\s*\{[^}]*new\s+RegExp/i.test(context) ||
1006
- (context.includes('try {') && _lines.slice(Math.max(0, index - 5), index + 1).some(l => /try\s*\{/.test(l)));
1007
- // Check for configuration-based patterns (trusted input)
1008
- const isConfigBased = /config\./i.test(line) ||
1009
- /settings\./i.test(line) ||
1010
- /rules\./i.test(line) ||
1011
- /options\.\w+Pattern/i.test(line) ||
1012
- /urlPattern/i.test(line) ||
1013
- /routePattern/i.test(line);
1014
- // Escaped input is safe - skip entirely
1015
- if (hasEscaping) {
1016
- return;
1017
- }
1018
- // Config-based patterns are trusted - skip
1019
- if (isConfigBased) {
1020
- return;
1021
- }
1022
- // Check if regex source is an object property (app-controlled data, not user input)
1023
- // Patterns: obj.pattern, item.regex, l.urlRegExp, entry.matchPattern
1024
- const objectPropertySource = /new\s+RegExp\s*\(\s*\w+\.\w*(regex|pattern|regexp|match|rule|expression|filter)\w*/i.test(line);
1025
- if (objectPropertySource) {
1026
- vulnerabilities.push({
1027
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1028
- filePath,
1029
- lineNumber: index + 1,
1030
- lineContent: line.trim(),
1031
- severity: 'info',
1032
- category: 'dangerous_function',
1033
- title: funcPattern.name + ' (app-controlled)',
1034
- description: 'Dynamic regex from object property. If the regex source is app-defined (not user input), ReDoS risk is minimal.',
1035
- suggestedFix: 'Ensure regex patterns come from trusted, validated sources.',
1036
- confidence: 'low',
1037
- layer: 2,
1038
- });
1039
- return;
1040
- }
1041
- // Check if regex source is from array iteration over app data
1042
- // Pattern: for (const item of items) { new RegExp(item.xxx) }
1043
- const isArrayIterationContext = /for\s*\(\s*(const|let|var)\s+\w+\s+(of|in)\s+/.test(context) &&
1044
- /new\s+RegExp\s*\(\s*\w+\./.test(line);
1045
- if (isArrayIterationContext) {
1046
- vulnerabilities.push({
1047
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1048
- filePath,
1049
- lineNumber: index + 1,
1050
- lineContent: line.trim(),
1051
- severity: 'info',
1052
- category: 'dangerous_function',
1053
- title: funcPattern.name + ' (iteration)',
1054
- description: 'Dynamic regex in array iteration. If iterating over app-defined data, ReDoS risk is minimal.',
1055
- suggestedFix: 'Ensure regex patterns come from trusted sources, not user input.',
1056
- confidence: 'low',
1057
- layer: 2,
1058
- });
1059
- return;
1060
- }
1061
- // Try-catch wrapped - lower severity (ReDoS contained)
1062
- if (hasTryCatch) {
1063
- vulnerabilities.push({
1064
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1065
- filePath,
1066
- lineNumber: index + 1,
1067
- lineContent: line.trim(),
1068
- severity: 'info',
1069
- category: 'dangerous_function',
1070
- title: funcPattern.name + ' (try-catch wrapped)',
1071
- description: 'Dynamic regex with try-catch error handling. ReDoS attacks are contained but may still cause performance issues.',
1072
- suggestedFix: 'Consider using safe-regex library or adding timeout for regex operations.',
1073
- confidence: 'low',
1074
- layer: 2,
1075
- });
1076
- return;
1077
- }
1078
- // Standard handling for unprotected regex
1079
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
1080
- }
1081
- /**
1082
- * Handle spread operator with user input patterns
1083
- * Checks for schema validation (Fastify, Zod, tRPC) that strips unknown properties
1084
- */
1085
- function handleSpreadPattern(funcPattern, line, content, index, filePath, isTestFile, vulnerabilities, lines) {
1086
- const _lines = lines ?? content.split('\n');
1087
- const contextStart = Math.max(0, index - 30);
1088
- const contextEnd = index;
1089
- const context = _lines.slice(contextStart, contextEnd).join('\n');
1090
- // Fastify/Hapi schema validation on route - body is pre-validated
1091
- // Pattern: schema: { body: someSchema } before handler
1092
- const hasRouteSchemaValidation = /schema\s*:\s*\{[^}]*body\s*:\s*\w+/i.test(context) ||
1093
- /body\s*:\s*\w+Schema/i.test(context);
1094
- // Express + Zod/Joi/Yup middleware validation
1095
- const hasMiddlewareValidation = /validate\s*\(\s*\w+Schema\s*\)/i.test(context) ||
1096
- /\.parse\s*\(\s*req\.body\s*\)/i.test(context) ||
1097
- /celebrate\s*\(/i.test(context);
1098
- // tRPC input validation
1099
- const hasTRPCValidation = /\.input\s*\(\s*z\./i.test(context) ||
1100
- /\.input\s*\(\s*\w+Schema\s*\)/i.test(context);
1101
- if (hasRouteSchemaValidation || hasMiddlewareValidation || hasTRPCValidation) {
1102
- vulnerabilities.push({
1103
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1104
- filePath,
1105
- lineNumber: index + 1,
1106
- lineContent: line.trim(),
1107
- severity: 'info',
1108
- category: 'dangerous_function',
1109
- title: funcPattern.name + ' (schema-validated)',
1110
- description: 'Request body is spread but has schema validation. Schema validation strips unknown properties, reducing mass assignment risk.',
1111
- suggestedFix: 'Ensure schema validation is strict (no .passthrough() in Zod, no additionalProperties in JSON Schema).',
1112
- confidence: 'low',
1113
- layer: 2,
1114
- });
1115
- return;
1116
- }
1117
- // No schema validation - standard handling
1118
- handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities);
1119
- }
1120
- /**
1121
- * Handle standard patterns without special logic
1122
- */
1123
- function handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities) {
1124
- let severity = funcPattern.severity;
1125
- let confidence = 'high';
1126
- if (isTestFile) {
1127
- if (severity === 'critical') {
1128
- severity = 'medium';
1129
- }
1130
- else if (severity === 'high') {
1131
- severity = 'low';
1132
- }
1133
- else {
1134
- severity = 'info';
1135
- }
1136
- confidence = 'low';
1137
- }
1138
- vulnerabilities.push({
1139
- id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1140
- filePath,
1141
- lineNumber: index + 1,
1142
- lineContent: line.trim(),
1143
- severity,
1144
- category: 'dangerous_function',
1145
- title: funcPattern.name,
1146
- description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
1147
- suggestedFix: funcPattern.suggestedFix,
1148
- confidence,
1149
- layer: 2,
1150
- });
1151
- }
1152
- //# sourceMappingURL=index.js.map