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