@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,1310 +0,0 @@
1
- /**
2
- * Layer 2: AI Execution Sink Detection
3
- * Detects patterns where LLM output is fed into dangerous execution sinks
4
- *
5
- * Covers B2: Unsafe execution of model output (LLM02)
6
- *
7
- * Sinks include:
8
- * - Code execution: eval(), Function(), vm.runInContext()
9
- * - Shell execution: exec(), spawn(), child_process
10
- * - SQL builders: .query(), .execute(), .raw()
11
- * - Template rendering: innerHTML, dangerouslySetInnerHTML
12
- */
13
-
14
- import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
15
- import type { ParsedFile } from '../../shared/parsed-file'
16
- import {
17
- isComment,
18
- isTestOrMockFile,
19
- isScannerOrFixtureFile,
20
- isExampleDirectory,
21
- isLibraryCode,
22
- } from '../../parse/file-classifier'
23
- import { isLLMContextFile } from './prompt-hygiene'
24
-
25
- const BASE_CONFIDENCE = 0.55
26
-
27
- // ============================================================================
28
- // LLM Output Variable Detection
29
- // ============================================================================
30
-
31
- /**
32
- * Check if line contains LLM API response context
33
- */
34
- function hasLLMResponseContext(lineContent: string, surroundingContext: string): boolean {
35
- const llmResponsePatterns = [
36
- /\.choices\[0\]\.message\.content/i, // OpenAI response
37
- /\.content\[0\]\.text/i, // Anthropic response
38
- /completion\.text/i, // Generic completion
39
- /\.data\.choices/i, // API response
40
- /await\s+\w+\.(?:chat|messages|completions)\.create/i, // API call
41
- /response\.text\s*\(/i, // Response text method
42
- ]
43
-
44
- const fullContext = lineContent + '\n' + surroundingContext
45
- return llmResponsePatterns.some(p => p.test(fullContext))
46
- }
47
-
48
- // ============================================================================
49
- // UI Suggestion / Template Pattern Detection (False Positive Filters)
50
- // ============================================================================
51
-
52
- /**
53
- * Check if this is a UI suggestion/template pattern rather than execution sink
54
- * These patterns create display strings for command palettes, autocomplete, etc.
55
- */
56
- function isUITemplateSuggestion(lineContent: string, surroundingContext: string): boolean {
57
- const fullContext = lineContent + '\n' + surroundingContext
58
-
59
- // UI suggestion object patterns (command palette, autocomplete suggestions)
60
- // Note: Be careful not to match variable declarations like `const completion =`
61
- const uiSuggestionPatterns = [
62
- // Object property patterns for suggestion items (key: value in objects)
63
- /(?:id|key|label|title|name|description|display|text|value|placeholder):\s*`[^`]*\$\{/i,
64
- // Common suggestion UI patterns (arrays or objects, not variable declarations)
65
- /(?:set)?suggestions\s*[=:]\s*\[/i, // suggestions: [...] or setSuggestions([])
66
- /autocomplete/i,
67
- /command\s*palette/i,
68
- /fuzzy\s*search/i,
69
- /search\s*result/i,
70
- // React/UI state patterns
71
- /useState.*suggestions|setSuggestions/i,
72
- /setItems|setResults/i,
73
- // Template ID generation for UI
74
- /id:\s*`[a-z]+-\$\{/i, // id: `delete-${...}`, id: `edit-${...}`
75
- ]
76
-
77
- // These patterns should NOT be considered UI suggestions
78
- const notUISuggestionPatterns = [
79
- /\.query\s*\(/i,
80
- /\.execute\s*\(/i,
81
- /\.raw\s*\(/i,
82
- /await\s+db\./i,
83
- /prisma\./i,
84
- /supabase\./i,
85
- /knex\./i,
86
- /sequelize\./i,
87
- /child_process/i,
88
- /exec\s*\(/i,
89
- /spawn\s*\(/i,
90
- /eval\s*\(/i,
91
- /fetch\s*\(/i,
92
- /axios\./i,
93
- /\.redirect\s*\(/i,
94
- /\.setHeader\s*\(/i,
95
- /\.cookie\s*\(/i,
96
- /location\./i,
97
- ]
98
-
99
- // Check if context matches UI pattern but NOT execution pattern
100
- const matchesUIPattern = uiSuggestionPatterns.some(p => p.test(fullContext))
101
- const matchesExecutionPattern = notUISuggestionPatterns.some(p => p.test(lineContent))
102
-
103
- return matchesUIPattern && !matchesExecutionPattern
104
- }
105
-
106
- /**
107
- * Check if this is a static template string (no actual LLM output interpolation)
108
- * e.g., `delete ${node.title}` where node is app data, not LLM output
109
- */
110
- function isAppDataInterpolation(lineContent: string, surroundingContext: string): boolean {
111
- const fullContext = lineContent + '\n' + surroundingContext
112
-
113
- // Patterns indicating the interpolated variable is app data, not LLM output
114
- const appDataPatterns = [
115
- // Database result/record properties
116
- /\$\{(?:result|item|record|row|entry|node)\.(?:id|title|name|slug|key|label)\}/i,
117
- // UI state properties
118
- /\$\{(?:selected|current|active|item|node)\.(?:id|title|name|value)\}/i,
119
- // Form/input data
120
- /\$\{(?:data|values|form|input)\.(?:id|name|value)\}/i,
121
- // Array iteration context
122
- /\.map\s*\(\s*\(?(?:item|node|row|entry|result)/i,
123
- /\.forEach\s*\(\s*\(?(?:item|node|row|entry|result)/i,
124
- ]
125
-
126
- // Patterns that suggest LLM output (should not skip)
127
- const llmOutputPatterns = [
128
- /\$\{(?:response|completion|generated|output|answer|reply|message)\.?/i,
129
- /\$\{(?:ai|llm|gpt|claude|chat)(?:Response|Output|Result)/i,
130
- /\.choices\[0\]/i,
131
- /\.content\[0\]\.text/i,
132
- ]
133
-
134
- const isAppData = appDataPatterns.some(p => p.test(fullContext))
135
- const isLLMOutput = llmOutputPatterns.some(p => p.test(fullContext))
136
-
137
- return isAppData && !isLLMOutput
138
- }
139
-
140
- // ============================================================================
141
- // Sandbox and Validation Detection
142
- // ============================================================================
143
-
144
- /**
145
- * Check if execution is sandboxed
146
- */
147
- function isSandboxedExecution(content: string, lineNumber: number, lines?: string[]): boolean {
148
- const _lines = lines ?? content.split('\n')
149
- const contextStart = Math.max(0, lineNumber - 25)
150
- const contextEnd = Math.min(_lines.length, lineNumber + 10)
151
- const context = _lines.slice(contextStart, contextEnd).join('\n')
152
-
153
- const sandboxPatterns = [
154
- /vm2/i,
155
- /isolated-vm/i,
156
- /safeeval/i,
157
- /safe-eval/i,
158
- /sandbox/i,
159
- /runInNewContext.*\{.*timeout/i,
160
- /runInContext.*\{.*timeout/i,
161
- /allowedGlobals/i,
162
- /allowedModules/i,
163
- /quickjs/i,
164
- /webworker/i,
165
- /iframe.*sandbox/i,
166
- ]
167
-
168
- return sandboxPatterns.some(p => p.test(context))
169
- }
170
-
171
- /**
172
- * Check if output has validation before execution
173
- */
174
- function hasOutputValidation(content: string, lineNumber: number, lines?: string[]): boolean {
175
- const _lines = lines ?? content.split('\n')
176
- const contextStart = Math.max(0, lineNumber - 15)
177
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
178
- const context = _lines.slice(contextStart, contextEnd).join('\n')
179
-
180
- const validationPatterns = [
181
- /validate/i,
182
- /sanitize/i,
183
- /escape/i,
184
- /\.filter\s*\([^)]*(?:allowed|safe|valid)/i, // .filter(x => allowed.includes(x))
185
- /parse.*catch/i,
186
- /schema\./i,
187
- /\.parse\s*\(/i,
188
- /allowlist/i,
189
- /whitelist/i,
190
- /blocklist/i,
191
- /blacklist/i,
192
- /allowed(?:Columns|Tables|Hosts|Domains|Extensions|Types|Args|Paths)/i, // Allowlist variable names
193
- /JSON\.parse.*catch/i,
194
- /DOMPurify/i,
195
- /xss/i,
196
- /encodeURIComponent/i,
197
- /\.replace\s*\(\s*\/\[.*\]\/[gi]*/i, // Regex sanitization like .replace(/[^a-z0-9]/gi, '')
198
- /textContent\s*=/i, // Using textContent (safe) instead of innerHTML
199
- /ReactMarkdown/i, // React Markdown sanitizes by default
200
- /ast\.literal_eval/i, // Python safe eval
201
- /yaml\.(?:safe_load|SafeLoader)/i, // Safe YAML parsing
202
- /\.startsWith\s*\(\s*['"]\/['"]?\)/i, // Relative URL check
203
- /new\s+URL\s*\(.*\).*origin/i, // URL origin check
204
- /path\.resolve.*startsWith/i, // Path validation
205
- ]
206
-
207
- return validationPatterns.some(p => p.test(context))
208
- }
209
-
210
- /**
211
- * Check if this appears to be display-only usage (not execution)
212
- */
213
- function isDisplayOnly(lineContent: string, surroundingContext: string): boolean {
214
- const displayPatterns = [
215
- /console\.(log|info|debug|warn)/i,
216
- /textContent\s*=/i,
217
- /innerText\s*=/i,
218
- /\.text\s*=/i,
219
- /setState.*display/i,
220
- /render.*\{/i,
221
- /<p>|<div>|<span>/i,
222
- /\.send\s*\(/i,
223
- /\.json\s*\(/i,
224
- /return\s+.*response/i,
225
- ]
226
-
227
- const fullContext = lineContent + '\n' + surroundingContext
228
- return displayPatterns.some(p => p.test(fullContext))
229
- }
230
-
231
- // ============================================================================
232
- // Pattern Definitions
233
- // ============================================================================
234
-
235
- type SinkType = 'code_execution' | 'shell_command' | 'sql_builder' | 'template_render'
236
-
237
- interface ExecutionSinkPattern {
238
- name: string
239
- pattern: RegExp
240
- sinkType: SinkType
241
- baseSeverity: VulnerabilitySeverity
242
- description: string
243
- suggestedFix: string
244
- }
245
-
246
- const EXECUTION_SINK_PATTERNS: ExecutionSinkPattern[] = [
247
- // ========== Code Execution Sinks ==========
248
- {
249
- name: 'LLM output to eval()',
250
- pattern: /eval\s*\(\s*(?:response|result|output|completion|message|content|answer|generated|text)(?:\.|\.data\.|\.text|\.content)?/gi,
251
- sinkType: 'code_execution',
252
- baseSeverity: 'critical',
253
- description: 'LLM output is passed directly to eval(). This allows arbitrary code execution if the model is manipulated via prompt injection.',
254
- suggestedFix: 'Never eval() LLM output. Use structured output (JSON schema) and validate before processing. Consider using a sandboxed environment like vm2 if code execution is required.',
255
- },
256
- {
257
- name: 'LLM output to Function constructor',
258
- pattern: /new\s+Function\s*\([^)]*(?:response|result|output|completion|message|content|answer|generated)/gi,
259
- sinkType: 'code_execution',
260
- baseSeverity: 'critical',
261
- description: 'LLM output is passed to Function constructor, which is equivalent to eval().',
262
- suggestedFix: 'Use JSON schemas to define expected output structure. Validate output before any processing.',
263
- },
264
- {
265
- name: 'LLM output to vm.runInContext',
266
- pattern: /vm\.run(?:InContext|InNewContext|InThisContext)\s*\(\s*(?:response|result|output|completion|content)/gi,
267
- sinkType: 'code_execution',
268
- baseSeverity: 'high',
269
- description: 'LLM output executed in Node.js VM context. While isolated, VM can still be escaped in some versions.',
270
- suggestedFix: 'Use vm2 or isolated-vm for proper sandboxing. Add timeout and memory limits. Validate output structure before execution.',
271
- },
272
- // Generic pattern for code from LLM
273
- {
274
- name: 'Dynamic code execution from AI',
275
- pattern: /(?:eval|exec|execute)\s*\(\s*(?:ai|llm|gpt|claude|chat)(?:Response|Output|Result|Code)/gi,
276
- sinkType: 'code_execution',
277
- baseSeverity: 'critical',
278
- description: 'AI-generated code is being executed dynamically.',
279
- suggestedFix: 'Use a sandboxed code execution environment. Validate and restrict the allowed operations.',
280
- },
281
-
282
- // ========== Shell Command Sinks ==========
283
- {
284
- name: 'LLM output to exec()',
285
- pattern: /(?:exec|execSync)\s*\(\s*(?:response|result|output|completion|command|content)(?:\.|\.data\.|\.text)?/gi,
286
- sinkType: 'shell_command',
287
- baseSeverity: 'critical',
288
- description: 'LLM output is passed to shell exec(). Attackers can execute arbitrary system commands via prompt injection.',
289
- suggestedFix: 'Never pass LLM output directly to shell. Use allowlists for permitted commands. Parse structured output and use execFile() with fixed command and arguments.',
290
- },
291
- {
292
- name: 'LLM output to spawn()',
293
- pattern: /spawn\s*\(\s*(?:response|result|output|completion|command|content)(?:\.|\.data\.|\.text)?/gi,
294
- sinkType: 'shell_command',
295
- baseSeverity: 'critical',
296
- description: 'LLM output is passed to spawn(), allowing command execution.',
297
- suggestedFix: 'Use a predefined list of allowed commands. Parse LLM output to extract only arguments, not command names.',
298
- },
299
- {
300
- name: 'LLM output in shell template',
301
- pattern: /`[^`]*\$\{(?:response|result|output|completion|command|content)[^}]*\}[^`]*`\s*(?:,|\))\s*(?:exec|spawn|child_process)/gi,
302
- sinkType: 'shell_command',
303
- baseSeverity: 'critical',
304
- description: 'LLM output is interpolated into a shell command template.',
305
- suggestedFix: 'Use execFile() with separate command and arguments array. Never interpolate AI output into shell strings.',
306
- },
307
- {
308
- name: 'child_process with AI output',
309
- pattern: /child_process\.\w+\s*\([^)]*(?:ai|llm|gpt|claude|chat)(?:Response|Output|Result)/gi,
310
- sinkType: 'shell_command',
311
- baseSeverity: 'critical',
312
- description: 'AI-generated content passed to child_process module.',
313
- suggestedFix: 'Implement strict allowlisting of commands. Parse structured output from LLM.',
314
- },
315
-
316
- // ========== SQL Builder Sinks ==========
317
- {
318
- name: 'LLM output in raw SQL',
319
- pattern: /\.(?:query|execute|raw)\s*\(\s*(?:response|result|output|generated|sql|completion)(?:\.|\.data\.|\.text)?/gi,
320
- sinkType: 'sql_builder',
321
- baseSeverity: 'critical',
322
- description: 'LLM-generated SQL is executed directly. This enables SQL injection via prompt manipulation.',
323
- suggestedFix: 'Use parameterized queries. Have LLM generate query parameters, not raw SQL. Validate generated SQL against an allowlist of patterns.',
324
- },
325
- {
326
- name: 'LLM output in SQL template',
327
- pattern: /`(?:SELECT|INSERT|UPDATE|DELETE)[^`]*\$\{(?:response|result|output|generated|completion)/gi,
328
- sinkType: 'sql_builder',
329
- baseSeverity: 'critical',
330
- description: 'LLM output interpolated into SQL query template.',
331
- suggestedFix: 'Use parameterized queries. Have LLM output structured data (table names, conditions) that you validate against allowlists.',
332
- },
333
- {
334
- name: 'Dynamic SQL from AI',
335
- pattern: /(?:query|execute|sql)\s*\(\s*(?:ai|llm|gpt|claude)(?:Query|Sql|Response)/gi,
336
- sinkType: 'sql_builder',
337
- baseSeverity: 'critical',
338
- description: 'AI-generated SQL query being executed.',
339
- suggestedFix: 'Validate SQL structure. Use read-only database connections. Implement query allowlisting.',
340
- },
341
-
342
- // ========== Template/DOM Sinks ==========
343
- {
344
- name: 'LLM output to innerHTML',
345
- pattern: /\.innerHTML\s*=\s*(?:response|result|output|completion|message|content|generated)(?:\.|\.data\.|\.text|\.content)?/gi,
346
- sinkType: 'template_render',
347
- baseSeverity: 'high',
348
- description: 'LLM output assigned to innerHTML. If the model outputs malicious HTML/JS, it will execute (XSS).',
349
- suggestedFix: 'Use textContent for plain text. Sanitize HTML with DOMPurify before rendering. Use React/Vue which auto-escape by default.',
350
- },
351
- {
352
- name: 'LLM output to outerHTML',
353
- pattern: /\.outerHTML\s*=\s*(?:response|result|output|completion|message|content|generated)(?:\.|\.data\.|\.text|\.content)?/gi,
354
- sinkType: 'template_render',
355
- baseSeverity: 'high',
356
- description: 'LLM output assigned to outerHTML. This replaces the entire element and allows XSS.',
357
- suggestedFix: 'Use textContent for plain text. Sanitize HTML with DOMPurify before rendering.',
358
- },
359
- {
360
- name: 'LLM output to insertAdjacentHTML',
361
- pattern: /\.insertAdjacentHTML\s*\([^,]+,\s*(?:response|result|output|completion|message|content|generated)/gi,
362
- sinkType: 'template_render',
363
- baseSeverity: 'high',
364
- description: 'LLM output passed to insertAdjacentHTML. This allows XSS via injected HTML/JS.',
365
- suggestedFix: 'Use insertAdjacentText for plain text. Sanitize HTML with DOMPurify: el.insertAdjacentHTML("beforeend", DOMPurify.sanitize(content))',
366
- },
367
- {
368
- name: 'LLM output to dangerouslySetInnerHTML',
369
- pattern: /dangerouslySetInnerHTML\s*=\s*\{\s*\{\s*__html:\s*(?:response|result|output|completion|message|content)/gi,
370
- sinkType: 'template_render',
371
- baseSeverity: 'high',
372
- description: 'LLM output used in React dangerouslySetInnerHTML without sanitization.',
373
- suggestedFix: 'Sanitize with DOMPurify: dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(content) }}',
374
- },
375
- {
376
- name: 'LLM output to document.write',
377
- pattern: /document\.write\s*\(\s*(?:response|result|output|completion|message|content)/gi,
378
- sinkType: 'template_render',
379
- baseSeverity: 'high',
380
- description: 'LLM output passed to document.write, allowing script injection.',
381
- suggestedFix: 'Use DOM manipulation methods with proper escaping. Never use document.write with dynamic content.',
382
- },
383
-
384
- // ========== M5: File System Sinks ==========
385
- {
386
- name: 'LLM output in file path',
387
- pattern: /(?:readFile|writeFile|readFileSync|writeFileSync|unlink|unlinkSync|mkdir|mkdirSync|rmdir|rmSync)\s*\(\s*(?:response|result|output|completion|message|content|path)(?:\.|\.data\.|\.path)?/gi,
388
- sinkType: 'code_execution', // Path traversal is code-level risk
389
- baseSeverity: 'critical',
390
- description: 'LLM-generated value used as file path. Path traversal attack possible - model could access or modify arbitrary files.',
391
- suggestedFix: 'Validate AI output against allowed paths: if (!allowedPaths.some(p => path.resolve(output).startsWith(p))) throw. Use path.resolve() and check the result is within allowed directory.',
392
- },
393
- {
394
- name: 'LLM output in fs operation',
395
- pattern: /fs\.(?:read|write|append|unlink|mkdir|rm|stat|access)\w*\s*\(\s*(?:response|result|output|completion|aiPath|generatedPath)/gi,
396
- sinkType: 'code_execution',
397
- baseSeverity: 'critical',
398
- description: 'AI-generated path passed to filesystem operation. Model could traverse to sensitive directories.',
399
- suggestedFix: 'Create allowlist of permitted paths/directories. Use path.resolve() and validate result is within allowed boundaries.',
400
- },
401
- {
402
- name: 'LLM output in path.join',
403
- pattern: /path\.(?:join|resolve)\s*\([^)]*(?:response|result|output|completion|content|aiPath)[^)]*\).*(?:fs\.|readFile|writeFile)/gi,
404
- sinkType: 'code_execution',
405
- baseSeverity: 'high',
406
- description: 'AI output used in path construction before file operation. Validate the final path.',
407
- suggestedFix: 'After path.join/resolve, check result is within allowed directory: const resolved = path.resolve(base, aiPath); if (!resolved.startsWith(allowedRoot)) throw',
408
- },
409
-
410
- // ========== M5: Dynamic Import Sinks ==========
411
- {
412
- name: 'LLM output in dynamic import',
413
- pattern: /import\s*\(\s*(?:response|result|output|completion|message|content|moduleName|aiModule)/gi,
414
- sinkType: 'code_execution',
415
- baseSeverity: 'critical',
416
- description: 'AI-generated value used in dynamic import(). Arbitrary module loading enables code execution.',
417
- suggestedFix: 'Use allowlist for permitted modules: const allowed = ["lodash", "moment"]; if (!allowed.includes(moduleName)) throw. Never dynamically import AI-generated module paths.',
418
- },
419
- {
420
- name: 'LLM output in require()',
421
- pattern: /require\s*\(\s*(?:response|result|output|completion|message|content|moduleName|aiModule)/gi,
422
- sinkType: 'code_execution',
423
- baseSeverity: 'critical',
424
- description: 'AI-generated value used in require(). Can load arbitrary modules including native code.',
425
- suggestedFix: 'Use allowlist for permitted modules. Consider using import maps or module aliases instead of dynamic require.',
426
- },
427
- {
428
- name: 'LLM output in module resolution',
429
- pattern: /(?:require\.resolve|import\.meta\.resolve)\s*\(\s*(?:response|result|output|completion|moduleName)/gi,
430
- sinkType: 'code_execution',
431
- baseSeverity: 'high',
432
- description: 'AI output used in module path resolution. Could leak information about file system or enable module confusion attacks.',
433
- suggestedFix: 'Validate module name against allowlist before resolution.',
434
- },
435
-
436
- // ========== Phase 2: Network/SSRF Sinks ==========
437
- {
438
- name: 'LLM output in fetch URL',
439
- pattern: /fetch\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl|urlFromAi)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
440
- sinkType: 'code_execution', // SSRF is code-level risk
441
- baseSeverity: 'critical',
442
- description: 'AI-generated URL passed to fetch(). Attackers can manipulate the model to make requests to internal services (SSRF), exfiltrate data, or access localhost services.',
443
- suggestedFix: 'Validate URL against allowlist: const allowed = ["api.example.com"]; if (!allowed.includes(new URL(url).host)) throw. Block private IP ranges.',
444
- },
445
- {
446
- name: 'LLM output in axios request',
447
- pattern: /axios\.(?:get|post|put|delete|patch|request)\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
448
- sinkType: 'code_execution',
449
- baseSeverity: 'critical',
450
- description: 'AI-generated URL passed to axios. This enables SSRF attacks where the model is manipulated to make requests to internal services.',
451
- suggestedFix: 'Validate URL host against allowlist. Use axios interceptors to block private IPs and internal hosts.',
452
- },
453
- {
454
- name: 'LLM output in axios config',
455
- pattern: /axios\s*\(\s*\{[^}]*url:\s*(?:response|result|output|completion|aiUrl|generatedUrl)/gi,
456
- sinkType: 'code_execution',
457
- baseSeverity: 'critical',
458
- description: 'AI-generated URL passed to axios via config object. SSRF risk.',
459
- suggestedFix: 'Validate URL host against allowlist before passing to axios.',
460
- },
461
- {
462
- name: 'LLM output in HTTP client',
463
- pattern: /(?:got|request|superagent|ky|undici\.fetch)\s*\(\s*(?:response|result|output|completion|aiUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
464
- sinkType: 'code_execution',
465
- baseSeverity: 'critical',
466
- description: 'AI-generated URL passed to HTTP client. Server-Side Request Forgery (SSRF) risk.',
467
- suggestedFix: 'Validate URLs against allowlist of permitted hosts. Block internal IP ranges (10.x, 172.16-31.x, 192.168.x, 127.x, localhost).',
468
- },
469
-
470
- // ========== Phase 2: Redirect Sinks ==========
471
- {
472
- name: 'LLM output in server redirect',
473
- pattern: /(?:res|response)\.redirect\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
474
- sinkType: 'template_render', // Open redirect is similar to XSS
475
- baseSeverity: 'high',
476
- description: 'AI-generated URL used in HTTP redirect. Attackers can craft prompts to redirect users to phishing sites or malicious pages.',
477
- suggestedFix: 'Validate redirect URL against allowlist. Only allow redirects to same-origin or known safe domains. Use relative URLs where possible.',
478
- },
479
- {
480
- name: 'LLM output in client redirect assignment',
481
- pattern: /(?:window\.)?location\.href\s*=\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
482
- sinkType: 'template_render',
483
- baseSeverity: 'high',
484
- description: 'AI-generated URL assigned to location.href. Enables open redirect attacks.',
485
- suggestedFix: 'Validate URL before assignment. Prefer relative URLs or validate against allowlist: if (!url.startsWith("/") && !allowedHosts.includes(new URL(url).host)) throw',
486
- },
487
- {
488
- name: 'LLM output in location.assign',
489
- pattern: /location\.assign\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
490
- sinkType: 'template_render',
491
- baseSeverity: 'high',
492
- description: 'AI-generated URL passed to location.assign(). Enables open redirect attacks.',
493
- suggestedFix: 'Validate URL before assignment. Only allow same-origin or allowlisted domains.',
494
- },
495
- {
496
- name: 'LLM output in location.replace',
497
- pattern: /location\.replace\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
498
- sinkType: 'template_render',
499
- baseSeverity: 'high',
500
- description: 'AI-generated URL passed to location.replace(). Enables open redirect attacks.',
501
- suggestedFix: 'Validate URL before assignment. Only allow same-origin or allowlisted domains.',
502
- },
503
- {
504
- name: 'LLM output in Next.js redirect',
505
- pattern: /redirect\s*\(\s*(?:response|result|output|completion|aiUrl|generatedUrl)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
506
- sinkType: 'template_render',
507
- baseSeverity: 'high',
508
- description: 'AI-generated URL passed to Next.js redirect(). Enables open redirect attacks.',
509
- suggestedFix: 'Validate URL before redirect. Only allow relative URLs or allowlisted domains.',
510
- },
511
- {
512
- name: 'LLM output in meta refresh',
513
- pattern: /<meta[^>]*http-equiv\s*=\s*['"`]refresh['"`][^>]*content\s*=\s*['"`][^'"]*url\s*=\s*(?:\$\{|<%=).*(?:response|output|completion)/gi,
514
- sinkType: 'template_render',
515
- baseSeverity: 'high',
516
- description: 'AI-generated URL in meta refresh tag. Open redirect vulnerability.',
517
- suggestedFix: 'Avoid meta refresh with dynamic URLs. Use server-side redirects with URL validation instead.',
518
- },
519
-
520
- // ========== Phase 2: Header Injection Sinks ==========
521
- {
522
- name: 'LLM output in response header',
523
- pattern: /(?:res|response)\.(?:setHeader|set|header)\s*\(\s*['"][^'"]+['"]\s*,\s*(?:response|result|output|completion|aiValue)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
524
- sinkType: 'template_render',
525
- baseSeverity: 'high',
526
- description: 'AI-generated value used in HTTP response header. Enables header injection attacks (CRLF injection, cache poisoning).',
527
- suggestedFix: 'Sanitize header values: remove CR/LF characters. Validate against expected format. Never use AI output directly in security-sensitive headers (Set-Cookie, Authorization).',
528
- },
529
- {
530
- name: 'LLM output in cookie',
531
- pattern: /(?:res|response)\.(?:cookie|setCookie)\s*\(\s*['"][^'"]+['"]\s*,\s*(?:response|result|output|completion)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
532
- sinkType: 'template_render',
533
- baseSeverity: 'high',
534
- description: 'AI-generated value set as cookie. Could enable session fixation or cookie injection attacks.',
535
- suggestedFix: 'Never use AI output for cookie values. Generate tokens server-side with crypto.randomBytes(). Validate any user-facing values.',
536
- },
537
- {
538
- name: 'LLM output in res.type',
539
- pattern: /(?:res|response)\.type\s*\(\s*(?:response|result|output|completion)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
540
- sinkType: 'template_render',
541
- baseSeverity: 'high',
542
- description: 'AI-generated value used to set Content-Type. Could enable MIME confusion attacks.',
543
- suggestedFix: 'Use allowlist for content types: const allowed = ["json", "html", "text"]; if (!allowed.includes(type)) throw',
544
- },
545
-
546
- // ========== Phase 3: Additional Code Execution Sinks ==========
547
- {
548
- name: 'LLM output to setTimeout/setInterval string',
549
- pattern: /(?:setTimeout|setInterval)\s*\(\s*(?:response|result|output|completion)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
550
- sinkType: 'code_execution',
551
- baseSeverity: 'high',
552
- description: 'AI-generated string passed to setTimeout/setInterval. When passed a string, these functions act like eval().',
553
- suggestedFix: 'Never pass strings to setTimeout/setInterval. Use arrow functions: setTimeout(() => doSomething(), 1000)',
554
- },
555
- {
556
- name: 'LLM output to globalThis.eval',
557
- pattern: /(?:globalThis|window)\[?['"]?eval['"]?\]?\s*\(\s*(?:response|result|output|completion)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
558
- sinkType: 'code_execution',
559
- baseSeverity: 'critical',
560
- description: 'AI-generated code passed to eval via globalThis/window. This is indirect eval() that enables arbitrary code execution.',
561
- suggestedFix: 'Never eval() LLM output. Use structured output and validation.',
562
- },
563
- {
564
- name: 'LLM output to execa',
565
- pattern: /execa\s*\(\s*(?:response|result|output|completion)(?:\.choices\[0\]\.message\.content|\.content|\.text)?/gi,
566
- sinkType: 'shell_command',
567
- baseSeverity: 'critical',
568
- description: 'AI-generated command passed to execa. This enables command injection attacks.',
569
- suggestedFix: 'Never pass LLM output directly to shell. Use allowlists for permitted commands.',
570
- },
571
-
572
- // ========== Phase 3: Python-Specific Sinks ==========
573
- {
574
- name: 'LLM output to Python eval',
575
- pattern: /eval\s*\(\s*(?:response|result|output|completion|code)(?:\[['"]?choices['"]?\]\[0\]\[['"]?message['"]?\]\[['"]?content['"]?\]|\.content|\.text)?/gi,
576
- sinkType: 'code_execution',
577
- baseSeverity: 'critical',
578
- description: 'AI-generated code passed to Python eval(). Enables arbitrary code execution.',
579
- suggestedFix: 'Never eval() LLM output. Use ast.literal_eval() for safe literal evaluation, or JSON parsing with schema validation.',
580
- },
581
- {
582
- name: 'LLM output to Python exec',
583
- pattern: /exec\s*\(\s*(?:response|result|output|completion)(?:\[['"]?choices['"]?\]\[0\]\[['"]?message['"]?\]\[['"]?content['"]?\]|\.content|\.text)?/gi,
584
- sinkType: 'code_execution',
585
- baseSeverity: 'critical',
586
- description: 'AI-generated code passed to Python exec(). Enables arbitrary code execution.',
587
- suggestedFix: 'Never exec() LLM output. Use structured output and validation instead.',
588
- },
589
- {
590
- name: 'LLM output to pickle.loads',
591
- pattern: /pickle\.loads?\s*\(\s*(?:response|result|output|completion|serialized)(?:\.encode\(\)|\.content|\.text)?/gi,
592
- sinkType: 'code_execution',
593
- baseSeverity: 'critical',
594
- description: 'AI-generated data passed to pickle.loads(). Pickle deserialization can execute arbitrary code.',
595
- suggestedFix: 'Never unpickle untrusted data. Use JSON or other safe serialization formats.',
596
- },
597
- {
598
- name: 'LLM output to subprocess with shell=True',
599
- pattern: /subprocess\.(?:run|call|Popen)\s*\(\s*(?:response|result|output|completion|ai_command|generated_cmd)(?:\.content|\.text)?[^)]*shell\s*=\s*True/gi,
600
- sinkType: 'shell_command',
601
- baseSeverity: 'critical',
602
- description: 'AI-generated command passed to subprocess with shell=True. Enables command injection.',
603
- suggestedFix: 'Never use shell=True with user/AI input. Use subprocess.run(["cmd", "arg1", "arg2"]) without shell.',
604
- },
605
- {
606
- name: 'LLM output to os.system',
607
- pattern: /os\.system\s*\(\s*(?:response|result|output|completion|generated_cmd|ai_command)(?:\.content|\.text)?/gi,
608
- sinkType: 'shell_command',
609
- baseSeverity: 'critical',
610
- description: 'AI-generated command passed to os.system(). Enables command injection.',
611
- suggestedFix: 'Use subprocess.run() with list arguments instead of os.system(). Never pass AI output to shell.',
612
- },
613
- {
614
- name: 'Python SQL f-string injection',
615
- pattern: /cursor\.execute\s*\(\s*f["'].*\{.*(?:response|result|output|completion)/gi,
616
- sinkType: 'sql_builder',
617
- baseSeverity: 'critical',
618
- description: 'AI-generated value interpolated into SQL query via f-string. Enables SQL injection.',
619
- suggestedFix: 'Use parameterized queries: cursor.execute("SELECT * FROM users WHERE id = ?", [user_id])',
620
- },
621
-
622
- // ========== Sprint 6: Template Engine Injection Sinks ==========
623
- {
624
- name: 'LLM output to EJS template',
625
- pattern: /\bejs\.(?:render|renderFile|compile)\s*\([^)]*(?:response|result|output|completion|content|message|text|answer)(?:\.|\.data\.|\.text|\.content)?/gi,
626
- sinkType: 'template_render',
627
- baseSeverity: 'high',
628
- description: 'LLM output passed to EJS template engine. Server-side template injection (SSTI) can lead to remote code execution.',
629
- suggestedFix: 'Sanitize LLM output before passing to templates. Use autoescaping and never pass AI output as template source.',
630
- },
631
- {
632
- name: 'LLM output to Handlebars template',
633
- pattern: /\b(?:handlebars|hbs)\.(?:compile|render)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
634
- sinkType: 'template_render',
635
- baseSeverity: 'high',
636
- description: 'LLM output passed to Handlebars template. If used with SafeString, SSTI is possible.',
637
- suggestedFix: 'Never pass LLM output to Handlebars SafeString. Use default escaping and sanitize AI output.',
638
- },
639
- {
640
- name: 'LLM output to Pug/Jade template',
641
- pattern: /\bpug\.(?:render|compile|renderFile)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
642
- sinkType: 'template_render',
643
- baseSeverity: 'high',
644
- description: 'LLM output passed to Pug template engine. Unescaped interpolation (!{}) enables SSTI.',
645
- suggestedFix: 'Use escaped interpolation (#{}) and sanitize LLM output before rendering.',
646
- },
647
- {
648
- name: 'LLM output to Nunjucks template',
649
- pattern: /\bnunjucks\.(?:render|renderString)\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
650
- sinkType: 'template_render',
651
- baseSeverity: 'high',
652
- description: 'LLM output passed to Nunjucks template. SSTI risk if autoescape is disabled.',
653
- suggestedFix: 'Enable autoescape and sanitize LLM output before rendering.',
654
- },
655
- {
656
- name: 'LLM output to Jinja2 template (Python)',
657
- pattern: /\b(?:jinja2\.)?Template\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.content|\.text)?/gi,
658
- sinkType: 'template_render',
659
- baseSeverity: 'high',
660
- description: 'LLM output used as Jinja2 template source. SSTI can lead to RCE in Python.',
661
- suggestedFix: 'Never use LLM output as template source. Use it only as template variables with autoescaping enabled.',
662
- },
663
- {
664
- name: 'LLM output in Mustache template',
665
- pattern: /\bMustache\.render\s*\([^)]*(?:response|result|output|completion|content)(?:\.|\.data\.|\.text|\.content)?/gi,
666
- sinkType: 'template_render',
667
- baseSeverity: 'medium',
668
- description: 'LLM output passed to Mustache template. While Mustache auto-escapes HTML, triple braces {{{...}}} bypass this.',
669
- suggestedFix: 'Ensure LLM output is never used with triple braces. Validate template structure.',
670
- },
671
-
672
- // ========== Sprint 6: NoSQL Injection Sinks ==========
673
- {
674
- name: 'NoSQL injection via JSON.parse',
675
- pattern: /\.(?:find|findOne|findOneAndUpdate|updateOne|updateMany|deleteOne|deleteMany|aggregate)\s*\(\s*JSON\.parse\s*\(\s*(?:response|result|output|completion|content)(?:\.|\.text|\.content)?/gi,
676
- sinkType: 'sql_builder',
677
- baseSeverity: 'high',
678
- description: 'LLM output parsed as MongoDB query via JSON.parse. NoSQL injection can bypass authentication or leak data.',
679
- suggestedFix: 'Use parameterized queries or validate/sanitize LLM output against a schema before using in queries.',
680
- },
681
- {
682
- name: 'MongoDB $where injection',
683
- pattern: /\$where\s*:\s*[^}]*(?:response|result|output|completion|content|message)(?:\.|\.text|\.content)?/gi,
684
- sinkType: 'sql_builder',
685
- baseSeverity: 'critical',
686
- description: 'LLM output in MongoDB $where operator. $where executes JavaScript, enabling arbitrary code execution.',
687
- suggestedFix: 'Avoid $where operator entirely. Use standard MongoDB query operators instead.',
688
- },
689
- {
690
- name: 'Dynamic MongoDB query from LLM',
691
- pattern: /(?:db|collection|mongoose)\.(?:find|findOne|aggregate)\s*\(\s*(?:response|result|output|completion|aiQuery)(?:\.|\.query|\.filter)?/gi,
692
- sinkType: 'sql_builder',
693
- baseSeverity: 'high',
694
- description: 'LLM output used directly as MongoDB query. Query operators could be injected.',
695
- suggestedFix: 'Validate query structure. Only allow specific operators. Use schema validation before query execution.',
696
- },
697
-
698
- // ========== Sprint 6: GraphQL Injection Sinks ==========
699
- {
700
- name: 'GraphQL query injection',
701
- pattern: /\b(?:gql|graphql)\s*`[^`]*\$\{[^}]*(?:response|result|output|completion|content|message)[^}]*\}/gi,
702
- sinkType: 'sql_builder',
703
- baseSeverity: 'high',
704
- description: 'LLM output interpolated into GraphQL query string. Can lead to query manipulation or unauthorized data access.',
705
- suggestedFix: 'Use GraphQL variables instead of string interpolation for dynamic values.',
706
- },
707
- {
708
- name: 'GraphQL query from LLM output',
709
- pattern: /(?:apolloClient|urqlClient|client)\.query\s*\(\s*\{[^}]*query\s*:\s*(?:response|result|output|completion|aiQuery)(?:\.|\.query)?/gi,
710
- sinkType: 'sql_builder',
711
- baseSeverity: 'high',
712
- description: 'LLM output used as GraphQL query. Malicious queries could access unauthorized data or cause DoS.',
713
- suggestedFix: 'Use predefined queries with variables. Validate query structure and depth before execution.',
714
- },
715
-
716
- // ========== Sprint 6: ReDoS (Regular Expression DoS) Sinks ==========
717
- {
718
- name: 'Dynamic regex from LLM output',
719
- pattern: /new\s+RegExp\s*\(\s*(?:response|result|output|completion|content|message|answer)(?:\.|\.text|\.content|\.pattern)?/gi,
720
- sinkType: 'code_execution',
721
- baseSeverity: 'medium',
722
- description: 'LLM-generated regex pattern. Malicious patterns can cause catastrophic backtracking (ReDoS), hanging the server.',
723
- suggestedFix: 'Validate regex complexity before compilation. Use safe-regex library or set timeout for regex execution.',
724
- },
725
- {
726
- name: 'Python regex from LLM output',
727
- pattern: /re\.compile\s*\(\s*(?:response|result|output|completion|content|pattern)(?:\.|\.text|\.content)?/gi,
728
- sinkType: 'code_execution',
729
- baseSeverity: 'medium',
730
- description: 'LLM-generated regex compiled in Python. ReDoS attacks can cause denial of service.',
731
- suggestedFix: 'Use regex_timeout or validate pattern complexity before compilation.',
732
- },
733
- {
734
- name: 'Dynamic regex replacement',
735
- pattern: /\.replace\s*\(\s*new\s+RegExp\s*\(\s*(?:response|result|output|completion|content)/gi,
736
- sinkType: 'code_execution',
737
- baseSeverity: 'medium',
738
- description: 'LLM output used as regex pattern in replace operation. ReDoS risk.',
739
- suggestedFix: 'Use string replace or validate regex pattern complexity.',
740
- },
741
- ]
742
-
743
- // ============================================================================
744
- // Phase 2: URL/Network Validation Detection
745
- // ============================================================================
746
-
747
- /**
748
- * Check if URL validation is present (returns 'strong', 'weak', or 'none')
749
- * Strong validation = skip finding entirely
750
- * Weak validation = downgrade severity
751
- */
752
- function getURLValidationLevel(content: string, lineNumber: number, lines?: string[]): 'strong' | 'weak' | 'none' {
753
- const _lines = lines ?? content.split('\n')
754
- const contextStart = Math.max(0, lineNumber - 15)
755
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
756
- const context = _lines.slice(contextStart, contextEnd).join('\n')
757
-
758
- // Strong validation - skip entirely
759
- const strongValidationPatterns = [
760
- /allowedHosts\.includes\s*\(\s*(?:new\s+URL)?/i, // Explicit allowlist check
761
- /safeDomains\.includes\s*\(/i, // Safe domain allowlist
762
- /allowedDomains\.includes\s*\(/i, // Allowed domain check
763
- /if\s*\(\s*allowedHosts/i, // Conditional on allowlist
764
- /if\s*\(\s*safeDomains/i, // Conditional on safe domains
765
- /url\.origin\s*===\s*(?:window\.)?(?:location\.)?origin/i, // Same-origin check
766
- /\.origin\s*===\s*origin/i, // Same-origin check
767
- /\.startsWith\s*\(\s*['"]\/['"]?\s*\)\s*&&\s*!\s*\w+\.startsWith\s*\(\s*['"]\/\//i, // Relative URL with protocol-relative check
768
- /if\s*\(\s*\w+\.startsWith\s*\(\s*['"]\/['"]?\s*\)\s*&&\s*!/i, // Relative URL validation
769
- /blockedHosts\.includes\s*\(/i, // Block list check
770
- /privateIpPatterns\.some\s*\(/i, // Private IP blocking
771
- ]
772
-
773
- if (strongValidationPatterns.some(p => p.test(context))) {
774
- return 'strong'
775
- }
776
-
777
- // Weak validation - downgrade severity
778
- const weakValidationPatterns = [
779
- /isValidUrl|validateUrl|isAllowedUrl/i,
780
- /new\s+URL\s*\(.*\).*(?:host|hostname|origin)/i,
781
- /allowedUrls|allowedHosts|allowedDomains|safeDomains/i,
782
- /url\.startsWith\s*\(\s*['"`](?:https?:\/\/|\/[^\/])/i,
783
- /sanitizeUrl|encodeURIComponent/i,
784
- /blockedHosts|blockedDomains|privateIp/i,
785
- /\.includes\s*\(\s*(?:new\s+URL\s*\()?.*\.host/i,
786
- ]
787
-
788
- if (weakValidationPatterns.some(p => p.test(context))) {
789
- return 'weak'
790
- }
791
-
792
- return 'none'
793
- }
794
-
795
- /**
796
- * Legacy function for backward compatibility
797
- */
798
- function hasURLValidation(content: string, lineNumber: number): boolean {
799
- return getURLValidationLevel(content, lineNumber) !== 'none'
800
- }
801
-
802
- /**
803
- * Check if DOM content is sanitized (e.g., DOMPurify)
804
- */
805
- function isDOMSanitized(lineContent: string, surroundingContext: string): boolean {
806
- const fullContext = lineContent + '\n' + surroundingContext
807
-
808
- const sanitizationPatterns = [
809
- /DOMPurify\.sanitize\s*\(/i,
810
- /sanitizeHtml\s*\(/i,
811
- /xss\s*\(/i,
812
- /escapeHtml\s*\(/i,
813
- /textContent\s*=/i, // textContent is safe
814
- /innerText\s*=/i, // innerText is safe
815
- /ReactMarkdown/i, // ReactMarkdown sanitizes by default
816
- /<ReactMarkdown>/i, // JSX ReactMarkdown
817
- ]
818
-
819
- return sanitizationPatterns.some(p => p.test(fullContext))
820
- }
821
-
822
- /**
823
- * Check if file path is properly validated
824
- */
825
- function isPathValidated(content: string, lineNumber: number, lines?: string[]): boolean {
826
- const _lines = lines ?? content.split('\n')
827
- const contextStart = Math.max(0, lineNumber - 15)
828
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
829
- const context = _lines.slice(contextStart, contextEnd).join('\n')
830
-
831
- const pathValidationPatterns = [
832
- /path\.resolve\s*\([^)]*\).*startsWith/i, // Resolved path + startsWith check
833
- /resolved\.startsWith\s*\(/i, // Common pattern: resolved.startsWith(baseDir)
834
- /!.*startsWith.*throw/i, // Validation with throw on failure
835
- /if\s*\(\s*!?\s*resolved\.startsWith/i, // Conditional path check
836
- /allowedExtensions\.includes\s*\(/i, // Extension allowlist
837
- /allowedPaths/i, // Path allowlist
838
- /SAFE_BASE_DIR/i, // Common safe directory constant
839
- /baseDir|safeDir|allowedDir/i, // Directory restriction variables
840
- /path\.basename\s*\(/i, // Only using basename (no traversal)
841
- /\.replace\s*\(/i, // Generic replace (likely sanitization)
842
- ]
843
-
844
- return pathValidationPatterns.some(p => p.test(context))
845
- }
846
-
847
- /**
848
- * Check if header value is sanitized
849
- */
850
- function isHeaderSanitized(content: string, lineNumber: number, lines?: string[]): boolean {
851
- const _lines = lines ?? content.split('\n')
852
- const contextStart = Math.max(0, lineNumber - 15)
853
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
854
- const context = _lines.slice(contextStart, contextEnd).join('\n')
855
-
856
- const headerSanitizationPatterns = [
857
- /\.replace\s*\(\s*\/\[\\r\\n\]/i, // CRLF removal
858
- /\.replace\s*\(\s*\/\[\\\\r\\\\n\]/i, // CRLF removal (escaped)
859
- /allowedTypes\.includes\s*\(/i, // Content-type allowlist
860
- /allowed(?:Headers|Types|Values)\.includes\s*\(/i, // Generic allowlist
861
- /if\s*\(\s*allowed\w*\.includes\s*\(/i, // Conditional allowlist
862
- /crypto\.random/i, // Server-generated value (not AI)
863
- /randomUUID/i, // UUID generation
864
- /safeValue|sanitized/i, // Variable indicating sanitization
865
- /\/\^?\[a-zA-Z0-9\-_\.\s\]\+\$?\/.*\.test\s*\(/i, // Regex validation (alphanumeric chars only)
866
- /if\s*\(\/\^?\[a-zA-Z0-9/i, // Conditional with alphanumeric regex
867
- ]
868
-
869
- return headerSanitizationPatterns.some(p => p.test(context))
870
- }
871
-
872
- /**
873
- * Check for Python-specific safe patterns
874
- */
875
- function isPythonSafe(lineContent: string, surroundingContext: string): boolean {
876
- const fullContext = lineContent + '\n' + surroundingContext
877
-
878
- const pythonSafePatterns = [
879
- /ast\.literal_eval\s*\(/i, // Safe literal evaluation
880
- /yaml\.(?:safe_load|SafeLoader)/i, // Safe YAML
881
- /yaml\.load\s*\([^)]*Loader\s*=\s*yaml\.SafeLoader/i, // Explicit SafeLoader
882
- /cursor\.execute\s*\([^,]+,\s*\[/i, // Parameterized query with list
883
- /\?\s*,\s*\[/i, // SQL placeholder with params
884
- /%s.*,\s*\[/i, // Python %s placeholder with list
885
- /subprocess\.run\s*\(\s*\[/i, // subprocess with list (no shell)
886
- /shell\s*=\s*False/i, // Explicit shell=False
887
- ]
888
-
889
- return pythonSafePatterns.some(p => p.test(fullContext))
890
- }
891
-
892
- /**
893
- * Check if SQL is using parameterized queries or ORM
894
- */
895
- function isSQLParameterized(lineContent: string, surroundingContext: string): boolean {
896
- const fullContext = lineContent + '\n' + surroundingContext
897
-
898
- const parameterizedPatterns = [
899
- /allowedColumns\.filter\s*\(/i, // Column allowlist
900
- /safeColumns/i, // Safe column variable
901
- /allowedColumns\.includes\s*\(/i, // Column allowlist check
902
- /\.filter\s*\(\s*\w+\s*=>\s*allowed\w*\.includes/i, // Filter with allowlist
903
- /schema\.parse\s*\(/i, // Zod schema validation
904
- /z\.enum\s*\(\s*\[/i, // Zod enum (allowlist)
905
- /prisma\.\w+\.(?:findMany|findUnique|create|update)/i, // Prisma ORM methods (not raw)
906
- /\$\{.*\}.*WHERE.*=\s*\$\d/i, // Dynamic column but parameterized value
907
- ]
908
-
909
- return parameterizedPatterns.some(p => p.test(fullContext))
910
- }
911
-
912
- /**
913
- * Check if shell execution uses allowlist
914
- */
915
- function isShellAllowlisted(content: string, lineNumber: number, lines?: string[]): boolean {
916
- const _lines = lines ?? content.split('\n')
917
- const contextStart = Math.max(0, lineNumber - 15)
918
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
919
- const context = _lines.slice(contextStart, contextEnd).join('\n')
920
-
921
- const shellAllowlistPatterns = [
922
- /allowedArgs\.includes\s*\(/i, // Argument allowlist
923
- /if\s*\(\s*allowedArgs\.includes/i, // Conditional on allowlist
924
- /allowedCommands\.includes\s*\(/i, // Command allowlist
925
- /execFile\s*\(\s*['"][^'"]+['"]/i, // execFile with hardcoded command (safe)
926
- /\.replace\s*\(\s*\/\[^a-z0-9\]/gi, // Strict sanitization
927
- /sanitized\s*=/i, // Sanitization variable
928
- ]
929
-
930
- return shellAllowlistPatterns.some(p => p.test(context))
931
- }
932
-
933
- /**
934
- * Check if template engine has autoescape enabled or uses safe rendering
935
- */
936
- function isTemplateSafe(content: string, lineNumber: number, lines?: string[]): boolean {
937
- const _lines = lines ?? content.split('\n')
938
- const contextStart = Math.max(0, lineNumber - 15)
939
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
940
- const context = _lines.slice(contextStart, contextEnd).join('\n')
941
-
942
- const templateSafePatterns = [
943
- /autoescape\s*[=:]\s*true/i, // Autoescape enabled
944
- /autoescaping\s*[=:]\s*true/i, // Alternative naming
945
- /escape\s*[=:]\s*true/i, // Escape option
946
- /\.escapeHtml\s*\(/i, // Manual escaping
947
- /sanitize(?:Html|Output)?\s*\(/i, // Sanitization function
948
- /DOMPurify\.sanitize/i, // DOMPurify sanitization
949
- /#{[^}]+}/i, // Pug escaped interpolation (safe)
950
- /\{\{[^}]+\}\}/i, // Handlebars/Mustache double-brace (escaped by default)
951
- ]
952
-
953
- // Patterns that indicate unsafe usage
954
- const unsafePatterns = [
955
- /autoescape\s*[=:]\s*false/i, // Autoescape disabled
956
- /!{[^}]+}/i, // Pug unescaped interpolation
957
- /{{{[^}]+}}}/i, // Handlebars/Mustache triple-brace (unescaped)
958
- /SafeString/i, // Handlebars SafeString (bypasses escaping)
959
- /\|safe\b/i, // Jinja2/Nunjucks safe filter
960
- ]
961
-
962
- const isSafe = templateSafePatterns.some(p => p.test(context))
963
- const isUnsafe = unsafePatterns.some(p => p.test(context))
964
-
965
- return isSafe && !isUnsafe
966
- }
967
-
968
- /**
969
- * Check if NoSQL query uses schema validation or allowlist
970
- */
971
- function isNoSQLSafe(content: string, lineNumber: number, lines?: string[]): boolean {
972
- const _lines = lines ?? content.split('\n')
973
- const contextStart = Math.max(0, lineNumber - 15)
974
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
975
- const context = _lines.slice(contextStart, contextEnd).join('\n')
976
-
977
- const safePatterns = [
978
- /schema\.parse\s*\(/i, // Zod schema validation
979
- /\.validate\s*\(/i, // Joi/Yup validation
980
- /allowedOperators/i, // Operator allowlist
981
- /allowedFields/i, // Field allowlist
982
- /sanitizeQuery/i, // Query sanitization function
983
- /mongo-sanitize/i, // mongo-sanitize library
984
- /mongoose\.(?:Schema|model)/i, // Using Mongoose models (safer)
985
- ]
986
-
987
- return safePatterns.some(p => p.test(context))
988
- }
989
-
990
- /**
991
- * Check if regex has complexity validation or timeout
992
- */
993
- function isRegexSafe(content: string, lineNumber: number, lines?: string[]): boolean {
994
- const _lines = lines ?? content.split('\n')
995
- const contextStart = Math.max(0, lineNumber - 15)
996
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
997
- const context = _lines.slice(contextStart, contextEnd).join('\n')
998
-
999
- const safePatterns = [
1000
- /safe-regex/i, // safe-regex library
1001
- /recheck/i, // recheck library
1002
- /regex-timeout/i, // Timeout wrapper
1003
- /RE2/i, // RE2 library (safe by design)
1004
- /validateRegex/i, // Custom validation
1005
- /maxLength|maxPatternLength/i, // Length limits
1006
- /try\s*\{[^}]*new\s+RegExp[^}]*\}\s*catch/i, // Try-catch around regex
1007
- ]
1008
-
1009
- return safePatterns.some(p => p.test(context))
1010
- }
1011
-
1012
- /**
1013
- * Check if dynamic import uses allowlist
1014
- */
1015
- function isImportAllowlisted(content: string, lineNumber: number, lines?: string[]): boolean {
1016
- const _lines = lines ?? content.split('\n')
1017
- const contextStart = Math.max(0, lineNumber - 15)
1018
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
1019
- const context = _lines.slice(contextStart, contextEnd).join('\n')
1020
-
1021
- const importAllowlistPatterns = [
1022
- /ALLOWED_PLUGINS\s*[=:]/i, // Plugin allowlist
1023
- /importMap\s*[=:]/i, // Import map object
1024
- /allowedModules/i, // Module allowlist
1025
- /if\s*\(\s*\w+\s+in\s+importMap\)/i, // Key in import map
1026
- /if\s*\(\s*loader\)/i, // Loader function check (from allowlist)
1027
- /\[aiModule\]\s*$/i, // Array access into known object (allowlist lookup)
1028
- ]
1029
-
1030
- return importAllowlistPatterns.some(p => p.test(context))
1031
- }
1032
-
1033
- // ============================================================================
1034
- // Main Detection Function
1035
- // ============================================================================
1036
-
1037
- /**
1038
- * Get surrounding context for analysis
1039
- */
1040
- function getSurroundingContext(content: string, lineIndex: number, windowSize: number = 15, lines?: string[]): string {
1041
- const _lines = lines ?? content.split('\n')
1042
- const start = Math.max(0, lineIndex - windowSize)
1043
- const end = Math.min(_lines.length, lineIndex + windowSize)
1044
- return _lines.slice(start, end).join('\n')
1045
- }
1046
-
1047
- /**
1048
- * Calculate severity based on sandbox and validation status
1049
- */
1050
- function calculateSeverity(
1051
- baseSeverity: VulnerabilitySeverity,
1052
- sinkType: SinkType,
1053
- isSandboxed: boolean,
1054
- hasValidation: boolean,
1055
- isTestFile: boolean,
1056
- isExample: boolean = false,
1057
- isLibrary: boolean = false
1058
- ): VulnerabilitySeverity {
1059
- let severity = baseSeverity
1060
-
1061
- // Test files get significant downgrade
1062
- if (isTestFile) {
1063
- return 'info'
1064
- }
1065
-
1066
- // Example/demo code - not production, for tutorials
1067
- if (isExample) {
1068
- return 'info'
1069
- }
1070
-
1071
- // Library code - base utilities, consumers add restrictions
1072
- if (isLibrary) {
1073
- return 'info'
1074
- }
1075
-
1076
- // Sandboxing provides major protection for code execution
1077
- if (isSandboxed) {
1078
- if (sinkType === 'code_execution') {
1079
- severity = hasValidation ? 'low' : 'medium'
1080
- } else {
1081
- // Sandboxing less relevant for SQL/shell
1082
- severity = hasValidation ? 'medium' : 'high'
1083
- }
1084
- } else if (hasValidation) {
1085
- // Validation alone helps but doesn't eliminate risk
1086
- if (baseSeverity === 'critical') {
1087
- severity = 'high'
1088
- } else if (baseSeverity === 'high') {
1089
- severity = 'medium'
1090
- }
1091
- }
1092
-
1093
- return severity
1094
- }
1095
-
1096
- /**
1097
- * Main detection function for LLM output execution sinks
1098
- */
1099
- export function detectAIExecutionSinks(
1100
- content: string,
1101
- filePath: string,
1102
- options?: { parsed?: ParsedFile }
1103
- ): Vulnerability[] {
1104
- const vulnerabilities: Vulnerability[] = []
1105
-
1106
- // Skip non-applicable files
1107
- if (isScannerOrFixtureFile(filePath)) return vulnerabilities
1108
-
1109
- // Only deeply scan files that appear to be in LLM context
1110
- // But still do basic scanning on all files for obvious patterns
1111
- const isLLMFile = isLLMContextFile(filePath, content)
1112
- const lines = options?.parsed?.lines ?? content.split('\n')
1113
- const isTestFile = isTestOrMockFile(filePath)
1114
- const isExample = isExampleDirectory(filePath)
1115
- const isLibrary = isLibraryCode(filePath)
1116
-
1117
- for (const pattern of EXECUTION_SINK_PATTERNS) {
1118
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1119
- let match
1120
-
1121
- while ((match = regex.exec(content)) !== null) {
1122
- const lineNumber = content.substring(0, match.index).split('\n').length
1123
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1124
-
1125
- // Skip comments
1126
- if (isComment(lineContent)) continue
1127
-
1128
- const surroundingContext = getSurroundingContext(content, lineNumber - 1, 15, lines)
1129
-
1130
- // Check if this is actually in an LLM context
1131
- const hasLLMContext = isLLMFile || hasLLMResponseContext(lineContent, surroundingContext)
1132
-
1133
- // ===== FALSE POSITIVE FILTERS =====
1134
-
1135
- // Skip UI suggestion/template patterns (command palettes, autocomplete, etc.)
1136
- // These are display strings, not execution sinks
1137
- if (isUITemplateSuggestion(lineContent, surroundingContext)) {
1138
- continue
1139
- }
1140
-
1141
- // Skip app data interpolation (e.g., ${node.title}, ${item.id})
1142
- // where the interpolated data is from the app, not LLM output
1143
- if (isAppDataInterpolation(lineContent, surroundingContext)) {
1144
- continue
1145
- }
1146
-
1147
- // For non-LLM files, require stronger signal
1148
- if (!hasLLMContext) {
1149
- // Check if the matched variable looks like LLM output
1150
- const matchText = match[0]
1151
- const variableMatch = matchText.match(/(?:response|result|output|completion|message|content|answer|generated|text)/i)
1152
- if (!variableMatch) continue
1153
-
1154
- // Skip if this looks like display-only usage
1155
- if (isDisplayOnly(lineContent, surroundingContext)) continue
1156
- }
1157
-
1158
- // Check for sandboxing and validation
1159
- const isSandboxed = isSandboxedExecution(content, lineNumber, lines)
1160
- const hasValidation = hasOutputValidation(content, lineNumber, lines)
1161
-
1162
- // ===== SINK-SPECIFIC VALIDATION CHECKS =====
1163
-
1164
- // Phase 2: Check for URL validation on network/redirect sinks (SSRF, Open Redirect)
1165
- const isNetworkSink = pattern.name.includes('fetch') || pattern.name.includes('axios') ||
1166
- pattern.name.includes('HTTP') || pattern.name.includes('redirect') ||
1167
- pattern.name.includes('location') || pattern.name.includes('got')
1168
- if (isNetworkSink) {
1169
- const urlValidLevel = getURLValidationLevel(content, lineNumber, lines)
1170
- if (urlValidLevel === 'strong') {
1171
- continue // Skip - strong URL validation present
1172
- }
1173
- }
1174
-
1175
- // Phase 3: Check for DOM sanitization on template_render sinks
1176
- const hasDOMSanitization = pattern.sinkType === 'template_render'
1177
- ? isDOMSanitized(lineContent, surroundingContext)
1178
- : false
1179
-
1180
- // Skip DOM findings if sanitized
1181
- if (hasDOMSanitization && pattern.sinkType === 'template_render') {
1182
- continue
1183
- }
1184
-
1185
- // Check for header sanitization
1186
- const isHeaderSink = pattern.name.includes('header') || pattern.name.includes('cookie') ||
1187
- pattern.name.includes('res.type')
1188
- if (isHeaderSink && isHeaderSanitized(content, lineNumber, lines)) {
1189
- continue // Skip - header value is sanitized
1190
- }
1191
-
1192
- // Check for path validation on file system sinks
1193
- const isFileSink = pattern.name.includes('file path') || pattern.name.includes('fs operation') ||
1194
- pattern.name.includes('path.join')
1195
- if (isFileSink && isPathValidated(content, lineNumber, lines)) {
1196
- continue // Skip - path is validated
1197
- }
1198
-
1199
- // Check for SQL parameterization
1200
- const isSQLSink = pattern.sinkType === 'sql_builder'
1201
- if (isSQLSink && isSQLParameterized(lineContent, surroundingContext)) {
1202
- continue // Skip - SQL is parameterized or uses allowlist
1203
- }
1204
-
1205
- // Check for shell allowlist
1206
- const isShellSink = pattern.sinkType === 'shell_command'
1207
- if (isShellSink && isShellAllowlisted(content, lineNumber, lines)) {
1208
- continue // Skip - shell command uses allowlist
1209
- }
1210
-
1211
- // Check for import allowlist
1212
- const isImportSink = pattern.name.includes('import') || pattern.name.includes('require')
1213
- if (isImportSink && isImportAllowlisted(content, lineNumber, lines)) {
1214
- continue // Skip - import uses allowlist
1215
- }
1216
-
1217
- // Check for template engine safety (autoescape, sanitization)
1218
- const isTemplateEngineSink = pattern.name.includes('EJS') || pattern.name.includes('Handlebars') ||
1219
- pattern.name.includes('Pug') || pattern.name.includes('Nunjucks') || pattern.name.includes('Jinja2') ||
1220
- pattern.name.includes('Mustache')
1221
- if (isTemplateEngineSink && isTemplateSafe(content, lineNumber, lines)) {
1222
- continue // Skip - template engine has safe configuration
1223
- }
1224
-
1225
- // Check for NoSQL query safety
1226
- const isNoSQLSink = pattern.name.includes('NoSQL') || pattern.name.includes('MongoDB') ||
1227
- pattern.name.includes('$where')
1228
- if (isNoSQLSink && isNoSQLSafe(content, lineNumber, lines)) {
1229
- continue // Skip - NoSQL query is validated
1230
- }
1231
-
1232
- // Check for regex safety (ReDoS protection)
1233
- const isRegexSink = pattern.name.includes('regex') || pattern.name.includes('RegExp')
1234
- if (isRegexSink && isRegexSafe(content, lineNumber, lines)) {
1235
- continue // Skip - regex has safety measures
1236
- }
1237
-
1238
- // Check for Python-specific safe patterns
1239
- const isPythonSink = pattern.name.includes('Python') || pattern.name.includes('pickle') ||
1240
- pattern.name.includes('subprocess') || pattern.name.includes('os.system')
1241
- if (isPythonSink && isPythonSafe(lineContent, surroundingContext)) {
1242
- continue // Skip - Python code uses safe patterns
1243
- }
1244
-
1245
- // Check for ast.literal_eval (Python safe eval) - this is a safe alternative to eval()
1246
- // It matches the eval pattern because literal_eval contains "eval("
1247
- if (pattern.name.includes('eval') && /ast\.literal_eval\s*\(/i.test(lineContent)) {
1248
- continue // Skip - ast.literal_eval is safe, only evaluates literals
1249
- }
1250
-
1251
- // Check URL validation level for severity adjustment
1252
- const hasURLValid = isNetworkSink ? getURLValidationLevel(content, lineNumber, lines) !== 'none' : false
1253
-
1254
- // Combine validation checks (URL validation counts as validation for network sinks)
1255
- const effectiveValidation = hasValidation || hasURLValid
1256
-
1257
- // Calculate final severity
1258
- const severity = calculateSeverity(
1259
- pattern.baseSeverity,
1260
- pattern.sinkType,
1261
- isSandboxed,
1262
- effectiveValidation,
1263
- isTestFile,
1264
- isExample,
1265
- isLibrary
1266
- )
1267
-
1268
- // Build description with context
1269
- let description = pattern.description
1270
- if (isSandboxed) {
1271
- description += ' (Sandbox detected - risk somewhat mitigated.)'
1272
- }
1273
- if (hasValidation) {
1274
- description += ' (Some validation detected nearby.)'
1275
- }
1276
- if (hasURLValid && !hasValidation) {
1277
- description += ' (URL validation detected nearby.)'
1278
- }
1279
- if (isTestFile) {
1280
- description += ' (In test file.)'
1281
- } else if (isExample) {
1282
- description += ' (In example/demo directory - tutorial code.)'
1283
- } else if (isLibrary) {
1284
- description += ' (Library code - consumers add restrictions.)'
1285
- }
1286
-
1287
- // Skip info-level in non-LLM files to reduce noise
1288
- if (severity === 'info' && !isLLMFile) continue
1289
-
1290
- vulnerabilities.push({
1291
- id: `ai-exec-${filePath}-${lineNumber}-${pattern.sinkType}`,
1292
- filePath,
1293
- lineNumber,
1294
- lineContent,
1295
- severity,
1296
- category: 'ai_unsafe_execution',
1297
- title: pattern.name,
1298
- description,
1299
- suggestedFix: pattern.suggestedFix,
1300
- confidence: hasLLMContext ? 'high' : 'medium',
1301
- layer: 2,
1302
- source: 'ai_code' as const,
1303
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1304
- baseConfidence: BASE_CONFIDENCE,
1305
- })
1306
- }
1307
- }
1308
-
1309
- return vulnerabilities
1310
- }