@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,1662 +0,0 @@
1
- /**
2
- * Layer 2: AI Agent Tool Permission Detection
3
- * Detects overly permissive agent tools and missing authorization checks
4
- *
5
- * Covers B4: Agent/tool orchestration logic
6
- *
7
- * Issues detected:
8
- * - Tools with unrestricted file system access
9
- * - Tools with unrestricted network access
10
- * - Tools with shell/code execution capability
11
- * - Tools without user/tenant context verification
12
- * - Database tools without proper scoping
13
- */
14
-
15
- import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
16
- import type { ParsedFile } from '../../shared/parsed-file'
17
- import {
18
- isComment,
19
- isTestOrMockFile,
20
- isScannerOrFixtureFile,
21
- isExampleDirectory,
22
- isLibraryCode,
23
- } from '../../parse/file-classifier'
24
-
25
- const BASE_CONFIDENCE = 0.50
26
-
27
- // ============================================================================
28
- // Agent/Tool Context Detection
29
- // ============================================================================
30
-
31
- /**
32
- * Check if file contains agent or tool definitions
33
- */
34
- function isAgentOrToolFile(filePath: string, content: string): boolean {
35
- // File path indicators
36
- const agentPathPatterns = [
37
- /\/(agents?|tools?|functions?|actions?)\//i,
38
- /\/(mcp|langchain|llamaindex|autogen)\//i,
39
- /(agent|tool|function|action).*\.(ts|js|py)$/i,
40
- ]
41
-
42
- if (agentPathPatterns.some(p => p.test(filePath))) {
43
- return true
44
- }
45
-
46
- // Content patterns indicating tool/agent definitions
47
- const toolDefinitionPatterns = [
48
- /@tool/i, // Python decorator
49
- /def\s+\w+_tool\s*\(/i, // Python tool function
50
- /defineTool\s*\(/i, // JS/TS tool definition
51
- /createTool\s*\(/i, // Tool creation
52
- /\.registerTool\s*\(/i, // Tool registration
53
- /\.addTool\s*\(/i, // Adding tool to agent
54
- /tools\s*:\s*\[/i, // Tools array
55
- /FunctionTool|StructuredTool/i, // LangChain tools
56
- /tool_choice|function_call/i, // OpenAI function calling
57
- /Tool\s*\(\s*\{/i, // Tool configuration object
58
- /type:\s*['"`]function['"`]/i, // OpenAI function type
59
- /mcpServer|McpServer/i, // MCP server
60
- ]
61
-
62
- return toolDefinitionPatterns.some(p => p.test(content))
63
- }
64
-
65
- /**
66
- * Find tool definition boundaries (start and end lines)
67
- */
68
- function findToolDefinitionContext(
69
- content: string,
70
- lineNumber: number,
71
- windowSize: number = 30
72
- ): { context: string; startLine: number; endLine: number } {
73
- const lines = content.split('\n')
74
- const startLine = Math.max(0, lineNumber - windowSize)
75
- const endLine = Math.min(lines.length, lineNumber + windowSize)
76
-
77
- return {
78
- context: lines.slice(startLine, endLine).join('\n'),
79
- startLine,
80
- endLine,
81
- }
82
- }
83
-
84
- // ============================================================================
85
- // Authorization Detection
86
- // ============================================================================
87
-
88
- /**
89
- * Check if user context is verified in tool
90
- */
91
- function hasUserContextVerification(context: string): boolean {
92
- const userContextPatterns = [
93
- /user[_.]?id/i,
94
- /userId/i,
95
- /currentUser/i,
96
- /req\.user/i,
97
- /request\.user/i,
98
- /session\.user/i,
99
- /getUser\s*\(/i,
100
- /getCurrentUser\s*\(/i,
101
- /authenticatedUser/i,
102
- /ctx\.user/i,
103
- /context\.user/i,
104
- ]
105
-
106
- return userContextPatterns.some(p => p.test(context))
107
- }
108
-
109
- /**
110
- * Check if tenant/organization context is verified
111
- */
112
- function hasTenantContextVerification(context: string): boolean {
113
- const tenantContextPatterns = [
114
- /tenant[_.]?id/i,
115
- /tenantId/i,
116
- /org[_.]?id/i,
117
- /orgId/i,
118
- /organization[_.]?id/i,
119
- /workspace[_.]?id/i,
120
- /workspaceId/i,
121
- /team[_.]?id/i,
122
- /teamId/i,
123
- /account[_.]?id/i,
124
- /accountId/i,
125
- ]
126
-
127
- return tenantContextPatterns.some(p => p.test(context))
128
- }
129
-
130
- /**
131
- * Check if this is an MCP file with proper security controls
132
- * MCP files with sanitization and authorization should be downgraded
133
- */
134
- function isMCPFileWithSafePatterns(content: string, filePath: string): boolean {
135
- // Check if this is an MCP file
136
- const mcpPatterns = [
137
- /McpServer/i,
138
- /@modelcontextprotocol/i,
139
- /server\.tool\s*\(/i,
140
- /@server\.tool/i,
141
- /\/mcp\//i,
142
- ]
143
-
144
- if (!mcpPatterns.some(p => p.test(content) || p.test(filePath))) {
145
- return false
146
- }
147
-
148
- // Check for content sanitization patterns
149
- const sanitizationPatterns = [
150
- /sanitize|DOMPurify|purify/i,
151
- /escapeHtml|escape_html/i,
152
- /validateSchema|schema\.parse|safeParse/i,
153
- /ALLOWED_TAGS/i,
154
- /filterHtml|cleanHtml/i,
155
- ]
156
-
157
- // Check for authorization patterns
158
- const authorizationPatterns = [
159
- /if\s*\([^)]*ownerId\s*[!=]==?/i,
160
- /if\s*\([^)]*userId\s*[!=]==?/i,
161
- /if\s*\([^)]*tenantId\s*[!=]==?/i,
162
- /throw.*Error.*(?:auth|Forbidden|Unauthorized)/i,
163
- /Not\s*authorized/i,
164
- /checkPermission|hasPermission|isAuthorized/i,
165
- ]
166
-
167
- const hasSanitization = sanitizationPatterns.some(p => p.test(content))
168
- const hasAuthorization = authorizationPatterns.some(p => p.test(content))
169
-
170
- // MCP file with BOTH sanitization AND authorization is safe
171
- return hasSanitization && hasAuthorization
172
- }
173
-
174
- /**
175
- * Patterns indicating strong/verified restrictions (actual implementation)
176
- */
177
- const STRONG_RESTRICTION_PATTERNS = [
178
- // Sandboxing libraries and environments
179
- /\bvm2\b/i,
180
- /\bisolated-vm\b/i,
181
- /\bquickjs\b/i,
182
- /\bsandboxed\b/i,
183
- /\bRestrictedPython\b/i,
184
- /\bnsjail\b/i,
185
- /\bfirejail\b/i,
186
- /\bgvisor\b/i,
187
-
188
- // Explicit path/resource restrictions with arrays
189
- /allowed(?:Paths|Files|Dirs|Hosts|Urls|Commands)\s*[=:]\s*\[/i,
190
- /(?:white|allow)list\s*[=:]\s*\[/i,
191
- /(?:blocked|denied|forbidden)(?:Paths|Hosts|Commands)\s*[=:]\s*\[/i,
192
-
193
- // Path validation functions
194
- /validatePath\s*\(/i,
195
- /isAllowedPath\s*\(/i,
196
- /checkPathAccess\s*\(/i,
197
- /resolvePath.*allowed/i,
198
- /path\.resolve.*includes/i,
199
-
200
- // Sandbox configuration objects
201
- /sandbox\s*[=:]\s*(?:true|\{)/i,
202
- /readonly\s*[=:]\s*true/i,
203
- /readOnly\s*[=:]\s*true/i,
204
-
205
- // Container/isolation patterns
206
- /\b(?:docker|podman)\s+run\b.*--read-only/i,
207
- /seccomp/i,
208
- /capabilities\s*[=:]\s*\[\s*\]/i, // Empty capabilities = restricted
209
-
210
- // Permission checking code
211
- /if\s*\(\s*!?\s*(?:allowed|permitted|authorized)/i,
212
- /(?:check|verify|validate)(?:Access|Permission|Capability)\s*\(/i,
213
- ]
214
-
215
- /**
216
- * Patterns indicating weak/unverified restriction mentions (comments, TODOs)
217
- */
218
- const WEAK_RESTRICTION_PATTERNS = [
219
- // Comments mentioning restrictions without implementation
220
- /\/\/.*(?:sandbox|restrict|allowlist|whitelist|todo)/i,
221
- /\/\*.*(?:sandbox|restrict|allowlist|whitelist|todo).*\*\//i,
222
- /#.*(?:sandbox|restrict|allowlist|whitelist|todo)/i,
223
-
224
- // TODOs and FIXMEs
225
- /TODO.*(?:add|implement|enable).*(?:sandbox|restrict|allowlist)/i,
226
- /FIXME.*(?:sandbox|restrict|security)/i,
227
-
228
- // Variable names without assignment
229
- /const\s+(?:sandbox|allowlist|whitelist)\s*;/i,
230
- ]
231
-
232
- /**
233
- * Check if tool has strong/verified access restrictions
234
- * These are actual implementations, not just mentions
235
- */
236
- function hasStrongRestrictions(context: string): boolean {
237
- // Check for strong patterns
238
- const hasStrong = STRONG_RESTRICTION_PATTERNS.some(p => p.test(context))
239
- if (!hasStrong) return false
240
-
241
- // Verify it's not just a weak mention
242
- const isWeak = WEAK_RESTRICTION_PATTERNS.some(p => p.test(context))
243
- return !isWeak
244
- }
245
-
246
- /**
247
- * Check if tool has any access restrictions/allowlists (including weak mentions)
248
- */
249
- function hasAccessRestrictions(context: string): boolean {
250
- const restrictionPatterns = [
251
- /allowedPaths/i,
252
- /allowedFiles/i,
253
- /allowedDirs/i,
254
- /allowedHosts/i,
255
- /allowedUrls/i,
256
- /allowedCommands/i,
257
- /allowedOperations/i,
258
- /whitelist/i,
259
- /allowlist/i,
260
- /permissions?:/i,
261
- /capabilities:/i,
262
- /restrictions?:/i,
263
- /constraints?:/i,
264
- /sandbox/i,
265
- /readonly/i,
266
- /readOnly/i,
267
- ]
268
-
269
- return restrictionPatterns.some(p => p.test(context))
270
- }
271
-
272
- // ============================================================================
273
- // Pattern Definitions
274
- // ============================================================================
275
-
276
- type ToolRiskType = 'filesystem' | 'network' | 'code_execution' | 'database' | 'shell'
277
-
278
- interface ToolPattern {
279
- name: string
280
- pattern: RegExp
281
- riskType: ToolRiskType
282
- baseSeverity: VulnerabilitySeverity
283
- description: string
284
- suggestedFix: string
285
- requiresUserContext?: boolean
286
- requiresTenantContext?: boolean
287
- requiresRestrictions?: boolean
288
- }
289
-
290
- const OVERPERMISSIVE_TOOL_PATTERNS: ToolPattern[] = [
291
- // ========== Filesystem Access Tools ==========
292
- {
293
- name: 'Unrestricted file read tool',
294
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:read|get).*file|(?:fs|filesystem).*(?:read|get)/gi,
295
- riskType: 'filesystem',
296
- baseSeverity: 'high',
297
- description: 'Tool provides file system read access. Without restrictions, agents can access any file the process can read.',
298
- suggestedFix: 'Add allowedPaths restriction. Example: { allowedPaths: ["/data/user-uploads"] }. Validate paths stay within allowed directories.',
299
- requiresRestrictions: true,
300
- },
301
- {
302
- name: 'Unrestricted file write tool',
303
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:write|create|save).*file|(?:fs|filesystem).*(?:write|create)/gi,
304
- riskType: 'filesystem',
305
- baseSeverity: 'high',
306
- description: 'Tool provides file system write access. Agents could overwrite critical files or create malicious files.',
307
- suggestedFix: 'Restrict to specific directories. Validate file extensions. Implement size limits. Consider using signed URLs instead of direct file access.',
308
- requiresRestrictions: true,
309
- },
310
- {
311
- name: 'File deletion tool',
312
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:delete|remove).*file|(?:fs|filesystem).*(?:delete|unlink|remove)/gi,
313
- riskType: 'filesystem',
314
- baseSeverity: 'high',
315
- description: 'Tool provides file deletion capability. High risk of data loss if misused.',
316
- suggestedFix: 'Implement soft-delete instead of hard delete. Require confirmation. Restrict to user-owned files only.',
317
- requiresRestrictions: true,
318
- requiresUserContext: true,
319
- },
320
-
321
- // ========== Network Access Tools ==========
322
- {
323
- name: 'Unrestricted HTTP/fetch tool',
324
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:http|fetch|request|api)|tool.*(?:fetch|request)\s*\(/gi,
325
- riskType: 'network',
326
- baseSeverity: 'medium',
327
- description: 'Tool provides network/HTTP access. Without restrictions, agents could make requests to internal services (SSRF) or exfiltrate data.',
328
- suggestedFix: 'Add allowedHosts configuration. Block internal/private IP ranges. Implement request signing for sensitive operations.',
329
- requiresRestrictions: true,
330
- },
331
- {
332
- name: 'Web scraping tool',
333
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:scrape|crawl|browse)/gi,
334
- riskType: 'network',
335
- baseSeverity: 'medium',
336
- description: 'Tool provides web scraping capability. Could be used for SSRF or accessing internal resources.',
337
- suggestedFix: 'Restrict to allowed domains. Block internal IP ranges. Implement rate limiting.',
338
- requiresRestrictions: true,
339
- },
340
-
341
- // ========== Code Execution Tools ==========
342
- {
343
- name: 'Code execution tool',
344
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:execute|run|eval).*(?:code|script)|tool.*(?:eval|exec)\s*\(/gi,
345
- riskType: 'code_execution',
346
- baseSeverity: 'critical',
347
- description: 'Tool provides code execution capability. This is extremely dangerous without sandboxing.',
348
- suggestedFix: 'Use vm2, isolated-vm, or similar sandboxing. Implement timeout and memory limits. Restrict available APIs/modules.',
349
- requiresRestrictions: true,
350
- },
351
- {
352
- name: 'Python interpreter tool',
353
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*python.*(?:exec|run|interpret)|PythonREPL|python_repl/gi,
354
- riskType: 'code_execution',
355
- baseSeverity: 'critical',
356
- description: 'Tool provides Python execution capability. Can execute arbitrary system commands.',
357
- suggestedFix: 'Use RestrictedPython or sandboxed environments. Block dangerous modules (os, subprocess, socket). Implement resource limits.',
358
- requiresRestrictions: true,
359
- },
360
-
361
- // ========== Shell/Command Tools ==========
362
- {
363
- name: 'Shell command tool',
364
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:shell|command|terminal|bash)|ShellTool|BashTool/gi,
365
- riskType: 'shell',
366
- baseSeverity: 'critical',
367
- description: 'Tool provides shell command execution. Allows arbitrary system commands.',
368
- suggestedFix: 'Implement strict command allowlisting. Use parameterized commands (execFile, not exec). Consider removing this capability entirely.',
369
- requiresRestrictions: true,
370
- },
371
- {
372
- name: 'System command tool',
373
- pattern: /(?:@tool|defineTool|createTool)[^)]*(?:system|exec|spawn|subprocess)/gi,
374
- riskType: 'shell',
375
- baseSeverity: 'critical',
376
- description: 'Tool with system command execution capability.',
377
- suggestedFix: 'Restrict to specific commands via allowlist. Validate all arguments. Log all command executions.',
378
- requiresRestrictions: true,
379
- },
380
-
381
- // ========== Database Tools ==========
382
- {
383
- name: 'Database query tool',
384
- pattern: /(?:@tool|defineTool|createTool|Tool\s*\()[^)]*(?:query|sql|database)|tool.*(?:query|execute)\s*\(/gi,
385
- riskType: 'database',
386
- baseSeverity: 'high',
387
- description: 'Tool provides database query access. Without scoping, agents could access any data.',
388
- suggestedFix: 'Always scope queries to current user/tenant. Use row-level security (RLS). Implement read-only mode for most operations.',
389
- requiresUserContext: true,
390
- requiresTenantContext: true,
391
- },
392
- {
393
- name: 'Raw SQL tool',
394
- pattern: /(?:@tool|defineTool|createTool)[^)]*(?:raw.*sql|execute.*sql)/gi,
395
- riskType: 'database',
396
- baseSeverity: 'critical',
397
- description: 'Tool allows raw SQL execution. High risk of SQL injection and unauthorized data access.',
398
- suggestedFix: 'Use parameterized queries only. Implement query validation. Consider using an ORM instead of raw SQL.',
399
- requiresUserContext: true,
400
- requiresTenantContext: true,
401
- },
402
-
403
- // ========== M5: MCP Server Tools ==========
404
- {
405
- name: 'MCP server tool registration',
406
- pattern: /(?:McpServer|Server)\s*\([^)]*\).*(?:setRequestHandler|tool|registerTool)|server\.tool\s*\(/gi,
407
- riskType: 'code_execution',
408
- baseSeverity: 'high',
409
- description: 'MCP (Model Context Protocol) server registering tools. Verify tool capabilities are appropriately restricted.',
410
- suggestedFix: 'Add capability restrictions to MCP server. Implement allowlists for file paths, network hosts, and commands.',
411
- requiresRestrictions: true,
412
- },
413
- {
414
- name: 'MCP tool with shell access',
415
- pattern: /server\.tool\s*\([^)]*(?:name:\s*['"`](?:run|exec|shell|command)[^)]*|(?:exec|spawn|shell)\s*\()/gi,
416
- riskType: 'shell',
417
- baseSeverity: 'critical',
418
- description: 'MCP tool with shell command execution capability. Extremely dangerous without restrictions.',
419
- suggestedFix: 'Use allowlist of permitted commands. Never allow arbitrary command execution. Consider read-only alternatives.',
420
- requiresRestrictions: true,
421
- },
422
- {
423
- name: 'MCP file system tool',
424
- pattern: /server\.tool\s*\([^)]*(?:name:\s*['"`](?:read|write|create|delete|list).*(?:file|dir)[^)]*|fs\.|readFile|writeFile)/gi,
425
- riskType: 'filesystem',
426
- baseSeverity: 'high',
427
- description: 'MCP tool with file system access. Agents could access or modify arbitrary files.',
428
- suggestedFix: 'Restrict to specific directories with allowedPaths. Implement path validation. Consider read-only access.',
429
- requiresRestrictions: true,
430
- },
431
-
432
- // ========== M5: Vercel AI SDK Tools ==========
433
- {
434
- name: 'Vercel AI SDK tool definition',
435
- pattern: /tool\s*\(\s*\{[^}]*(?:execute|parameters)/gi,
436
- riskType: 'code_execution',
437
- baseSeverity: 'medium',
438
- description: 'Vercel AI SDK tool definition. Review the execute function for dangerous operations.',
439
- suggestedFix: 'Validate tool parameters against expected schema. Implement proper access controls within execute function.',
440
- requiresUserContext: true,
441
- },
442
- {
443
- name: 'AI SDK tool with dangerous execute',
444
- pattern: /tool\s*\(\s*\{[^}]*execute\s*:\s*async[^}]*(?:exec|spawn|eval|fs\.|fetch\s*\()[^}]*\}/gi,
445
- riskType: 'code_execution',
446
- baseSeverity: 'high',
447
- description: 'Vercel AI SDK tool with potentially dangerous execute function (shell, eval, fs, or network access).',
448
- suggestedFix: 'Add validation and restrictions in execute function. Implement allowlists for external operations.',
449
- requiresRestrictions: true,
450
- },
451
- {
452
- name: 'StreamableUI tool action',
453
- pattern: /createStreamableUI.*tool.*\{.*action/gi,
454
- riskType: 'code_execution',
455
- baseSeverity: 'medium',
456
- description: 'Streamable UI tool with server action. Ensure proper authorization before state mutations.',
457
- suggestedFix: 'Verify user authentication and authorization before executing actions. Validate all inputs.',
458
- requiresUserContext: true,
459
- },
460
- ]
461
-
462
- // ============================================================================
463
- // Phase 2: Excessive Agency Detection
464
- // ============================================================================
465
-
466
- interface ExcessiveAgencyPattern {
467
- name: string
468
- pattern: RegExp
469
- baseSeverity: VulnerabilitySeverity
470
- description: string
471
- suggestedFix: string
472
- framework?: 'crewai' | 'autogen' | 'langchain' | 'generic'
473
- }
474
-
475
- /**
476
- * Check if agent has proper iteration limits
477
- */
478
- function hasIterationLimits(context: string): boolean {
479
- const limitPatterns = [
480
- /maxIterations\s*[:=]\s*\d{1,2}\b/i, // 1-99
481
- /max_iterations\s*[:=]\s*\d{1,2}\b/i,
482
- /iteration_limit\s*[:=]\s*\d{1,2}\b/i,
483
- /max_steps\s*[:=]\s*\d{1,2}\b/i,
484
- ]
485
- return limitPatterns.some(p => p.test(context))
486
- }
487
-
488
- /**
489
- * Check if agent has timeout configured
490
- */
491
- function hasTimeoutConfigured(context: string): boolean {
492
- const timeoutPatterns = [
493
- /timeout\s*[:=]\s*[1-9]\d*/i, // Positive number
494
- /max_execution_time\s*[:=]\s*[1-9]/i,
495
- /execution_timeout\s*[:=]\s*[1-9]/i,
496
- ]
497
- return timeoutPatterns.some(p => p.test(context))
498
- }
499
-
500
- /**
501
- * Check if human-in-the-loop is enabled
502
- */
503
- function hasHumanInLoop(context: string): boolean {
504
- const humanPatterns = [
505
- /humanInLoop\s*[:=]\s*true/i,
506
- /human_in_loop\s*[:=]\s*True/i,
507
- /requireApproval\s*[:=]\s*true/i,
508
- /require_approval\s*[:=]\s*True/i,
509
- /human_input_mode\s*[:=]\s*['"`](?:ALWAYS|TERMINATE)['"`]/i,
510
- /confirm_before\s*[:=]\s*true/i,
511
- ]
512
- return humanPatterns.some(p => p.test(context))
513
- }
514
-
515
- /**
516
- * Check if Docker is configured for code execution
517
- */
518
- function hasDockerConfigured(context: string): boolean {
519
- const dockerPatterns = [
520
- /use_docker\s*[:=]\s*True/i,
521
- /docker\s*[:=]\s*true/i,
522
- /container\s*[:=]\s*true/i,
523
- /sandboxed\s*[:=]\s*true/i,
524
- ]
525
- return dockerPatterns.some(p => p.test(context))
526
- }
527
-
528
- /**
529
- * Check if budget/cost limits are configured
530
- */
531
- function hasBudgetLimits(context: string): boolean {
532
- const budgetPatterns = [
533
- /budgetLimit|budget_limit/i,
534
- /costLimit|cost_limit/i,
535
- /max_cost|maxCost/i,
536
- /spending_limit/i,
537
- /token_limit|tokenLimit/i,
538
- ]
539
- return budgetPatterns.some(p => p.test(context))
540
- }
541
-
542
- /**
543
- * Phase 5: LLM Output Flow Patterns
544
- * Detect when LLM-generated content flows into dangerous operations
545
- */
546
- const LLM_OUTPUT_FLOW_PATTERNS: ExcessiveAgencyPattern[] = [
547
- // ========== LLM Output in Tool Names/Paths ==========
548
- {
549
- name: 'LLM output used as tool name',
550
- pattern: /(?:tools?\[|getTools?\s*\(|callTool\s*\(|invokeTool\s*\(|executeTool\s*\()\s*(?:response|result|output|completion|message|content|llm|ai|model|gpt|claude)\.(?:content|text|tool|toolName|function|name|choice)/gi,
551
- baseSeverity: 'critical',
552
- description: 'LLM output used directly as tool name for invocation. An adversarial prompt could cause the agent to call arbitrary tools, bypassing intended restrictions.',
553
- suggestedFix: 'Validate tool names against a static allowlist: const ALLOWED_TOOLS = [\'read\', \'write\'] as const; if (!ALLOWED_TOOLS.includes(toolName)) throw new Error("Invalid tool")',
554
- framework: 'generic',
555
- },
556
- {
557
- name: 'LLM output in file path',
558
- pattern: /(?:fs|file|path|fsp)\.(?:readFile|writeFile|unlink|rm|mkdir|readdir|access|stat|copyFile|rename)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:path|filePath|file|filename|directory|dir)/gi,
559
- baseSeverity: 'critical',
560
- description: 'LLM output used directly as file path. Path traversal or arbitrary file access could occur via prompt injection.',
561
- suggestedFix: 'Validate paths against allowed directories: if (!path.startsWith(ALLOWED_BASE_DIR)) throw new Error("Invalid path"). Use path.resolve() and verify the result stays within bounds.',
562
- framework: 'generic',
563
- },
564
- {
565
- name: 'LLM output in shell command',
566
- pattern: /(?:exec|spawn|execFile|execSync|spawnSync)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:command|cmd|script|code|executable|program)/gi,
567
- baseSeverity: 'critical',
568
- description: 'LLM output used directly as shell command. Remote code execution via prompt injection.',
569
- suggestedFix: 'Never use LLM output in shell commands. If necessary, use a strict allowlist of permitted commands and validate arguments.',
570
- framework: 'generic',
571
- },
572
- {
573
- name: 'LLM output in URL/endpoint',
574
- pattern: /(?:fetch|axios|http|request|got)\s*\(\s*(?:response|result|output|completion|message|content|llm|ai|model)\.(?:url|endpoint|href|uri|link|host)/gi,
575
- baseSeverity: 'high',
576
- description: 'LLM output used directly as URL or endpoint. SSRF risk via prompt injection.',
577
- suggestedFix: 'Validate URLs against allowed hosts. Use URL allowlists and block internal IP ranges.',
578
- framework: 'generic',
579
- },
580
- {
581
- name: 'LLM response destructured into tool call',
582
- pattern: /(?:const|let|var)\s*\{\s*(?:tool|toolName|function|functionName|action|method)\s*\}\s*=\s*(?:response|result|output|completion|message|llm|ai|model)/gi,
583
- baseSeverity: 'high',
584
- description: 'Tool name destructured from LLM response. This pattern suggests dynamic tool selection based on LLM output.',
585
- suggestedFix: 'Validate extracted tool names against a static allowlist before invocation.',
586
- framework: 'generic',
587
- },
588
- {
589
- name: 'Dynamic property access with LLM output',
590
- pattern: /(?:tools|handlers|actions|functions|methods)\s*\[\s*(?:response|result|output|completion|message|content|llm|ai)(?:\.|(?:\s*\[['"`]?(?:tool|name|function|action)))/gi,
591
- baseSeverity: 'high',
592
- description: 'Dynamic object property access using LLM output. Could access unintended tools or methods.',
593
- suggestedFix: 'Use explicit tool dispatch with allowlist validation: if (toolName in SAFE_TOOLS) { SAFE_TOOLS[toolName]() }',
594
- framework: 'generic',
595
- },
596
- ]
597
-
598
- /**
599
- * Phase 5: Tool Permission Accumulation Patterns
600
- * Detect unbounded tool registration and permission growth
601
- */
602
- const TOOL_ACCUMULATION_PATTERNS: ExcessiveAgencyPattern[] = [
603
- // ========== Unbounded Tool Registration ==========
604
- {
605
- name: 'Unbounded tool registration',
606
- pattern: /(?:agent|tools?|registry)\.(?:registerTool|addTool|push|add|set)\s*\(\s*(?:user|request|req|input|body|data|param)\.(?:tool|function|action|capability)/gi,
607
- baseSeverity: 'high',
608
- description: 'Tools registered dynamically from user input without bounds. Users could accumulate unlimited capabilities over time.',
609
- suggestedFix: 'Use a static allowlist: const ALLOWED_TOOLS = [...] and validate against it. Implement tool count limits.',
610
- framework: 'generic',
611
- },
612
- {
613
- name: 'Tool array push without limit check',
614
- pattern: /tools\.push\s*\([^)]+\)(?![\s\S]{0,50}(?:length\s*[<>]|limit|max|ALLOWED|whitelist|allowlist))/gi,
615
- baseSeverity: 'medium',
616
- description: 'Tools added to array without checking count limits. Tool list could grow unboundedly.',
617
- suggestedFix: 'Add limit check: if (tools.length >= MAX_TOOLS) throw new Error("Tool limit reached")',
618
- framework: 'generic',
619
- },
620
- {
621
- name: 'Dynamic tool loading from user config',
622
- pattern: /(?:require|import|loadModule|dynamicImport)\s*\(\s*(?:user|request|req|input|body|config)\.(?:tool|module|plugin|extension)/gi,
623
- baseSeverity: 'critical',
624
- description: 'Tool modules loaded dynamically from user-controlled paths. Could load arbitrary code.',
625
- suggestedFix: 'Use a static module registry. Validate module paths against an allowlist.',
626
- framework: 'generic',
627
- },
628
- {
629
- name: 'Permission grant without authorization check',
630
- pattern: /(?:grant|add|enable)(?:Permission|Capability|Access)\s*\(\s*[^)]*\)(?![\s\S]{0,30}(?:if|auth|permission|role|admin|isAdmin))/gi,
631
- baseSeverity: 'high',
632
- description: 'Permissions granted without visible authorization check. Users could escalate their own privileges.',
633
- suggestedFix: 'Add authorization check: if (!user.hasRole("admin")) throw new Error("Unauthorized")',
634
- framework: 'generic',
635
- },
636
- {
637
- name: 'Tool inheritance without restriction',
638
- pattern: /(?:inherit|extend|merge)(?:Tools|Capabilities|Permissions)\s*\(\s*(?:parent|base|source)\.tools/gi,
639
- baseSeverity: 'medium',
640
- description: 'Agent inherits tools from parent without filtering. Could inherit more permissions than intended.',
641
- suggestedFix: 'Explicitly list inherited tools instead of blanket inheritance. Use allowlist for permitted inherited capabilities.',
642
- framework: 'generic',
643
- },
644
- ]
645
-
646
- /**
647
- * Phase 5: Database Write Scoping Patterns
648
- * Detect database writes that may lack proper user scoping
649
- */
650
- const DB_WRITE_SCOPING_PATTERNS: ExcessiveAgencyPattern[] = [
651
- // ========== Database Writes Without User Scoping ==========
652
- {
653
- name: 'DB insert without userId',
654
- pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insert|create|save|add)\s*\(\s*\{(?![^}]*(?:userId|user_id|ownerId|owner_id|createdBy|created_by|authorId|author_id))[^}]*(?:content|data|text|body|message)\s*:/gi,
655
- baseSeverity: 'high',
656
- description: 'Database insert with content field but no user ID. AI-generated content may not be properly attributed to user.',
657
- suggestedFix: 'Add user context: db.insert({ content: aiGenerated, userId: ctx.user.id })',
658
- framework: 'generic',
659
- },
660
- {
661
- name: 'DB insert with AI content unscopedp',
662
- pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insert|create)\s*\(\s*\{[^}]*:\s*(?:response|result|output|completion|message|ai|llm|model)\.(?:content|text|data|output|result)/gi,
663
- baseSeverity: 'high',
664
- description: 'AI-generated content inserted into database. Ensure proper user scoping and content validation.',
665
- suggestedFix: 'Add user context and validate content: db.insert({ content: validated, userId: ctx.user.id, createdAt: Date.now() })',
666
- framework: 'generic',
667
- },
668
- {
669
- name: 'Bulk write without tenant filter',
670
- pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:insertMany|createMany|bulkCreate|bulkInsert)\s*\([^)]*\)(?![\s\S]{0,50}(?:tenantId|tenant_id|orgId|org_id|organizationId))/gi,
671
- baseSeverity: 'medium',
672
- description: 'Bulk database write without visible tenant scoping. Multi-tenant data isolation may be at risk.',
673
- suggestedFix: 'Add tenant filter to all bulk operations: records.map(r => ({ ...r, tenantId: ctx.tenant.id }))',
674
- framework: 'generic',
675
- },
676
- {
677
- name: 'Update without ownership check',
678
- pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:update|updateOne|updateMany)\s*\(\s*\{[^}]*id\s*:/gi,
679
- baseSeverity: 'medium',
680
- description: 'Database update by ID without visible ownership verification. Agent could modify other users\' data.',
681
- suggestedFix: 'Add ownership check: db.update({ where: { id, userId: ctx.user.id }, data: { ... } })',
682
- framework: 'generic',
683
- },
684
- {
685
- name: 'Delete without user scoping',
686
- pattern: /(?:db|database|prisma|knex|sequelize|mongoose|supabase|drizzle)\.(?:delete|deleteOne|deleteMany|destroy|remove)\s*\(\s*\{[^}]*id\s*:/gi,
687
- baseSeverity: 'high',
688
- description: 'Database delete by ID without user scoping. Agent could delete other users\' data.',
689
- suggestedFix: 'Add user scoping: db.delete({ where: { id, userId: ctx.user.id } })',
690
- framework: 'generic',
691
- },
692
- ]
693
-
694
- /**
695
- * Phase 6 Task 1: Tool Parameter Injection Patterns
696
- * Detect LLM output flowing to tool parameters (not just tool names)
697
- */
698
- const TOOL_PARAMETER_INJECTION_PATTERNS: ExcessiveAgencyPattern[] = [
699
- // LLM output in tool parameters
700
- {
701
- name: 'LLM output in tool parameters',
702
- pattern: /tool\s*\(\s*\{[^}]*:\s*(response|output|result|content|message|llmOutput|aiResponse|completion)(\.\w+)*\s*[,}]/gi,
703
- baseSeverity: 'high',
704
- description: 'Tool parameters derived from unvalidated LLM output can be manipulated via prompt injection. Attackers could modify tool behavior through crafted responses.',
705
- suggestedFix: 'Validate and sanitize LLM output before passing as tool parameters. Use schema validation (zod, yup) to ensure expected structure.',
706
- framework: 'generic',
707
- },
708
- // Tool args assigned directly from LLM output
709
- {
710
- name: 'Tool args from LLM output',
711
- pattern: /\bargs\s*=\s*(response|output|result|content|message|llmOutput|aiResponse|completion)(\.\w+)*/gi,
712
- baseSeverity: 'high',
713
- description: 'Tool arguments assigned directly from LLM output enable parameter injection. Malicious prompts could inject unexpected arguments.',
714
- suggestedFix: 'Use schema validation (zod, yup) on LLM output before passing to tools: const validatedArgs = toolArgsSchema.parse(llmOutput)',
715
- framework: 'generic',
716
- },
717
- // Spread LLM output into tool call
718
- {
719
- name: 'LLM output spread into tool call',
720
- pattern: /(?:executeTool|callTool|invokeTool|runTool)\s*\([^)]*\.\.\.(?:response|output|result|content|llmOutput|aiResponse)/gi,
721
- baseSeverity: 'critical',
722
- description: 'LLM output spread directly into tool invocation. All LLM-provided fields pass through unvalidated.',
723
- suggestedFix: 'Destructure and validate specific fields: const { field1, field2 } = schema.parse(llmOutput); executeTool({ field1, field2 })',
724
- framework: 'generic',
725
- },
726
- // Dynamic property access for tool params
727
- {
728
- name: 'Dynamic tool param from LLM',
729
- pattern: /toolParams?\s*\[\s*(response|output|result|llmOutput|aiResponse)\./gi,
730
- baseSeverity: 'high',
731
- description: 'Tool parameter accessed dynamically from LLM output. Could access unintended parameters.',
732
- suggestedFix: 'Use explicit parameter extraction with validation: const param = validateParam(llmOutput.expectedField)',
733
- framework: 'generic',
734
- },
735
- // JSON.parse of LLM output for tool params
736
- {
737
- name: 'JSON parsed LLM output as tool params',
738
- pattern: /JSON\.parse\s*\(\s*(response|output|result|content|llmOutput|aiResponse|completion)(?:\.\w+)?\s*\)[^;]*(?:tool|execute|invoke|call)/gi,
739
- baseSeverity: 'high',
740
- description: 'LLM output JSON-parsed and used as tool parameters. Parsed structure could contain malicious fields.',
741
- suggestedFix: 'Validate parsed JSON against expected schema: const params = toolParamsSchema.parse(JSON.parse(llmOutput))',
742
- framework: 'generic',
743
- },
744
- ]
745
-
746
- /**
747
- * Phase 6 Task 2: Tool Error Message Injection Patterns
748
- * Detect raw error exposure to LLM that could leak system information or enable injection
749
- */
750
- const TOOL_ERROR_INJECTION_PATTERNS: ExcessiveAgencyPattern[] = [
751
- // Raw error message in tool response
752
- {
753
- name: 'Raw error in tool response',
754
- pattern: /catch\s*\([^)]*\)\s*\{[^}]*(return|resolve)\s*\([^)]*error\.(message|stack|toString)/gi,
755
- baseSeverity: 'medium',
756
- description: 'Raw error messages returned to LLM could leak system information (paths, credentials, internal state) or be used for prompt injection attacks.',
757
- suggestedFix: 'Return sanitized, generic error messages to LLM. Log detailed errors server-side: catch (e) { logger.error(e); return { error: "Operation failed" } }',
758
- framework: 'generic',
759
- },
760
- // Error object in tool return
761
- {
762
- name: 'Error object in tool return',
763
- pattern: /return\s*\{[^}]*error\s*:\s*(?:e|err|error)(?:\s*,|\s*\})/gi,
764
- baseSeverity: 'medium',
765
- description: 'Error object returned directly to LLM. Full error objects may contain sensitive stack traces or internal details.',
766
- suggestedFix: 'Return only error message or generic status: return { error: "Failed to process request", code: "OPERATION_FAILED" }',
767
- framework: 'generic',
768
- },
769
- // Stack trace in response
770
- {
771
- name: 'Stack trace in tool response',
772
- pattern: /return\s*\{[^}]*(?:stack|stackTrace|trace)\s*:\s*(?:e|err|error)\./gi,
773
- baseSeverity: 'high',
774
- description: 'Stack trace returned to LLM. Stack traces expose internal code paths, file structures, and potentially sensitive data.',
775
- suggestedFix: 'Never return stack traces to LLM. Log them server-side for debugging: logger.error({ stack: e.stack }); return { error: "Internal error" }',
776
- framework: 'generic',
777
- },
778
- // Exception details in resolve/reject
779
- {
780
- name: 'Exception details in promise resolution',
781
- pattern: /(?:resolve|reject)\s*\(\s*\{[^}]*(?:exception|error|e)\s*:\s*(?:e|err|error)(?:\.message|\.stack)?/gi,
782
- baseSeverity: 'medium',
783
- description: 'Exception details passed in promise resolution. Error information flows to LLM context.',
784
- suggestedFix: 'Sanitize error information before resolving: resolve({ success: false, error: sanitizeError(e) })',
785
- framework: 'generic',
786
- },
787
- // String interpolation with error
788
- {
789
- name: 'Error interpolated in response string',
790
- pattern: /return\s*[`'"].*\$\{(?:e|err|error)(?:\.message|\.stack)?\}.*[`'"]/gi,
791
- baseSeverity: 'medium',
792
- description: 'Error details interpolated into response string. Raw error text could contain sensitive information.',
793
- suggestedFix: 'Use generic error messages: return `Operation failed: ${getGenericErrorMessage(e.code)}`',
794
- framework: 'generic',
795
- },
796
- ]
797
-
798
- /**
799
- * Phase 5: Recursive Agent Patterns
800
- * Detect unbounded agent recursion and self-spawning patterns
801
- */
802
- const RECURSIVE_AGENT_PATTERNS: ExcessiveAgencyPattern[] = [
803
- // ========== Unbounded Agent Recursion ==========
804
- {
805
- name: 'Recursive agent call without depth limit',
806
- pattern: /(?:async\s+)?function\s+(?:run|execute|process|handle)?Agent\s*\([^)]*\)\s*\{[\s\S]{0,200}(?:run|execute|process|handle)?Agent\s*\((?![^)]*depth|[^)]*level|[^)]*recursion)/gi,
807
- baseSeverity: 'high',
808
- description: 'Agent function calls itself without visible depth parameter. Could recurse indefinitely.',
809
- suggestedFix: 'Add depth limit: async function runAgent(task, depth = 0) { if (depth > MAX_DEPTH) throw new Error("Max depth"); await runAgent(subtask, depth + 1) }',
810
- framework: 'generic',
811
- },
812
- {
813
- name: 'Agent spawns sub-agent without limit',
814
- pattern: /(?:spawn|create|launch|start)(?:Agent|Worker|Task)\s*\([^)]*\)(?![\s\S]{0,50}(?:depth|level|count|limit|max|MAX))/gi,
815
- baseSeverity: 'medium',
816
- description: 'Sub-agent spawned without visible depth or count limit. Could lead to unbounded agent proliferation.',
817
- suggestedFix: 'Track agent depth/count: if (agentCount >= MAX_AGENTS || depth > MAX_DEPTH) throw new Error("Agent limit reached")',
818
- framework: 'generic',
819
- },
820
- {
821
- name: 'Recursive task processing without bounds',
822
- pattern: /(?:result|response|output)\.(?:subtasks?|children|next|followUp)\s*\.(?:forEach|map|for)\s*\([^)]*(?:process|run|execute)(?:Task|Agent)/gi,
823
- baseSeverity: 'high',
824
- description: 'Tasks processed recursively based on agent output. Agent could generate unlimited subtasks.',
825
- suggestedFix: 'Limit subtask count: const subtasks = result.subtasks.slice(0, MAX_SUBTASKS). Track total processed tasks.',
826
- framework: 'generic',
827
- },
828
- {
829
- name: 'Self-improvement loop without termination',
830
- pattern: /while\s*\([^)]*(?:improve|optimize|refine|enhance)[^)]*\)\s*\{[\s\S]{0,100}(?:agent|model|llm)/gi,
831
- baseSeverity: 'high',
832
- description: 'Agent self-improvement loop without clear termination. Could run indefinitely.',
833
- suggestedFix: 'Add termination conditions: while (iterations < MAX_ITERATIONS && !satisfactory) { ... iterations++ }',
834
- framework: 'generic',
835
- },
836
- {
837
- name: 'CrewAI agent delegation without depth',
838
- pattern: /\.delegate\s*\(\s*[^)]*\)(?![\s\S]{0,30}(?:max_delegation|delegation_limit|depth))/gi,
839
- baseSeverity: 'medium',
840
- description: 'CrewAI agent delegation without depth limit. Agents could delegate indefinitely to each other.',
841
- suggestedFix: 'Set delegation limits in agent config: Agent(..., max_delegation_depth=3)',
842
- framework: 'crewai',
843
- },
844
- {
845
- name: 'LangGraph recursive edge without limit',
846
- pattern: /\.add_edge\s*\([^)]*,\s*(?:SAME_NODE|self|current_node)/gi,
847
- baseSeverity: 'medium',
848
- description: 'LangGraph edge points back to same node without visible limit. Could create infinite loops.',
849
- suggestedFix: 'Add iteration tracking and conditional edges with max_iterations check.',
850
- framework: 'langchain',
851
- },
852
- ]
853
-
854
- /**
855
- * Excessive agency patterns for unbounded agent autonomy
856
- */
857
- const EXCESSIVE_AGENCY_PATTERNS: ExcessiveAgencyPattern[] = [
858
- // ========== Generic Unbounded Loops ==========
859
- {
860
- name: 'Unbounded agent loop',
861
- pattern: /while\s*\(\s*(?:true|1|True)\s*\)[\s\S]{0,100}(?:agent|step|run|execute|iterate)/gi,
862
- baseSeverity: 'high',
863
- description: 'Agent runs in an unbounded loop without explicit termination condition. This can lead to infinite execution, resource exhaustion, or runaway costs.',
864
- suggestedFix: 'Add maxIterations limit: while (iterations < maxIterations) { ... }. Consider adding timeout and cost limits.',
865
- framework: 'generic',
866
- },
867
- {
868
- name: 'No iteration limit configured',
869
- pattern: /maxIterations\s*[:=]\s*(?:-1|null|undefined|None|Infinity|float\s*\(\s*['"`]inf)/gi,
870
- baseSeverity: 'high',
871
- description: 'Agent configured with no iteration limit. This allows unbounded execution which can consume excessive resources.',
872
- suggestedFix: 'Set a reasonable iteration limit: maxIterations: 10 (adjust based on your use case).',
873
- framework: 'generic',
874
- },
875
- {
876
- name: 'No timeout configured',
877
- pattern: /timeout\s*[:=]\s*(?:-1|0|null|undefined|None|false|False)/gi,
878
- baseSeverity: 'medium',
879
- description: 'Agent timeout is disabled or set to zero. Long-running agents can hang indefinitely.',
880
- suggestedFix: 'Configure a reasonable timeout: timeout: 300000 (5 minutes). Adjust based on expected execution time.',
881
- framework: 'generic',
882
- },
883
- {
884
- name: 'Auto-approve without human oversight',
885
- pattern: /(?:autoApprove|auto_approve)\s*[:=]\s*(?:true|True)/gi,
886
- baseSeverity: 'high',
887
- description: 'Agent auto-approves actions without human review. Combined with destructive capabilities, this is dangerous.',
888
- suggestedFix: 'Enable human-in-the-loop for sensitive operations: autoApprove: false, or implement approval workflows for destructive actions.',
889
- framework: 'generic',
890
- },
891
- {
892
- name: 'Human-in-loop disabled',
893
- pattern: /(?:humanInLoop|human_in_loop)\s*[:=]\s*(?:false|False)/gi,
894
- baseSeverity: 'medium',
895
- description: 'Human oversight is explicitly disabled. The agent can take actions without human review.',
896
- suggestedFix: 'Enable human-in-the-loop for sensitive operations: humanInLoop: true. Add confirmation prompts for destructive actions.',
897
- framework: 'generic',
898
- },
899
-
900
- // ========== CrewAI Specific ==========
901
- {
902
- name: 'CrewAI unsafe code execution mode',
903
- pattern: /code_execution_mode\s*[:=]\s*['"`]unsafe['"`]/gi,
904
- baseSeverity: 'critical',
905
- description: 'CrewAI agent configured with unsafe code execution mode. This allows arbitrary code execution without sandboxing.',
906
- suggestedFix: 'Use safe mode: code_execution_mode="safe". This runs code in a restricted environment.',
907
- framework: 'crewai',
908
- },
909
- {
910
- name: 'CrewAI code execution without Docker',
911
- pattern: /allow_code_execution\s*[:=]\s*True(?![\s\S]{0,50}use_docker\s*[:=]\s*True)/gi,
912
- baseSeverity: 'high',
913
- description: 'CrewAI agent allows code execution without Docker containerization. Code runs directly on the host system.',
914
- suggestedFix: 'Enable Docker for code execution: Agent(..., allow_code_execution=True, code_execution_config={"use_docker": True})',
915
- framework: 'crewai',
916
- },
917
-
918
- // ========== AutoGen Specific ==========
919
- {
920
- name: 'AutoGen use_docker=False',
921
- pattern: /(?:code_execution_config|LocalCommandLineCodeExecutor)\s*[\s\S]{0,50}use_docker\s*[:=]\s*False/gi,
922
- baseSeverity: 'critical',
923
- description: 'AutoGen code execution configured without Docker. Code executes directly on the host, enabling full system access.',
924
- suggestedFix: 'Use Docker: code_execution_config={"use_docker": True}. Or use DockerCommandLineCodeExecutor for sandboxed execution.',
925
- framework: 'autogen',
926
- },
927
- {
928
- name: 'AutoGen NEVER human input mode',
929
- pattern: /human_input_mode\s*[:=]\s*['"`]NEVER['"`]/gi,
930
- baseSeverity: 'high',
931
- description: 'AutoGen agent configured to never request human input. Agent can execute indefinitely without human oversight.',
932
- suggestedFix: 'Use "ALWAYS" or "TERMINATE" for human_input_mode. "TERMINATE" allows agent to complete but requests input on termination.',
933
- framework: 'autogen',
934
- },
935
- {
936
- name: 'AutoGen UserProxyAgent without reply limit',
937
- pattern: /UserProxyAgent\s*\((?![^)]*max_consecutive_auto_reply)[^)]*\)/gi,
938
- baseSeverity: 'medium',
939
- description: 'AutoGen UserProxyAgent without max_consecutive_auto_reply limit. Agent can auto-reply indefinitely.',
940
- suggestedFix: 'Add reply limit: UserProxyAgent(..., max_consecutive_auto_reply=10). Adjust limit based on expected conversation length.',
941
- framework: 'autogen',
942
- },
943
-
944
- // ========== LangChain Specific ==========
945
- {
946
- name: 'LangChain AgentExecutor without limits',
947
- pattern: /AgentExecutor\s*\([^)]*(?!max_iterations)[^)]*\)/gi,
948
- baseSeverity: 'medium',
949
- description: 'LangChain AgentExecutor without max_iterations. Agent can loop indefinitely on complex tasks.',
950
- suggestedFix: 'Set iteration limit: AgentExecutor(..., max_iterations=15). Add early_stopping_method="generate" to gracefully stop.',
951
- framework: 'langchain',
952
- },
953
-
954
- // ========== Overpermissioned Agents ==========
955
- {
956
- name: 'Agent with excessive tools',
957
- pattern: /tools\s*[:=]\s*\[(?:[^\]]*,){10,}[^\]]*\]/gi,
958
- baseSeverity: 'medium',
959
- description: 'Agent configured with more than 10 tools. Overpermissioned agents have larger attack surface if compromised via prompt injection.',
960
- suggestedFix: 'Follow principle of least privilege. Split into specialized agents with focused tool sets. Remove unused tools.',
961
- framework: 'generic',
962
- },
963
- ]
964
-
965
- /**
966
- * Patterns for missing authorization in tools
967
- */
968
- const MISSING_AUTH_PATTERNS: ToolPattern[] = [
969
- {
970
- name: 'Tool without user context',
971
- pattern: /(?:@tool|defineTool|createTool|\.registerTool|\.addTool)\s*\([^)]*(?:async\s+)?(?:function|\().*(?:create|update|delete|modify|write|send)/gi,
972
- riskType: 'database',
973
- baseSeverity: 'medium',
974
- description: 'Tool performs write operations but may not verify user context. Actions could be performed as wrong user.',
975
- suggestedFix: 'Pass userId as required parameter. Verify user owns/can access the resource before modification.',
976
- requiresUserContext: true,
977
- },
978
- ]
979
-
980
- // ============================================================================
981
- // Main Detection Function
982
- // ============================================================================
983
-
984
- /**
985
- * Main detection function for AI agent tool permission issues
986
- */
987
- export function detectAIAgentTools(
988
- content: string,
989
- filePath: string,
990
- options?: { parsed?: ParsedFile }
991
- ): Vulnerability[] {
992
- const vulnerabilities: Vulnerability[] = []
993
-
994
- // Skip non-applicable files
995
- if (isScannerOrFixtureFile(filePath)) return vulnerabilities
996
-
997
- // Only scan files that appear to have agent/tool definitions
998
- if (!isAgentOrToolFile(filePath, content)) {
999
- return vulnerabilities
1000
- }
1001
-
1002
- const lines = options?.parsed?.lines ?? content.split('\n')
1003
- const isTestFile = isTestOrMockFile(filePath)
1004
- const isExample = isExampleDirectory(filePath)
1005
- const isLibrary = isLibraryCode(filePath)
1006
-
1007
- // Scan for overly permissive tool patterns
1008
- for (const pattern of OVERPERMISSIVE_TOOL_PATTERNS) {
1009
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1010
- let match
1011
-
1012
- while ((match = regex.exec(content)) !== null) {
1013
- const lineNumber = content.substring(0, match.index).split('\n').length
1014
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1015
-
1016
- // Skip comments
1017
- if (isComment(lineContent)) continue
1018
-
1019
- // Get tool context
1020
- const { context } = findToolDefinitionContext(content, lineNumber)
1021
-
1022
- // Check for mitigations (strong vs weak)
1023
- const hasStrong = hasStrongRestrictions(context)
1024
- const hasWeak = hasAccessRestrictions(context)
1025
- const hasUserContext = hasUserContextVerification(context)
1026
- const hasTenantContext = hasTenantContextVerification(context)
1027
-
1028
- // Determine if issue is fully mitigated
1029
- let isMitigated = true
1030
- let hasPartialMitigation = false
1031
- const missingMitigations: string[] = []
1032
-
1033
- if (pattern.requiresRestrictions) {
1034
- if (hasStrong) {
1035
- // Strong restrictions = fully mitigated for this requirement
1036
- } else if (hasWeak) {
1037
- // Weak restrictions = partial mitigation
1038
- hasPartialMitigation = true
1039
- missingMitigations.push('verified access restrictions (found mentions but not implementation)')
1040
- isMitigated = false
1041
- } else {
1042
- isMitigated = false
1043
- missingMitigations.push('access restrictions')
1044
- }
1045
- }
1046
- if (pattern.requiresUserContext && !hasUserContext) {
1047
- isMitigated = false
1048
- missingMitigations.push('user context verification')
1049
- }
1050
- if (pattern.requiresTenantContext && !hasTenantContext) {
1051
- isMitigated = false
1052
- missingMitigations.push('tenant/org context verification')
1053
- }
1054
-
1055
- // Skip if all required mitigations are present with strong verification
1056
- if (isMitigated) continue
1057
-
1058
- // Calculate severity
1059
- let severity = pattern.baseSeverity
1060
- const isMCPSafe = isMCPFileWithSafePatterns(content, filePath)
1061
-
1062
- if (isTestFile) {
1063
- severity = 'info'
1064
- } else if (isExample) {
1065
- // Example/demo code - downgrade to info
1066
- severity = 'info'
1067
- } else if (isLibrary) {
1068
- // Library code - tool definitions are intentionally flexible
1069
- // Consumers add restrictions when they use the tools
1070
- severity = 'info'
1071
- } else if (isMCPSafe) {
1072
- // MCP file with proper security controls (sanitization + authorization)
1073
- severity = 'info'
1074
- } else if (hasPartialMitigation || hasUserContext || hasTenantContext) {
1075
- // Partial mitigation - downgrade
1076
- if (severity === 'critical') severity = 'high'
1077
- else if (severity === 'high') severity = 'medium'
1078
- }
1079
-
1080
- // Build description
1081
- let description = pattern.description
1082
- if (missingMitigations.length > 0) {
1083
- description += ` Missing: ${missingMitigations.join(', ')}.`
1084
- }
1085
- if (isTestFile) {
1086
- description += ' (In test file.)'
1087
- } else if (isExample) {
1088
- description += ' (In example/demo directory - not production code.)'
1089
- } else if (isLibrary) {
1090
- description += ' (Library code - tool definitions are generic; consumers add restrictions.)'
1091
- } else if (isMCPSafe) {
1092
- description += ' (MCP file with sanitization and authorization controls detected.)'
1093
- }
1094
-
1095
- vulnerabilities.push({
1096
- id: `ai-tool-${filePath}-${lineNumber}-${pattern.riskType}`,
1097
- filePath,
1098
- lineNumber,
1099
- lineContent,
1100
- severity,
1101
- category: 'ai_overpermissive_tool',
1102
- title: pattern.name,
1103
- description,
1104
- suggestedFix: pattern.suggestedFix,
1105
- confidence: 'medium',
1106
- layer: 2,
1107
- source: 'ai_code' as const,
1108
- requiresAIValidation: true, // Always validate - context dependent
1109
- baseConfidence: BASE_CONFIDENCE,
1110
- })
1111
- }
1112
- }
1113
-
1114
- // Scan for missing authorization patterns
1115
- for (const pattern of MISSING_AUTH_PATTERNS) {
1116
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1117
- let match
1118
-
1119
- while ((match = regex.exec(content)) !== null) {
1120
- const lineNumber = content.substring(0, match.index).split('\n').length
1121
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1122
-
1123
- // Skip comments
1124
- if (isComment(lineContent)) continue
1125
-
1126
- // Get tool context
1127
- const { context } = findToolDefinitionContext(content, lineNumber)
1128
-
1129
- // Check if user context is verified
1130
- const hasUserContext = hasUserContextVerification(context)
1131
-
1132
- // Skip if user context is present
1133
- if (hasUserContext) continue
1134
-
1135
- let severity = pattern.baseSeverity
1136
- let description = pattern.description
1137
-
1138
- if (isTestFile) {
1139
- severity = 'info'
1140
- description += ' (In test file.)'
1141
- }
1142
-
1143
- vulnerabilities.push({
1144
- id: `ai-tool-auth-${filePath}-${lineNumber}`,
1145
- filePath,
1146
- lineNumber,
1147
- lineContent,
1148
- severity,
1149
- category: 'ai_overpermissive_tool',
1150
- title: pattern.name,
1151
- description,
1152
- suggestedFix: pattern.suggestedFix,
1153
- confidence: 'low', // Lower confidence - needs context
1154
- layer: 2,
1155
- source: 'ai_code' as const,
1156
- requiresAIValidation: true,
1157
- baseConfidence: BASE_CONFIDENCE,
1158
- })
1159
- }
1160
- }
1161
-
1162
- // Scan for excessive agency patterns (Phase 2)
1163
- for (const pattern of EXCESSIVE_AGENCY_PATTERNS) {
1164
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1165
- let match
1166
-
1167
- while ((match = regex.exec(content)) !== null) {
1168
- const lineNumber = content.substring(0, match.index).split('\n').length
1169
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1170
-
1171
- // Skip comments
1172
- if (isComment(lineContent)) continue
1173
-
1174
- // Get surrounding context for mitigation checks
1175
- const { context } = findToolDefinitionContext(content, lineNumber)
1176
-
1177
- // Check for mitigations
1178
- let isMitigated = false
1179
- let isPartiallyMitigated = false
1180
- let description = pattern.description
1181
-
1182
- // Check iteration limits
1183
- if (hasIterationLimits(context)) {
1184
- isPartiallyMitigated = true
1185
- description += ' (Iteration limits detected nearby.)'
1186
- }
1187
-
1188
- // Check timeout configuration
1189
- if (hasTimeoutConfigured(context)) {
1190
- isPartiallyMitigated = true
1191
- description += ' (Timeout configured.)'
1192
- }
1193
-
1194
- // Check human-in-the-loop
1195
- if (hasHumanInLoop(context)) {
1196
- isPartiallyMitigated = true
1197
- description += ' (Human-in-loop enabled.)'
1198
- }
1199
-
1200
- // Check Docker for code execution patterns
1201
- if (pattern.framework === 'crewai' || pattern.framework === 'autogen') {
1202
- if (hasDockerConfigured(context)) {
1203
- isMitigated = true
1204
- description += ' (Docker containerization detected.)'
1205
- }
1206
- }
1207
-
1208
- // Check budget limits
1209
- if (hasBudgetLimits(context)) {
1210
- isPartiallyMitigated = true
1211
- description += ' (Budget limits configured.)'
1212
- }
1213
-
1214
- // Calculate severity
1215
- let severity = pattern.baseSeverity
1216
- const isMCPSafe = isMCPFileWithSafePatterns(content, filePath)
1217
-
1218
- if (isMitigated) {
1219
- severity = 'info'
1220
- } else if (isTestFile) {
1221
- severity = 'info'
1222
- description += ' (In test file.)'
1223
- } else if (isExample) {
1224
- severity = 'info'
1225
- description += ' (In example/demo directory.)'
1226
- } else if (isLibrary) {
1227
- severity = 'info'
1228
- description += ' (Library code.)'
1229
- } else if (isPartiallyMitigated) {
1230
- // Downgrade if partial mitigations present
1231
- if (severity === 'critical') severity = 'high'
1232
- else if (severity === 'high') severity = 'medium'
1233
- else if (severity === 'medium') severity = 'low'
1234
- }
1235
-
1236
- // Skip fully mitigated or info-level in non-agent files
1237
- if (isMitigated && severity === 'info') continue
1238
-
1239
- vulnerabilities.push({
1240
- id: `ai-agency-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1241
- filePath,
1242
- lineNumber,
1243
- lineContent,
1244
- severity,
1245
- category: 'ai_excessive_agency',
1246
- title: pattern.name,
1247
- description,
1248
- suggestedFix: pattern.suggestedFix,
1249
- confidence: severity === 'info' ? 'low' : 'medium',
1250
- layer: 2,
1251
- source: 'ai_code' as const,
1252
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1253
- baseConfidence: BASE_CONFIDENCE,
1254
- })
1255
- }
1256
- }
1257
-
1258
- // Phase 5: Scan for LLM output flow patterns (Task 1)
1259
- for (const pattern of LLM_OUTPUT_FLOW_PATTERNS) {
1260
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1261
- let match
1262
-
1263
- while ((match = regex.exec(content)) !== null) {
1264
- const lineNumber = content.substring(0, match.index).split('\n').length
1265
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1266
-
1267
- // Skip comments
1268
- if (isComment(lineContent)) continue
1269
-
1270
- // Get surrounding context
1271
- const { context } = findToolDefinitionContext(content, lineNumber)
1272
-
1273
- // Check for validation/allowlist mitigations
1274
- const hasValidation = /(?:allowlist|whitelist|ALLOWED_|validTools|VALID_TOOLS|allowedTools|validateTool|isValidTool|includes|has)\s*\(/i.test(context)
1275
- const hasAllowlistCheck = /if\s*\(\s*!?\s*(?:ALLOWED|VALID|SAFE|permitted).*(?:includes|has|indexOf)/i.test(context)
1276
-
1277
- let description = pattern.description
1278
- let severity = pattern.baseSeverity
1279
-
1280
- if (hasValidation || hasAllowlistCheck) {
1281
- severity = severity === 'critical' ? 'medium' : 'low'
1282
- description += ' (Validation/allowlist detected nearby - verify it covers this case.)'
1283
- }
1284
-
1285
- if (isTestFile) {
1286
- severity = 'info'
1287
- description += ' (In test file.)'
1288
- } else if (isExample) {
1289
- severity = 'info'
1290
- description += ' (In example/demo directory.)'
1291
- } else if (isLibrary) {
1292
- severity = 'info'
1293
- description += ' (Library code.)'
1294
- }
1295
-
1296
- vulnerabilities.push({
1297
- id: `ai-llm-flow-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1298
- filePath,
1299
- lineNumber,
1300
- lineContent,
1301
- severity,
1302
- category: 'ai_excessive_agency',
1303
- title: pattern.name,
1304
- description,
1305
- suggestedFix: pattern.suggestedFix,
1306
- confidence: severity === 'critical' ? 'high' : 'medium',
1307
- layer: 2,
1308
- source: 'ai_code' as const,
1309
- requiresAIValidation: severity !== 'info',
1310
- baseConfidence: BASE_CONFIDENCE,
1311
- })
1312
- }
1313
- }
1314
-
1315
- // Phase 5: Scan for tool permission accumulation patterns (Task 2)
1316
- for (const pattern of TOOL_ACCUMULATION_PATTERNS) {
1317
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1318
- let match
1319
-
1320
- while ((match = regex.exec(content)) !== null) {
1321
- const lineNumber = content.substring(0, match.index).split('\n').length
1322
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1323
-
1324
- // Skip comments
1325
- if (isComment(lineContent)) continue
1326
-
1327
- // Skip UI array building patterns (not actual AI tool registration)
1328
- if (pattern.name === 'Tool array push without limit check') {
1329
- // Check if this is in a selector or UI configuration builder
1330
- const isUIPattern =
1331
- // In selectors (zustand/redux pattern)
1332
- /selectors?\.ts$/i.test(filePath) ||
1333
- // In store configuration
1334
- /store\/.*\/selectors/i.test(filePath) ||
1335
- // Building manifest/config arrays
1336
- /manifest\s*:/i.test(lineContent) ||
1337
- /identifier\s*:/i.test(lineContent) ||
1338
- // Map/forEach building UI arrays
1339
- /\.map\s*\([^)]*=>\s*\{[\s\S]{0,100}tools\.push/i.test(content.substring(Math.max(0, match.index - 200), match.index + 100))
1340
-
1341
- if (isUIPattern) {
1342
- continue // Skip - this is building a UI configuration array
1343
- }
1344
- }
1345
-
1346
- // Get surrounding context
1347
- const { context } = findToolDefinitionContext(content, lineNumber)
1348
-
1349
- // Check for limits and authorization
1350
- const hasLimits = /(?:max|limit|MAX_|LIMIT_|\.length\s*[<>])/i.test(context)
1351
- const hasAuthCheck = /(?:if\s*\(.*(?:auth|permission|role|isAdmin|canRegister)|throw.*(?:Unauthorized|Forbidden))/i.test(context)
1352
-
1353
- let description = pattern.description
1354
- let severity = pattern.baseSeverity
1355
-
1356
- if (hasLimits) {
1357
- severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
1358
- description += ' (Limit check detected nearby.)'
1359
- }
1360
- if (hasAuthCheck) {
1361
- severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
1362
- description += ' (Authorization check detected.)'
1363
- }
1364
-
1365
- if (isTestFile) {
1366
- severity = 'info'
1367
- description += ' (In test file.)'
1368
- } else if (isExample) {
1369
- severity = 'info'
1370
- description += ' (In example/demo directory.)'
1371
- } else if (isLibrary) {
1372
- severity = 'info'
1373
- description += ' (Library code.)'
1374
- }
1375
-
1376
- vulnerabilities.push({
1377
- id: `ai-tool-accum-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1378
- filePath,
1379
- lineNumber,
1380
- lineContent,
1381
- severity,
1382
- category: 'ai_excessive_agency',
1383
- title: pattern.name,
1384
- description,
1385
- suggestedFix: pattern.suggestedFix,
1386
- confidence: 'medium',
1387
- layer: 2,
1388
- source: 'ai_code' as const,
1389
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1390
- baseConfidence: BASE_CONFIDENCE,
1391
- })
1392
- }
1393
- }
1394
-
1395
- // Phase 5: Scan for database write scoping patterns (Task 3)
1396
- for (const pattern of DB_WRITE_SCOPING_PATTERNS) {
1397
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1398
- let match
1399
-
1400
- while ((match = regex.exec(content)) !== null) {
1401
- const lineNumber = content.substring(0, match.index).split('\n').length
1402
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1403
-
1404
- // Skip comments
1405
- if (isComment(lineContent)) continue
1406
-
1407
- // Get surrounding context
1408
- const { context } = findToolDefinitionContext(content, lineNumber)
1409
-
1410
- // Check for user/tenant scoping
1411
- const hasUserScoping = hasUserContextVerification(context)
1412
- const hasTenantScoping = hasTenantContextVerification(context)
1413
-
1414
- // Skip if properly scoped
1415
- if (hasUserScoping && hasTenantScoping) continue
1416
-
1417
- let description = pattern.description
1418
- let severity = pattern.baseSeverity
1419
-
1420
- if (hasUserScoping || hasTenantScoping) {
1421
- severity = severity === 'high' ? 'medium' : 'low'
1422
- description += hasUserScoping ? ' (User context detected.)' : ' (Tenant context detected.)'
1423
- }
1424
-
1425
- if (isTestFile) {
1426
- severity = 'info'
1427
- description += ' (In test file.)'
1428
- } else if (isExample) {
1429
- severity = 'info'
1430
- description += ' (In example/demo directory.)'
1431
- } else if (isLibrary) {
1432
- severity = 'info'
1433
- description += ' (Library code.)'
1434
- }
1435
-
1436
- vulnerabilities.push({
1437
- id: `ai-db-scoping-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1438
- filePath,
1439
- lineNumber,
1440
- lineContent,
1441
- severity,
1442
- category: 'ai_excessive_agency',
1443
- title: pattern.name,
1444
- description,
1445
- suggestedFix: pattern.suggestedFix,
1446
- confidence: 'medium',
1447
- layer: 2,
1448
- source: 'ai_code' as const,
1449
- requiresAIValidation: severity !== 'info',
1450
- baseConfidence: BASE_CONFIDENCE,
1451
- })
1452
- }
1453
- }
1454
-
1455
- // Phase 5: Scan for recursive agent patterns (Task 4)
1456
- for (const pattern of RECURSIVE_AGENT_PATTERNS) {
1457
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1458
- let match
1459
-
1460
- while ((match = regex.exec(content)) !== null) {
1461
- const lineNumber = content.substring(0, match.index).split('\n').length
1462
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1463
-
1464
- // Skip comments
1465
- if (isComment(lineContent)) continue
1466
-
1467
- // Skip CRUD/data operations that are NOT AI agent spawning
1468
- // These are false positives in apps where "agent" means "chat assistant configuration"
1469
- if (pattern.name === 'Agent spawns sub-agent without limit') {
1470
- const crudPatterns = [
1471
- // Service/SDK method calls - database CRUD for agent configurations
1472
- /(?:service|Service|sdk|SDK|store|Store|runtime|Runtime)\.(?:create|get|update|delete)Agent/i,
1473
- /\.agents\.createAgent/i, // sdk.agents.createAgent
1474
- /agentService\.createAgent/i,
1475
- /agentState\.createAgent/i,
1476
- /marketSDK\.agents\.createAgent/i,
1477
- // React event handlers creating UI entities
1478
- /onClick\s*=\s*\{\s*\(\s*\)\s*=>\s*createAgent/i,
1479
- // Store action patterns
1480
- /await\s+(?:state|store)\w*\.createAgent/i,
1481
- // Builder/Runtime patterns for UI
1482
- /agentBuilder(?:Runtime)?\.createAgent/i,
1483
- /groupAgentBuilderRuntime\.createAgent/i,
1484
- ]
1485
- if (crudPatterns.some(p => p.test(lineContent))) {
1486
- continue // Skip - this is a data CRUD operation, not AI agent spawning
1487
- }
1488
- }
1489
-
1490
- // Get surrounding context
1491
- const { context } = findToolDefinitionContext(content, lineNumber)
1492
-
1493
- // Check for depth/count limits
1494
- const hasDepthLimit = /(?:depth|level|recursion)\s*[<>]|MAX_DEPTH|maxDepth|max_depth/i.test(context)
1495
- const hasCountLimit = /(?:count|iterations?)\s*[<>]|MAX_(?:AGENTS|TASKS|ITERATIONS)/i.test(context)
1496
-
1497
- let description = pattern.description
1498
- let severity = pattern.baseSeverity
1499
-
1500
- if (hasDepthLimit || hasCountLimit) {
1501
- severity = severity === 'high' ? 'medium' : 'low'
1502
- description += hasDepthLimit ? ' (Depth limit detected.)' : ' (Count limit detected.)'
1503
- }
1504
-
1505
- // Check for iteration/timeout limits
1506
- if (hasIterationLimits(context) || hasTimeoutConfigured(context)) {
1507
- severity = severity === 'high' ? 'medium' : severity === 'medium' ? 'low' : severity
1508
- description += ' (Iteration/timeout limits configured.)'
1509
- }
1510
-
1511
- if (isTestFile) {
1512
- severity = 'info'
1513
- description += ' (In test file.)'
1514
- } else if (isExample) {
1515
- severity = 'info'
1516
- description += ' (In example/demo directory.)'
1517
- } else if (isLibrary) {
1518
- severity = 'info'
1519
- description += ' (Library code.)'
1520
- }
1521
-
1522
- vulnerabilities.push({
1523
- id: `ai-recursive-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1524
- filePath,
1525
- lineNumber,
1526
- lineContent,
1527
- severity,
1528
- category: 'ai_excessive_agency',
1529
- title: pattern.name,
1530
- description,
1531
- suggestedFix: pattern.suggestedFix,
1532
- confidence: 'medium',
1533
- layer: 2,
1534
- source: 'ai_code' as const,
1535
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1536
- baseConfidence: BASE_CONFIDENCE,
1537
- })
1538
- }
1539
- }
1540
-
1541
- // Phase 6: Scan for tool parameter injection patterns (Task 1)
1542
- for (const pattern of TOOL_PARAMETER_INJECTION_PATTERNS) {
1543
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1544
- let match
1545
-
1546
- while ((match = regex.exec(content)) !== null) {
1547
- const lineNumber = content.substring(0, match.index).split('\n').length
1548
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1549
-
1550
- // Skip comments
1551
- if (isComment(lineContent)) continue
1552
-
1553
- // Get surrounding context
1554
- const { context } = findToolDefinitionContext(content, lineNumber)
1555
-
1556
- // Check for validation/schema patterns
1557
- const hasValidation = /(?:zod|yup|joi|schema|validate|safeParse|\.parse\(|validateSchema)/i.test(context)
1558
- const hasSanitization = /(?:sanitize|clean|escape|filter|strip)/i.test(context)
1559
-
1560
- let description = pattern.description
1561
- let severity = pattern.baseSeverity
1562
-
1563
- if (hasValidation) {
1564
- severity = 'low'
1565
- description += ' (Schema validation detected nearby - verify it covers LLM output.)'
1566
- } else if (hasSanitization) {
1567
- severity = severity === 'critical' ? 'high' : severity === 'high' ? 'medium' : 'low'
1568
- description += ' (Sanitization detected nearby.)'
1569
- }
1570
-
1571
- if (isTestFile) {
1572
- severity = 'info'
1573
- description += ' (In test file.)'
1574
- } else if (isExample) {
1575
- severity = 'info'
1576
- description += ' (In example/demo directory.)'
1577
- } else if (isLibrary) {
1578
- severity = 'info'
1579
- description += ' (Library code.)'
1580
- }
1581
-
1582
- vulnerabilities.push({
1583
- id: `ai-tool-param-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1584
- filePath,
1585
- lineNumber,
1586
- lineContent,
1587
- severity,
1588
- category: 'ai_excessive_agency',
1589
- title: pattern.name,
1590
- description,
1591
- suggestedFix: pattern.suggestedFix,
1592
- confidence: severity === 'critical' ? 'high' : 'medium',
1593
- layer: 2,
1594
- source: 'ai_code' as const,
1595
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1596
- baseConfidence: BASE_CONFIDENCE,
1597
- })
1598
- }
1599
- }
1600
-
1601
- // Phase 6: Scan for tool error message injection patterns (Task 2)
1602
- for (const pattern of TOOL_ERROR_INJECTION_PATTERNS) {
1603
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1604
- let match
1605
-
1606
- while ((match = regex.exec(content)) !== null) {
1607
- const lineNumber = content.substring(0, match.index).split('\n').length
1608
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1609
-
1610
- // Skip comments
1611
- if (isComment(lineContent)) continue
1612
-
1613
- // Get surrounding context
1614
- const { context } = findToolDefinitionContext(content, lineNumber)
1615
-
1616
- // Check for error sanitization patterns
1617
- const hasSanitizedError = /(?:sanitizeError|genericError|safeError|errorMessage\s*=\s*['"`])/i.test(context)
1618
- const hasLogging = /(?:logger|console)\.\w+\s*\([^)]*(?:error|err|e)\)/i.test(context)
1619
-
1620
- let description = pattern.description
1621
- let severity = pattern.baseSeverity
1622
-
1623
- if (hasSanitizedError) {
1624
- severity = 'info'
1625
- description += ' (Error sanitization detected.)'
1626
- } else if (hasLogging) {
1627
- severity = severity === 'high' ? 'medium' : 'low'
1628
- description += ' (Server-side logging detected - verify error is sanitized in response.)'
1629
- }
1630
-
1631
- if (isTestFile) {
1632
- severity = 'info'
1633
- description += ' (In test file.)'
1634
- } else if (isExample) {
1635
- severity = 'info'
1636
- description += ' (In example/demo directory.)'
1637
- } else if (isLibrary) {
1638
- severity = 'info'
1639
- description += ' (Library code.)'
1640
- }
1641
-
1642
- vulnerabilities.push({
1643
- id: `ai-tool-error-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1644
- filePath,
1645
- lineNumber,
1646
- lineContent,
1647
- severity,
1648
- category: 'ai_excessive_agency',
1649
- title: pattern.name,
1650
- description,
1651
- suggestedFix: pattern.suggestedFix,
1652
- confidence: 'medium',
1653
- layer: 2,
1654
- source: 'ai_code' as const,
1655
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1656
- baseConfidence: BASE_CONFIDENCE,
1657
- })
1658
- }
1659
- }
1660
-
1661
- return vulnerabilities
1662
- }