@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,1314 +0,0 @@
1
- /**
2
- * Layer 2: AI Prompt Hygiene Detection
3
- * Detects prompt injection vulnerabilities and secrets in LLM prompts
4
- *
5
- * Covers:
6
- * - B1: Prompt & template hygiene (LLM01)
7
- * - B3: Secrets & sensitive data in prompts (LLM06)
8
- */
9
-
10
- import type { Vulnerability, VulnerabilitySeverity } from '../../shared/types'
11
- import type { ParsedFile } from '../../shared/parsed-file'
12
- import {
13
- isComment,
14
- isTestOrMockFile,
15
- isDocumentationFile,
16
- isScannerOrFixtureFile,
17
- } from '../../parse/file-classifier'
18
-
19
- const BASE_CONFIDENCE = 0.40
20
-
21
- /**
22
- * Check if a file is in an LLM/AI context based on path and content
23
- */
24
- function isLLMContextFile(filePath: string, content: string): boolean {
25
- // File path indicators of AI/LLM code
26
- const llmPathPatterns = [
27
- /\/(ai|llm|chat|openai|anthropic|gpt|claude)\//i,
28
- /\/(assistants?|agents?|prompts?)\//i,
29
- /(chat|ai|llm|prompt|assistant|agent).*\.(ts|js|tsx|jsx|py)$/i,
30
- ]
31
-
32
- if (llmPathPatterns.some(p => p.test(filePath))) {
33
- return true
34
- }
35
-
36
- // Content patterns suggesting LLM API usage
37
- const llmContentPatterns = [
38
- /\.create\s*\(\s*\{[^}]*messages\s*:/i, // OpenAI/Anthropic SDK
39
- /from\s+['"](@anthropic-ai|openai|langchain|llama[-_]?index)/i, // Imports
40
- /\bsystem\s*:\s*['"`]/i, // System message definition
41
- /role:\s*['"`](user|assistant|system)['"`]/i, // Message roles
42
- /\b(systemPrompt|userPrompt|assistantPrompt)\b/i, // Prompt variables
43
- /messages\s*:\s*\[/i, // Messages array
44
- /\.chat\.completions?\.create/i, // OpenAI chat completion
45
- /\.messages\.create/i, // Anthropic messages
46
- /ChatCompletion|MessageCreate/i, // SDK types
47
- ]
48
-
49
- return llmContentPatterns.some(p => p.test(content))
50
- }
51
-
52
- /**
53
- * Check if user input delimiter/fence patterns are present
54
- */
55
- function hasPromptDelimiters(lineContent: string, contextLines: string[]): boolean {
56
- const context = [lineContent, ...contextLines].join('\n')
57
-
58
- const delimiterPatterns = [
59
- /```/, // Triple backticks
60
- /<user>|<\/user>/i, // XML-style user tags
61
- /<human>|<\/human>/i, // Human tags
62
- /---+/, // Horizontal rules
63
- /\[USER\]|\[\/USER\]/i, // Bracket tags
64
- /\{\{user\}\}/i, // Template variable
65
- /###\s*User|###\s*Input/i, // Markdown headers
66
- /INPUT:|OUTPUT:/i, // Section markers
67
- ]
68
-
69
- return delimiterPatterns.some(p => p.test(context))
70
- }
71
-
72
- /**
73
- * Check if content looks like proper parameterization rather than concatenation
74
- */
75
- function isProperlyParameterized(lineContent: string): boolean {
76
- const safePatterns = [
77
- /\{\{.*\}\}/, // Handlebars/mustache templates
78
- /\{[a-zA-Z_]+\}/, // Python format strings (positional)
79
- /\$\{.*\}.*sanitize|escape/i, // Template with sanitization
80
- /placeholder|PLACEHOLDER/, // Explicit placeholders
81
- ]
82
-
83
- return safePatterns.some(p => p.test(lineContent))
84
- }
85
-
86
- // ============================================================================
87
- // Pattern Definitions
88
- // ============================================================================
89
-
90
- interface PromptHygienePattern {
91
- name: string
92
- pattern: RegExp
93
- severity: VulnerabilitySeverity
94
- description: string
95
- suggestedFix: string
96
- checkDelimiters?: boolean // If true, downgrade if delimiters found
97
- }
98
-
99
- /**
100
- * B1: Unsafe prompt interpolation patterns
101
- */
102
- const UNSAFE_INTERPOLATION_PATTERNS: PromptHygienePattern[] = [
103
- // Template literals with user input in system prompts
104
- {
105
- name: 'User input in system prompt',
106
- pattern: /system\s*[=:]\s*`[^`]*\$\{.*(?:user|input|req|request|body|query|params|data).*\}[^`]*`/gi,
107
- severity: 'high',
108
- description: 'User input is directly interpolated into a system prompt. This creates a prompt injection vulnerability where attackers can manipulate the AI\'s behavior.',
109
- suggestedFix: 'Use clear delimiters (```, <user>, ---) between system instructions and user content. Consider using structured input rather than string interpolation.',
110
- checkDelimiters: true,
111
- },
112
- // String concatenation in prompt building
113
- {
114
- name: 'Prompt string concatenation with user input',
115
- pattern: /(?:system|prompt|instruction)\s*[=+]\s*.*\+\s*(?:user|input|req|request|body|query|params)(?:\.|Input|\[)/gi,
116
- severity: 'high',
117
- description: 'User input is concatenated into prompt strings. Attackers can inject malicious instructions.',
118
- suggestedFix: 'Use delimiters to clearly separate system instructions from user content. Example: ```user input here```',
119
- checkDelimiters: true,
120
- },
121
- // Messages array with dynamic user content in system role
122
- {
123
- name: 'Dynamic content in system message',
124
- pattern: /role:\s*['"`]system['"`]\s*,\s*content:\s*`[^`]*\$\{/gi,
125
- severity: 'medium',
126
- description: 'System message content includes dynamic values. If user-controlled, this enables prompt injection.',
127
- suggestedFix: 'Keep system messages static. Place user input in messages with role: "user" instead.',
128
- checkDelimiters: true,
129
- },
130
- // f-strings in Python with user input
131
- {
132
- name: 'Python f-string prompt with user input',
133
- pattern: /f['"][^'"]*\{.*(?:user|input|request|body).*\}[^'"]*['"]/gi,
134
- severity: 'high',
135
- description: 'User input in Python f-string prompt creates prompt injection risk.',
136
- suggestedFix: 'Use explicit delimiters: f"System instructions...\n---\n{user_input}\n---"',
137
- checkDelimiters: true,
138
- },
139
- ]
140
-
141
- // ============================================================================
142
- // Secret Patterns - Comprehensive provider-specific detection
143
- // ============================================================================
144
-
145
- /**
146
- * Provider-specific secret patterns with known prefixes
147
- * These are high-confidence patterns that don't need context matching
148
- */
149
- const KNOWN_SECRET_PREFIXES = [
150
- // OpenAI
151
- { name: 'OpenAI API Key', pattern: /sk-[a-zA-Z0-9]{20,}/g, severity: 'critical' as const },
152
- { name: 'OpenAI Project Key', pattern: /sk-proj-[a-zA-Z0-9]{48,}/g, severity: 'critical' as const },
153
- // Anthropic
154
- { name: 'Anthropic API Key', pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g, severity: 'critical' as const },
155
- { name: 'Anthropic Full Key', pattern: /sk-ant-api03-[a-zA-Z0-9_-]{90,}/g, severity: 'critical' as const },
156
- // GitHub
157
- { name: 'GitHub PAT', pattern: /ghp_[a-zA-Z0-9]{36,}/g, severity: 'critical' as const },
158
- { name: 'GitHub OAuth', pattern: /gho_[a-zA-Z0-9]{36,}/g, severity: 'critical' as const },
159
- { name: 'GitHub App Token', pattern: /ghu_[a-zA-Z0-9]{36,}/g, severity: 'critical' as const },
160
- { name: 'GitHub Refresh Token', pattern: /ghr_[a-zA-Z0-9]{36,}/g, severity: 'critical' as const },
161
- { name: 'GitHub Fine-grained PAT', pattern: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/g, severity: 'critical' as const },
162
- // Stripe
163
- { name: 'Stripe Live Secret', pattern: /sk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' as const },
164
- { name: 'Stripe Test Secret', pattern: /sk_test_[a-zA-Z0-9]{24,}/g, severity: 'medium' as const },
165
- { name: 'Stripe Restricted Key', pattern: /rk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' as const },
166
- // AWS
167
- { name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/g, severity: 'critical' as const },
168
- { name: 'AWS Session Token', pattern: /ASIA[0-9A-Z]{16}/g, severity: 'critical' as const },
169
- // Google
170
- { name: 'Google API Key', pattern: /AIza[0-9A-Za-z-_]{35}/g, severity: 'high' as const },
171
- // Slack
172
- { name: 'Slack Bot Token', pattern: /xoxb-[0-9a-zA-Z-]{50,}/g, severity: 'critical' as const },
173
- { name: 'Slack User Token', pattern: /xoxp-[0-9a-zA-Z-]{50,}/g, severity: 'critical' as const },
174
- { name: 'Slack App Token', pattern: /xoxa-[0-9a-zA-Z-]{50,}/g, severity: 'critical' as const },
175
- { name: 'Slack Legacy Token', pattern: /xox[baprs]-[0-9a-zA-Z]{10,}/g, severity: 'critical' as const },
176
- // Twilio
177
- { name: 'Twilio API Key', pattern: /SK[a-f0-9]{32}/g, severity: 'critical' as const },
178
- { name: 'Twilio Account SID', pattern: /AC[a-f0-9]{32}/g, severity: 'high' as const },
179
- // SendGrid
180
- { name: 'SendGrid API Key', pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/g, severity: 'critical' as const },
181
- // Mailgun
182
- { name: 'Mailgun API Key', pattern: /key-[a-zA-Z0-9]{32}/g, severity: 'critical' as const },
183
- // NPM/PyPI
184
- { name: 'NPM Token', pattern: /npm_[a-zA-Z0-9]{36}/g, severity: 'critical' as const },
185
- { name: 'PyPI Token', pattern: /pypi-[a-zA-Z0-9]{32,}/g, severity: 'critical' as const },
186
- // Vercel/Netlify
187
- { name: 'Vercel Token', pattern: /vercel_[a-zA-Z0-9]{24,}/g, severity: 'critical' as const },
188
- { name: 'Netlify Token', pattern: /nfp_[a-zA-Z0-9]{40,}/g, severity: 'critical' as const },
189
- // Square
190
- { name: 'Square Access Token', pattern: /sq0csp-[a-zA-Z0-9-_]{43}/g, severity: 'critical' as const },
191
- { name: 'Square OAuth Secret', pattern: /sq0csp-[a-zA-Z0-9-_]{40,}/g, severity: 'critical' as const },
192
- // Shopify
193
- { name: 'Shopify Access Token', pattern: /shpat_[a-fA-F0-9]{32}/g, severity: 'critical' as const },
194
- { name: 'Shopify Private App', pattern: /shppa_[a-fA-F0-9]{32}/g, severity: 'critical' as const },
195
- // Datadog
196
- { name: 'Datadog API Key', pattern: /dd[a-z]{1}[a-f0-9]{39}/g, severity: 'critical' as const },
197
- // HuggingFace
198
- { name: 'HuggingFace Token', pattern: /hf_[a-zA-Z0-9]{34,}/g, severity: 'critical' as const },
199
- // Replicate
200
- { name: 'Replicate API Token', pattern: /r8_[a-zA-Z0-9]{37}/g, severity: 'critical' as const },
201
- // OpenRouter
202
- { name: 'OpenRouter Key', pattern: /sk-or-v1-[a-zA-Z0-9]{64}/g, severity: 'critical' as const },
203
- // Cohere
204
- { name: 'Cohere API Key', pattern: /[a-zA-Z0-9]{40}(?=.*cohere)/gi, severity: 'high' as const },
205
- // Private Keys
206
- { name: 'Private Key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g, severity: 'critical' as const },
207
- // JWT Tokens (full format)
208
- { name: 'JWT Token', pattern: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, severity: 'high' as const },
209
- // Database URLs with credentials
210
- { name: 'Database URL', pattern: /(mongodb|postgres|mysql|redis|amqp)(\+srv)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi, severity: 'critical' as const },
211
- // Webhook URLs (often contain secrets)
212
- { name: 'Slack Webhook', pattern: /https:\/\/hooks\.slack\.com\/services\/T[a-zA-Z0-9_]+\/B[a-zA-Z0-9_]+\/[a-zA-Z0-9_]+/g, severity: 'high' as const },
213
- { name: 'Discord Webhook', pattern: /https:\/\/discord(?:app)?\.com\/api\/webhooks\/[0-9]+\/[a-zA-Z0-9_-]+/g, severity: 'high' as const },
214
- ]
215
-
216
- /**
217
- * B3: Secrets in prompt context patterns (original context-aware patterns)
218
- * Note: Using [^\n;]* instead of [^;]* to prevent matching across lines
219
- */
220
- const SECRETS_IN_PROMPTS_PATTERNS: PromptHygienePattern[] = [
221
- // API keys in message content (same line only)
222
- {
223
- name: 'API key in prompt content',
224
- pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:sk-[a-zA-Z0-9]{20,}|api[_-]?key\s*[:=]\s*['"][^'"]{16,}['"])/gi,
225
- severity: 'critical',
226
- description: 'API key appears to be hardcoded in prompt content. Keys in prompts may be logged, cached, or sent to model providers.',
227
- suggestedFix: 'Never include API keys in prompts. Use environment variables and keep them server-side only.',
228
- },
229
- // AWS keys in prompts
230
- {
231
- name: 'AWS credentials in prompt',
232
- pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:AKIA[A-Z0-9]{16}|aws[_-]?(?:secret|access)[_-]?key)/gi,
233
- severity: 'critical',
234
- description: 'AWS credentials detected in prompt content.',
235
- suggestedFix: 'Remove credentials from prompts. Use IAM roles or environment variables instead.',
236
- },
237
- // Database URLs with credentials
238
- {
239
- name: 'Database credentials in prompt',
240
- pattern: /(?:messages|prompt|system|content)[^\n]*(?:mongodb|postgres|mysql|redis):\/\/[^:]+:[^@]+@/gi,
241
- severity: 'critical',
242
- description: 'Database connection string with credentials in prompt. This exposes database access.',
243
- suggestedFix: 'Never include connection strings in prompts. Reference data by ID instead.',
244
- },
245
- // Passwords in prompt context
246
- {
247
- name: 'Password in prompt content',
248
- pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:password|passwd|pwd)\s*[:=]\s*['"`][^'"`]{8,}/gi,
249
- severity: 'high',
250
- description: 'Password appears in prompt content. This may be logged or exposed to model providers.',
251
- suggestedFix: 'Remove passwords from prompts. Use authentication tokens or session references instead.',
252
- },
253
- // Private keys
254
- {
255
- name: 'Private key in prompt',
256
- pattern: /(?:messages|prompt|content)[^\n]*(?:-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/gi,
257
- severity: 'critical',
258
- description: 'Private key material detected in prompt context.',
259
- suggestedFix: 'Never include private keys in prompts. Sign data server-side instead.',
260
- },
261
- // Generic token patterns
262
- {
263
- name: 'Access token in prompt',
264
- pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:access[_-]?token|auth[_-]?token|bearer)\s*[:=]\s*['"`][a-zA-Z0-9_.-]{20,}/gi,
265
- severity: 'high',
266
- description: 'Access token detected in prompt content. Tokens in prompts risk exposure.',
267
- suggestedFix: 'Do not include tokens in prompts. Pass token context through secure server-side channels.',
268
- },
269
- ]
270
-
271
- // ============================================================================
272
- // Variable Flow Detection - Secrets flowing into prompts
273
- // ============================================================================
274
-
275
- /**
276
- * Patterns for detecting secret variable declarations
277
- */
278
- const SECRET_VARIABLE_PATTERNS = [
279
- // Direct assignment patterns
280
- /(?:const|let|var)\s+(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*=\s*['"`]([^'"`]{16,})['"`]/gi,
281
- // Object property patterns
282
- /(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*:\s*['"`]([^'"`]{16,})['"`]/gi,
283
- ]
284
-
285
- /**
286
- * Patterns for detecting prompt variable usage
287
- */
288
- const PROMPT_USAGE_PATTERNS = [
289
- // Template literal interpolation
290
- /`[^`]*\$\{(\w+)\}[^`]*`/g,
291
- // String concatenation
292
- /\+\s*(\w+)\s*(?:\+|$)/g,
293
- // f-string interpolation (Python)
294
- /f['"][^'"]*\{(\w+)\}[^'"]*['"]/g,
295
- // Format string
296
- /\.format\s*\([^)]*(\w+)[^)]*\)/g,
297
- ]
298
-
299
- /**
300
- * Check if a variable name suggests it contains a secret
301
- */
302
- function isSecretVariableName(varName: string): boolean {
303
- const secretIndicators = [
304
- /api[_-]?key/i,
305
- /secret[_-]?key/i,
306
- /access[_-]?token/i,
307
- /auth[_-]?token/i,
308
- /password/i,
309
- /credential/i,
310
- /private[_-]?key/i,
311
- /bearer/i,
312
- /jwt/i,
313
- /oauth/i,
314
- /^sk_/i,
315
- /^pk_/i,
316
- /token$/i,
317
- /key$/i,
318
- /secret$/i,
319
- ]
320
- return secretIndicators.some(p => p.test(varName))
321
- }
322
-
323
- /**
324
- * Detect secrets flowing from variables into prompts (variable indirection)
325
- */
326
- function detectSecretVariableFlow(
327
- content: string,
328
- filePath: string,
329
- isTestFile: boolean,
330
- lines?: string[]
331
- ): Vulnerability[] {
332
- const vulnerabilities: Vulnerability[] = []
333
- const _lines = lines ?? content.split('\n')
334
-
335
- // First pass: collect all secret variable declarations
336
- const secretVariables = new Map<string, { line: number; value: string }>()
337
-
338
- for (let i = 0; i < _lines.length; i++) {
339
- const line = _lines[i]
340
- if (isComment(line)) continue
341
-
342
- for (const pattern of SECRET_VARIABLE_PATTERNS) {
343
- const regex = new RegExp(pattern.source, pattern.flags)
344
- let match
345
- while ((match = regex.exec(line)) !== null) {
346
- const varName = match[1]
347
- const value = match[2]
348
-
349
- // Check if variable name suggests it's a secret
350
- if (isSecretVariableName(varName)) {
351
- secretVariables.set(varName, { line: i + 1, value })
352
- }
353
- }
354
- }
355
- }
356
-
357
- // Second pass: find where these variables flow into prompts
358
- const promptContextPatterns = [
359
- /(?:system|prompt|message|content)\s*[:=]/i,
360
- /role:\s*['"`](?:system|user|assistant)['"`]/i,
361
- /\.chat\.completions?\.create/i,
362
- /\.messages\.create/i,
363
- /messages\s*:\s*\[/i,
364
- ]
365
-
366
- for (let i = 0; i < _lines.length; i++) {
367
- const line = _lines[i]
368
- if (isComment(line)) continue
369
-
370
- // Check if this line or nearby lines are in prompt context
371
- const contextWindow = _lines.slice(Math.max(0, i - 5), Math.min(_lines.length, i + 5)).join('\n')
372
- const isPromptContext = promptContextPatterns.some(p => p.test(contextWindow))
373
-
374
- if (!isPromptContext) continue
375
-
376
- // Check for template interpolation of secret variables
377
- const templateMatch = line.match(/\$\{(\w+)\}/)
378
- if (templateMatch) {
379
- const varName = templateMatch[1]
380
- if (secretVariables.has(varName)) {
381
- const secretInfo = secretVariables.get(varName)!
382
- let severity: VulnerabilitySeverity = 'high'
383
- let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is interpolated into LLM prompt. This exposes the secret to the model provider.`
384
-
385
- if (isTestFile) {
386
- severity = 'low'
387
- description += ' (in test file)'
388
- }
389
-
390
- vulnerabilities.push({
391
- id: `secret-flow-${filePath}-${i + 1}-${varName}`,
392
- filePath,
393
- lineNumber: i + 1,
394
- lineContent: line.trim(),
395
- severity,
396
- category: 'hardcoded_secret',
397
- title: `Secret variable '${varName}' in prompt`,
398
- description,
399
- suggestedFix: `Remove the secret from the prompt. If the AI needs to use an API, make the call server-side instead of passing credentials to the model.`,
400
- confidence: 'medium',
401
- layer: 2,
402
- source: 'ai_code' as const,
403
- requiresAIValidation: true,
404
- baseConfidence: BASE_CONFIDENCE,
405
- })
406
- }
407
- }
408
-
409
- // Check for string concatenation with secret variables
410
- for (const [varName] of secretVariables) {
411
- if (line.includes(`+ ${varName}`) || line.includes(`${varName} +`) || line.includes(`+ ${varName} +`)) {
412
- const secretInfo = secretVariables.get(varName)!
413
- let severity: VulnerabilitySeverity = 'high'
414
- let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is concatenated into prompt. This exposes the secret to the model provider.`
415
-
416
- if (isTestFile) {
417
- severity = 'low'
418
- description += ' (in test file)'
419
- }
420
-
421
- vulnerabilities.push({
422
- id: `secret-concat-${filePath}-${i + 1}-${varName}`,
423
- filePath,
424
- lineNumber: i + 1,
425
- lineContent: line.trim(),
426
- severity,
427
- category: 'hardcoded_secret',
428
- title: `Secret variable '${varName}' concatenated in prompt`,
429
- description,
430
- suggestedFix: `Remove the secret from the prompt. If the AI needs to use an API, make the call server-side.`,
431
- confidence: 'medium',
432
- layer: 2,
433
- source: 'ai_code' as const,
434
- requiresAIValidation: true,
435
- baseConfidence: BASE_CONFIDENCE,
436
- })
437
- }
438
- }
439
- }
440
-
441
- return vulnerabilities
442
- }
443
-
444
- // ============================================================================
445
- // Phase 2: Indirect Prompt Injection Detection
446
- // ============================================================================
447
-
448
- /**
449
- * Check if content filtering/sanitization is present for external content
450
- */
451
- function hasContentFiltering(content: string, lineNumber: number, lines?: string[]): boolean {
452
- const _lines = lines ?? content.split('\n')
453
- const contextStart = Math.max(0, lineNumber - 20)
454
- const contextEnd = Math.min(_lines.length, lineNumber + 10)
455
- const context = _lines.slice(contextStart, contextEnd).join('\n')
456
-
457
- const filteringPatterns = [
458
- /filterContent|sanitizeContent|cleanContent/i,
459
- /sanitizeContext|filterContext/i,
460
- /contentModeration|moderateContent/i,
461
- /stripInstructions|removeInstructions/i,
462
- /escapePrompt|sanitizePrompt/i,
463
- /validateInput|inputValidation/i,
464
- ]
465
-
466
- return filteringPatterns.some(p => p.test(context))
467
- }
468
-
469
- /**
470
- * Check if proper delimiters are used for external content
471
- */
472
- function hasExternalContentDelimiters(content: string, lineNumber: number, lines?: string[]): boolean {
473
- const _lines = lines ?? content.split('\n')
474
- const contextStart = Math.max(0, lineNumber - 15)
475
- const contextEnd = Math.min(_lines.length, lineNumber + 15)
476
- const context = _lines.slice(contextStart, contextEnd).join('\n')
477
-
478
- const delimiterPatterns = [
479
- /<context>|<\/context>/i,
480
- /<document>|<\/document>/i,
481
- /<retrieved>|<\/retrieved>/i,
482
- /<external>|<\/external>/i,
483
- /```[^`]*context|context[^`]*```/i,
484
- /---\s*(?:context|document|retrieved)/i,
485
- /\[CONTEXT\]|\[\/CONTEXT\]/i,
486
- /\[DOCUMENT\]|\[\/DOCUMENT\]/i,
487
- ]
488
-
489
- return delimiterPatterns.some(p => p.test(context))
490
- }
491
-
492
- /**
493
- * Indirect prompt injection patterns - external content flowing to LLM context
494
- */
495
- const INDIRECT_INJECTION_PATTERNS: PromptHygienePattern[] = [
496
- // ========== External Fetch to Prompt ==========
497
- {
498
- name: 'Fetched content in prompt',
499
- // Pattern looks for: fetch() -> then/await -> result flows into messages/content
500
- // Use word boundary \b to avoid matching function names like "validatedFetch"
501
- // The pattern looks for: actual fetch call -> await/then -> use in LLM messages
502
- pattern: /\bfetch\s*\(\s*[^)]+\)[\s\S]{0,80}(?:\.then|\.json)[\s\S]{0,150}(?:role:\s*['"`](?:system|user)['"`]|messages\s*:\s*\[)/gi,
503
- severity: 'high',
504
- description: 'Content fetched from external URL flows into LLM prompt. Malicious websites can embed instructions that hijack the model\'s behavior (indirect prompt injection).',
505
- suggestedFix: 'Wrap external content with clear delimiters: <external_content>...</external_content>. Implement content filtering to strip instruction-like patterns.',
506
- checkDelimiters: true,
507
- },
508
- {
509
- name: 'HTTP response in system prompt',
510
- pattern: /(?:axios|fetch|got|request)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=+]/gi,
511
- severity: 'high',
512
- description: 'HTTP response content used in system prompt. External data in system prompts is especially dangerous as it can override model instructions.',
513
- suggestedFix: 'Never put external content in system prompts. Use user messages with clear delimiters for context. Implement content sanitization.',
514
- checkDelimiters: true,
515
- },
516
-
517
- // ========== RAG Vector Store to Prompt ==========
518
- {
519
- name: 'Vector store results in system message',
520
- pattern: /(?:vectorStore|similaritySearch|query|search|retrieve)[\s\S]{0,200}role:\s*['"`]system['"`]/gi,
521
- severity: 'high',
522
- description: 'Vector store search results injected into system message. Poisoned documents in the corpus can hijack model behavior.',
523
- suggestedFix: 'Place retrieved content in user messages, not system. Use delimiters: <retrieved_context>...</retrieved_context>. Implement document sanitization before indexing.',
524
- checkDelimiters: true,
525
- },
526
- {
527
- name: 'RAG retrieval directly in context',
528
- pattern: /(?:retriever\.invoke|retrieve|getRelevantDocuments)\s*\([^)]*\)[\s\S]{0,150}(?:context|prompt|messages)/gi,
529
- severity: 'high',
530
- description: 'Retrieved documents flow directly into LLM context. Adversarial documents can contain prompt injection payloads.',
531
- suggestedFix: 'Sanitize retrieved content before including in prompt. Use XML tags to clearly separate context from instructions.',
532
- checkDelimiters: true,
533
- },
534
-
535
- // ========== Document Loading to LLM ==========
536
- {
537
- name: 'Loaded documents in LLM chain',
538
- pattern: /(?:loadDocuments|DirectoryLoader|TextLoader|PDFLoader)[\s\S]{0,200}(?:chain|llm|invoke|call)/gi,
539
- severity: 'high',
540
- description: 'Documents loaded from files flow into LLM chain. Malicious files (PDFs, docs) can contain hidden prompt injection text.',
541
- suggestedFix: 'Scan loaded documents for instruction-like patterns. Use separate document processing pipeline with content filtering.',
542
- checkDelimiters: true,
543
- },
544
- {
545
- name: 'Document content interpolated',
546
- pattern: /\$\{.*(?:document|doc|file|page)(?:Content|Text|Data).*\}[\s\S]{0,50}(?:prompt|messages|llm)/gi,
547
- severity: 'medium',
548
- description: 'Document content interpolated into LLM prompt. Documents may contain adversarial instructions.',
549
- suggestedFix: 'Wrap document content with delimiters: ```document\\n${content}\\n```. Implement text sanitization.',
550
- checkDelimiters: true,
551
- },
552
-
553
- // ========== Web Scraping to Prompt ==========
554
- {
555
- name: 'Scraped content in prompt',
556
- pattern: /(?:scrape|crawl|spider|puppeteer|playwright|cheerio)[\s\S]{0,200}(?:prompt|messages|context|content\s*:)/gi,
557
- severity: 'high',
558
- description: 'Web-scraped content flows into LLM prompt. Malicious websites can embed instructions in their HTML content.',
559
- suggestedFix: 'Sanitize scraped content to remove instruction-like patterns. Use delimiters: <scraped_content url="...">...</scraped_content>',
560
- checkDelimiters: true,
561
- },
562
- {
563
- name: 'HTML content in LLM context',
564
- // Pattern: Reading HTML (.innerHTML) and then using it in prompt/messages
565
- // NOT: Writing LLM output TO innerHTML (that's output handling, different category)
566
- // Look for: getting innerHTML value -> flowing to prompt context
567
- pattern: /(?:\.innerHTML\s*[;,]|\.html\s*\(\s*\))[\s\S]{0,150}(?:role:\s*['"`](?:system|user)['"`]|messages\s*:\s*\[)/gi,
568
- severity: 'medium',
569
- description: 'HTML content from web pages used in LLM context. Web pages can contain hidden prompt injection in metadata, comments, or invisible text.',
570
- suggestedFix: 'Extract only relevant text content. Filter out scripts, comments, and metadata. Use content sanitization.',
571
- checkDelimiters: true,
572
- },
573
-
574
- // ========== Email/Message Content to Prompt ==========
575
- {
576
- name: 'Email content in prompt',
577
- pattern: /(?:email|message|inbox)(?:Content|Body|Text)[\s\S]{0,150}(?:prompt|messages|llm|analyze)/gi,
578
- severity: 'medium',
579
- description: 'Email or message content flows into LLM prompt. Attackers can craft emails with embedded prompt injection.',
580
- suggestedFix: 'Sanitize email content before LLM processing. Remove potentially malicious patterns. Use clear delimiters.',
581
- checkDelimiters: true,
582
- },
583
-
584
- // ========== Database Content to Prompt ==========
585
- {
586
- name: 'Database record in system prompt',
587
- pattern: /(?:findOne|findById|query|select)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=]/gi,
588
- severity: 'medium',
589
- description: 'Database content used in system prompt. If users can modify database records, they can inject malicious instructions.',
590
- suggestedFix: 'Keep system prompts static. Place database content in user messages with delimiters. Validate data before use.',
591
- checkDelimiters: true,
592
- },
593
-
594
- // ========== Generic External Data Patterns ==========
595
- {
596
- name: 'External data concatenation',
597
- pattern: /(?:externalData|fetchedContent|scrapedData|retrievedText)\s*\+[\s\S]{0,50}(?:prompt|system|instructions)/gi,
598
- severity: 'medium',
599
- description: 'External data concatenated with prompt content without clear separation.',
600
- suggestedFix: 'Use structured prompts with XML/markdown delimiters to separate instructions from external content.',
601
- checkDelimiters: true,
602
- },
603
- ]
604
-
605
- /**
606
- * Missing boundary patterns - prompts without clear user/system separation
607
- */
608
- const MISSING_BOUNDARY_PATTERNS: PromptHygienePattern[] = [
609
- // Direct concatenation without any markers
610
- {
611
- name: 'Missing prompt boundaries',
612
- pattern: /(?:content|prompt)\s*[:=]\s*(?:systemInstructions?|instructions?)\s*\+\s*(?:userMessage|userInput|input)/gi,
613
- severity: 'medium',
614
- description: 'Prompt concatenates system instructions with user input without clear boundaries.',
615
- suggestedFix: 'Add delimiters between instructions and user content: "Instructions...\n---\n" + userInput + "\n---"',
616
- },
617
- // Template literals building prompts without delimiters
618
- {
619
- name: 'Unbounded template prompt',
620
- pattern: /`(?:You are|As an|Your task)[^`]{20,}\$\{(?!.*(?:```|<user|---|\[USER))/gi,
621
- severity: 'medium',
622
- description: 'Prompt template interpolates values without clear delimiter boundaries.',
623
- suggestedFix: 'Wrap interpolated user content with delimiters: ```${userInput}```',
624
- },
625
- // M5: RAG-specific prompt injection patterns
626
- {
627
- name: 'Retrieved context in system prompt',
628
- pattern: /role:\s*['"`]system['"`]\s*,\s*content:\s*`[^`]*\$\{.*(?:context|chunks|documents|retrieved|sources)/gi,
629
- severity: 'high',
630
- description: 'Retrieved documents injected into system prompt. Poisoned documents could hijack model behavior.',
631
- suggestedFix: 'Place retrieved context in user messages with clear delimiters. Use structured prompts separating instructions from data.',
632
- checkDelimiters: true,
633
- },
634
- {
635
- name: 'Mixed user input and retrieved context',
636
- pattern: /\$\{.*(?:userInput|query|question).*\}[^`]*\$\{.*(?:context|chunks|documents).*\}|\$\{.*(?:context|chunks|documents).*\}[^`]*\$\{.*(?:userInput|query|question).*\}/gi,
637
- severity: 'medium',
638
- description: 'User input and retrieved context concatenated without clear separation. Both could contain injection attempts.',
639
- suggestedFix: 'Clearly separate user input from retrieved context using XML tags or delimiters: <user_query>...</user_query><context>...</context>',
640
- checkDelimiters: true,
641
- },
642
- {
643
- name: 'RAG context directly interpolated',
644
- pattern: /(?:system|prompt)\s*[:=].*(?:retrievedContext|ragContext|documentContext|knowledgeBase)\s*(?:\+|,)/gi,
645
- severity: 'medium',
646
- description: 'RAG context directly concatenated into prompt. Could enable data poisoning attacks.',
647
- suggestedFix: 'Use structured prompt format with clear boundaries between instructions, context, and user input.',
648
- checkDelimiters: true,
649
- },
650
- ]
651
-
652
- // ============================================================================
653
- // Sprint 6: Model-Specific Injection Syntax Detection
654
- // ============================================================================
655
-
656
- /**
657
- * Model-specific injection markers that could manipulate prompt structure
658
- * These patterns detect when user input might contain control tokens
659
- */
660
- const MODEL_SPECIFIC_INJECTION_PATTERNS: PromptHygienePattern[] = [
661
- // Claude/ChatML XML-style markers
662
- {
663
- name: 'Claude/ChatML injection markers in user input',
664
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*<\|?(?:system|human|assistant|user)\|?>/gi,
665
- severity: 'high',
666
- description: 'User input may contain system/role markers that could manipulate prompt structure. Attackers can inject fake system or assistant messages.',
667
- suggestedFix: 'Strip or escape control tokens from user input: input.replace(/<\\|?(?:system|human|assistant|user)\\|?>/gi, "")',
668
- },
669
- // OpenAI ChatML markers
670
- {
671
- name: 'OpenAI ChatML control tokens',
672
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*<\|im_(?:start|end)\|>/gi,
673
- severity: 'high',
674
- description: 'User input contains OpenAI ChatML control tokens (<|im_start|>, <|im_end|>) that could break message boundaries.',
675
- suggestedFix: 'Filter ChatML tokens from user input before processing: input.replace(/<\\|im_(?:start|end)\\|>/gi, "")',
676
- },
677
- // Anthropic Human/Assistant turn markers
678
- {
679
- name: 'Anthropic turn markers in user input',
680
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*\\n\\n(?:Human|Assistant):\s*/gi,
681
- severity: 'medium',
682
- description: 'User input contains Anthropic turn markers (Human:, Assistant:) that could inject fake assistant responses.',
683
- suggestedFix: 'Sanitize turn markers from user input: input.replace(/\\n\\n(Human|Assistant):\\s*/gi, "")',
684
- },
685
- // Generic role injection attempts
686
- {
687
- name: 'Role injection in user input',
688
- pattern: /`[^`]*\$\{[^}]*(?:user|input|query)[^}]*\}[^`]*(?:system|assistant|Human:|Assistant:|<\|)/gi,
689
- severity: 'high',
690
- description: 'User input is interpolated near role markers without proper boundaries. Could enable role impersonation.',
691
- suggestedFix: 'Use strict message formatting and strip role-like patterns from user input.',
692
- checkDelimiters: true,
693
- },
694
- // Instruction override attempts in templates
695
- {
696
- name: 'Instruction override pattern',
697
- pattern: /`[^`]*\$\{[^}]*\}[^`]*(?:ignore\s+(?:all\s+)?previous|disregard\s+(?:your\s+)?(?:rules|instructions)|you\s+are\s+now)/gi,
698
- severity: 'medium',
699
- description: 'Template allows interpolation near common jailbreak phrases. User could inject instruction override attempts.',
700
- suggestedFix: 'Filter jailbreak patterns from user input before interpolation.',
701
- checkDelimiters: true,
702
- },
703
- ]
704
-
705
- // ============================================================================
706
- // Sprint 6: Encoding-Based Escape Detection
707
- // ============================================================================
708
-
709
- /**
710
- * Patterns for detecting encoding-based prompt injection bypasses
711
- */
712
- const ENCODING_ESCAPE_PATTERNS: PromptHygienePattern[] = [
713
- // Base64 decoded content flowing to prompts
714
- {
715
- name: 'Base64 decoded content in prompt',
716
- pattern: /(?:atob|Buffer\.from|base64\.decode|b64decode)\s*\([^)]+\)[^;]*(?:\+|,)[^;]*(?:prompt|system|message|content)/gi,
717
- severity: 'medium',
718
- description: 'Decoded base64 content concatenated with prompts. Attackers can hide malicious instructions in base64 encoding to bypass filters.',
719
- suggestedFix: 'Validate and sanitize decoded content before including in prompts. Apply same security checks to decoded content.',
720
- },
721
- // URL decoded content in prompts
722
- {
723
- name: 'URL decoded content in prompt',
724
- pattern: /(?:unescape|decodeURIComponent|decodeURI|urllib\.parse\.unquote)\s*\([^)]+\)[^;]*(?:\+|,)[^;]*(?:prompt|system|message|content)/gi,
725
- severity: 'medium',
726
- description: 'URL decoded content flows into prompt. Encoded payloads can bypass input sanitization.',
727
- suggestedFix: 'Sanitize content after decoding. Apply prompt injection filters to the decoded output.',
728
- },
729
- // HTML entity decoded content
730
- {
731
- name: 'HTML decoded content in prompt',
732
- pattern: /(?:htmlDecode|decodeHTMLEntities|he\.decode|html\.unescape)\s*\([^)]+\)[^;]*(?:\+|,)[^;]*(?:prompt|system|message|content)/gi,
733
- severity: 'medium',
734
- description: 'HTML decoded content flows into prompt. HTML entities can hide malicious instructions.',
735
- suggestedFix: 'Apply prompt injection filters after HTML decoding.',
736
- },
737
- // JSON parsed content directly in prompt (could contain encoded payloads)
738
- {
739
- name: 'Unvalidated JSON in prompt',
740
- pattern: /JSON\.parse\s*\([^)]*(?:userInput|body|request|external)[^)]*\)[^;]*(?:\+|,)[^;]*(?:prompt|system|message)/gi,
741
- severity: 'medium',
742
- description: 'Parsed JSON content directly used in prompt. JSON values could contain encoded injection payloads.',
743
- suggestedFix: 'Validate JSON schema and sanitize string values before including in prompts.',
744
- checkDelimiters: true,
745
- },
746
- // Unicode escape sequences that could hide instructions
747
- {
748
- name: 'Unicode content in prompt',
749
- pattern: /(?:String\.fromCharCode|String\.fromCodePoint|chr\(|unichr\()\s*\([^)]+\)[^;]*(?:\+|,)[^;]*(?:prompt|system|message)/gi,
750
- severity: 'low',
751
- description: 'Unicode character construction flows into prompt. Could be used to hide malicious characters.',
752
- suggestedFix: 'Normalize and validate Unicode content before including in prompts.',
753
- },
754
- ]
755
-
756
- // ============================================================================
757
- // Sprint 6: Jailbreak Pattern Detection
758
- // ============================================================================
759
-
760
- /**
761
- * Common jailbreak preamble patterns that indicate injection attempts
762
- * These detect when user input flow might contain jailbreak phrases
763
- */
764
- const JAILBREAK_INDICATOR_PATTERNS: PromptHygienePattern[] = [
765
- // Instruction override phrases flowing to LLM
766
- {
767
- name: 'Instruction override phrases in input flow',
768
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*(?:ignore\s+(?:all\s+)?previous\s+(?:instructions|prompts)|disregard\s+(?:your\s+)?(?:rules|guidelines|instructions))/gi,
769
- severity: 'high',
770
- description: 'User input variable contains instruction override phrases. Classic jailbreak attempt detected.',
771
- suggestedFix: 'Implement jailbreak detection filter. Block or sanitize inputs containing instruction override patterns.',
772
- },
773
- // Role-playing jailbreak attempts
774
- {
775
- name: 'Role-playing jailbreak in input',
776
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*(?:you\s+are\s+now\s+(?:a|an)\s+\w+|pretend\s+(?:you|to\s+be)\s+(?:are\s+)?(?:a|an|not)|act\s+as\s+(?:if|though)\s+you)/gi,
777
- severity: 'medium',
778
- description: 'User input contains role-playing jailbreak patterns. Attempts to make model assume a different persona.',
779
- suggestedFix: 'Filter role-manipulation phrases from user input. Implement persona consistency checks.',
780
- },
781
- // "From now on" style instruction changes
782
- {
783
- name: 'Instruction change phrases',
784
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*(?:from\s+now\s+on\s+(?:you\s+will|ignore)|for\s+the\s+rest\s+of\s+this\s+(?:conversation|session))/gi,
785
- severity: 'medium',
786
- description: 'User input contains temporal instruction override attempts. Tries to change model behavior for the session.',
787
- suggestedFix: 'Sanitize phrases that attempt to change ongoing behavior.',
788
- },
789
- // Developer mode / DAN style jailbreaks
790
- {
791
- name: 'Developer mode jailbreak patterns',
792
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*(?:developer\s+mode|DAN|Do\s+Anything\s+Now|jailbreak|no\s+restrictions)/gi,
793
- severity: 'high',
794
- description: 'User input contains known jailbreak terminology (DAN, developer mode). High-confidence malicious input.',
795
- suggestedFix: 'Block inputs containing known jailbreak terminology. Log for security review.',
796
- },
797
- // Hypothetical scenario framing
798
- {
799
- name: 'Hypothetical framing jailbreak',
800
- pattern: /(?:userInput|userMessage|input|message|query)\s*[=:][^\n]*(?:hypothetically|in\s+a\s+(?:fictional|imaginary)\s+(?:world|scenario)|what\s+if\s+you\s+(?:could|had\s+no))/gi,
801
- severity: 'low',
802
- description: 'User input uses hypothetical framing often used in jailbreak attempts. May be legitimate creative use.',
803
- suggestedFix: 'Apply additional scrutiny to hypothetically-framed requests. Consider context before blocking.',
804
- },
805
- ]
806
-
807
- /**
808
- * Check if input sanitization is present for jailbreak patterns
809
- */
810
- function hasJailbreakFiltering(content: string, lineNumber: number, lines?: string[]): boolean {
811
- const _lines = lines ?? content.split('\n')
812
- const contextStart = Math.max(0, lineNumber - 20)
813
- const contextEnd = Math.min(_lines.length, lineNumber + 10)
814
- const context = _lines.slice(contextStart, contextEnd).join('\n')
815
-
816
- const filteringPatterns = [
817
- /filterJailbreak|detectJailbreak|jailbreakFilter/i,
818
- /sanitizePrompt|filterPrompt|cleanPrompt/i,
819
- /blockInjection|preventInjection/i,
820
- /moderationApi|contentModeration/i,
821
- /instructionFilter|roleFilter/i,
822
- /guardRails|guardrail/i,
823
- /promptGuard|inputGuard/i,
824
- ]
825
-
826
- return filteringPatterns.some(p => p.test(context))
827
- }
828
-
829
- /**
830
- * Check if encoding sanitization is present
831
- */
832
- function hasEncodingSanitization(content: string, lineNumber: number, lines?: string[]): boolean {
833
- const _lines = lines ?? content.split('\n')
834
- const contextStart = Math.max(0, lineNumber - 15)
835
- const contextEnd = Math.min(_lines.length, lineNumber + 5)
836
- const context = _lines.slice(contextStart, contextEnd).join('\n')
837
-
838
- const sanitizationPatterns = [
839
- /validateDecoded|sanitizeDecoded/i,
840
- /afterDecode.*sanitize|decode.*then.*filter/i,
841
- /normalizeInput|sanitizeInput/i,
842
- /schema\.parse|validate.*schema/i,
843
- /stripControlChars|removeControlTokens/i,
844
- ]
845
-
846
- return sanitizationPatterns.some(p => p.test(context))
847
- }
848
-
849
- // ============================================================================
850
- // Detection Functions
851
- // ============================================================================
852
-
853
- /**
854
- * Get surrounding context lines for analysis
855
- */
856
- function getSurroundingContext(content: string, lineIndex: number, windowSize: number = 10, lines?: string[]): string[] {
857
- const _lines = lines ?? content.split('\n')
858
- const start = Math.max(0, lineIndex - windowSize)
859
- const end = Math.min(_lines.length, lineIndex + windowSize)
860
- return _lines.slice(start, end)
861
- }
862
-
863
- /**
864
- * Main detection function for AI prompt hygiene issues
865
- */
866
- export function detectAIPromptHygiene(
867
- content: string,
868
- filePath: string,
869
- options?: { parsed?: ParsedFile }
870
- ): Vulnerability[] {
871
- const vulnerabilities: Vulnerability[] = []
872
-
873
- // Skip non-applicable files
874
- if (isScannerOrFixtureFile(filePath)) return vulnerabilities
875
- if (isDocumentationFile(filePath)) return vulnerabilities
876
-
877
- // Only scan files that appear to be in LLM context
878
- if (!isLLMContextFile(filePath, content)) {
879
- return vulnerabilities
880
- }
881
-
882
- const lines = options?.parsed?.lines ?? content.split('\n')
883
- const isTestFile = isTestOrMockFile(filePath)
884
-
885
- // Scan for unsafe interpolation patterns (B1)
886
- for (const pattern of UNSAFE_INTERPOLATION_PATTERNS) {
887
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
888
- let match
889
-
890
- while ((match = regex.exec(content)) !== null) {
891
- const lineNumber = content.substring(0, match.index).split('\n').length
892
- const lineContent = lines[lineNumber - 1]?.trim() || ''
893
-
894
- // Skip comments
895
- if (isComment(lineContent)) continue
896
-
897
- // Skip if properly parameterized
898
- if (isProperlyParameterized(lineContent)) continue
899
-
900
- // Check for delimiters if applicable
901
- let severity = pattern.severity
902
- let description = pattern.description
903
- const contextLines = getSurroundingContext(content, lineNumber - 1, 15, lines)
904
-
905
- if (pattern.checkDelimiters && hasPromptDelimiters(lineContent, contextLines)) {
906
- // Delimiters present - downgrade severity
907
- severity = 'info'
908
- description += ' (Note: Delimiters detected in context, which mitigates this risk.)'
909
- }
910
-
911
- // Downgrade test files
912
- if (isTestFile) {
913
- severity = 'info'
914
- description += ' (in test file)'
915
- }
916
-
917
- vulnerabilities.push({
918
- id: `ai-prompt-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
919
- filePath,
920
- lineNumber,
921
- lineContent,
922
- severity,
923
- category: 'ai_prompt_injection',
924
- title: pattern.name,
925
- description,
926
- suggestedFix: pattern.suggestedFix,
927
- confidence: severity === 'info' ? 'low' : 'medium',
928
- layer: 2,
929
- source: 'ai_code' as const,
930
- requiresAIValidation: severity !== 'info',
931
- baseConfidence: BASE_CONFIDENCE,
932
- })
933
- }
934
- }
935
-
936
- // Scan for secrets in prompts (B3) - Original context-aware patterns
937
- for (const pattern of SECRETS_IN_PROMPTS_PATTERNS) {
938
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
939
- let match
940
-
941
- while ((match = regex.exec(content)) !== null) {
942
- const lineNumber = content.substring(0, match.index).split('\n').length
943
- const lineContent = lines[lineNumber - 1]?.trim() || ''
944
-
945
- // Skip comments
946
- if (isComment(lineContent)) continue
947
-
948
- // Check if it's an env var reference (safe pattern)
949
- const isEnvRef = /process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent)
950
- if (isEnvRef) continue
951
-
952
- // Skip test variable names
953
- if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent)) continue
954
- if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent)) continue
955
-
956
- // Skip placeholder/example values in the line
957
- if (/example|sample|demo|placeholder|your[_-]?api[_-]?key/i.test(lineContent)) continue
958
-
959
- let severity = pattern.severity
960
- let description = pattern.description
961
-
962
- // Downgrade test files but still flag
963
- if (isTestFile) {
964
- severity = severity === 'critical' ? 'medium' : 'low'
965
- description += ' (in test file - still review for accidental commits)'
966
- }
967
-
968
- vulnerabilities.push({
969
- id: `ai-secret-prompt-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
970
- filePath,
971
- lineNumber,
972
- lineContent,
973
- severity,
974
- category: 'hardcoded_secret', // Use existing category for consistency
975
- title: pattern.name + ' (in LLM context)',
976
- description: description + ' Secrets in prompts are especially risky as they may be logged, shared, or sent to external AI providers.',
977
- suggestedFix: pattern.suggestedFix,
978
- confidence: 'high',
979
- layer: 2,
980
- source: 'ai_code' as const,
981
- requiresAIValidation: false, // Secrets don't need AI validation - they're definitive
982
- baseConfidence: BASE_CONFIDENCE,
983
- })
984
- }
985
- }
986
-
987
- // ========== NEW: Direct secret detection with known prefixes ==========
988
- // Scan for any known secret patterns anywhere in prompt-related code
989
- const seenSecretLines = new Set<number>() // Avoid duplicates
990
-
991
- for (const secretDef of KNOWN_SECRET_PREFIXES) {
992
- const regex = new RegExp(secretDef.pattern.source, secretDef.pattern.flags)
993
- let match
994
-
995
- while ((match = regex.exec(content)) !== null) {
996
- const lineNumber = content.substring(0, match.index).split('\n').length
997
- const lineContent = lines[lineNumber - 1]?.trim() || ''
998
-
999
- // Skip if already reported on this line
1000
- const lineKey = `${lineNumber}-${secretDef.name}`
1001
- if (seenSecretLines.has(lineNumber)) continue
1002
- seenSecretLines.add(lineNumber)
1003
-
1004
- // Skip comments
1005
- if (isComment(lineContent)) continue
1006
-
1007
- // Skip env var references
1008
- if (/process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent)) continue
1009
-
1010
- // Skip obvious placeholders/examples in the value
1011
- const matchValue = match[0]
1012
- if (/example|sample|demo|dummy|fake|mock|your[_-]|placeholder/i.test(matchValue)) continue
1013
- if (/example|sample|demo|placeholder/i.test(lineContent)) continue
1014
-
1015
- // Skip values that contain "test" right after the prefix (e.g., sk-test..., ghp_test...)
1016
- // These are clearly test/development keys, not production secrets
1017
- if (/^(sk-|ghp_|gho_|sk_live_|sk_test_|xoxb-|SG\.)test/i.test(matchValue)) continue
1018
- if (/[-_]test[-_0-9]/i.test(matchValue)) continue
1019
-
1020
- // Skip test variable names (e.g., TEST_API_KEY, MOCK_SECRET)
1021
- if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent)) continue
1022
-
1023
- // Skip if variable name contains test/mock/example (broader check)
1024
- if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent)) continue
1025
-
1026
- let severity: VulnerabilitySeverity = secretDef.severity
1027
- let description = `${secretDef.name} detected in LLM-related code. This secret may be exposed to the model provider, logged, or cached.`
1028
-
1029
- // Downgrade test files
1030
- if (isTestFile) {
1031
- severity = severity === 'critical' ? 'medium' : 'low'
1032
- description += ' (in test file)'
1033
- }
1034
-
1035
- vulnerabilities.push({
1036
- id: `ai-direct-secret-${filePath}-${lineNumber}-${secretDef.name.replace(/\s+/g, '-')}`,
1037
- filePath,
1038
- lineNumber,
1039
- lineContent,
1040
- severity,
1041
- category: 'hardcoded_secret',
1042
- title: `${secretDef.name} in LLM context`,
1043
- description,
1044
- suggestedFix: 'Remove the hardcoded secret. Use environment variables server-side. Never expose secrets to LLM prompts.',
1045
- confidence: 'high',
1046
- layer: 2,
1047
- source: 'ai_code' as const,
1048
- requiresAIValidation: false,
1049
- baseConfidence: BASE_CONFIDENCE,
1050
- })
1051
- }
1052
- }
1053
-
1054
- // ========== NEW: Variable flow detection ==========
1055
- // Detect secrets flowing from variables into prompts
1056
- const flowVulns = detectSecretVariableFlow(content, filePath, isTestFile, lines)
1057
- vulnerabilities.push(...flowVulns)
1058
-
1059
- // Scan for missing boundary patterns (B1 continued)
1060
- for (const pattern of MISSING_BOUNDARY_PATTERNS) {
1061
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1062
- let match
1063
-
1064
- while ((match = regex.exec(content)) !== null) {
1065
- const lineNumber = content.substring(0, match.index).split('\n').length
1066
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1067
-
1068
- // Skip comments
1069
- if (isComment(lineContent)) continue
1070
-
1071
- const contextLines = getSurroundingContext(content, lineNumber - 1, 10, lines)
1072
-
1073
- // Skip if delimiters are present
1074
- if (hasPromptDelimiters(lineContent, contextLines)) continue
1075
-
1076
- let severity = pattern.severity
1077
- let description = pattern.description
1078
-
1079
- if (isTestFile) {
1080
- severity = 'info'
1081
- description += ' (in test file)'
1082
- }
1083
-
1084
- vulnerabilities.push({
1085
- id: `ai-boundary-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1086
- filePath,
1087
- lineNumber,
1088
- lineContent,
1089
- severity,
1090
- category: 'ai_prompt_injection',
1091
- title: pattern.name,
1092
- description,
1093
- suggestedFix: pattern.suggestedFix,
1094
- confidence: 'medium',
1095
- layer: 2,
1096
- source: 'ai_code' as const,
1097
- requiresAIValidation: true,
1098
- baseConfidence: BASE_CONFIDENCE,
1099
- })
1100
- }
1101
- }
1102
-
1103
- // Scan for indirect prompt injection patterns (Phase 2)
1104
- for (const pattern of INDIRECT_INJECTION_PATTERNS) {
1105
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1106
- let match
1107
-
1108
- while ((match = regex.exec(content)) !== null) {
1109
- const lineNumber = content.substring(0, match.index).split('\n').length
1110
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1111
-
1112
- // Skip comments
1113
- if (isComment(lineContent)) continue
1114
-
1115
- let severity = pattern.severity
1116
- let description = pattern.description
1117
-
1118
- // Check for content filtering/sanitization
1119
- const hasFiltering = hasContentFiltering(content, lineNumber, lines)
1120
- const hasDelimiters = hasExternalContentDelimiters(content, lineNumber, lines)
1121
-
1122
- if (hasFiltering && hasDelimiters) {
1123
- // Both mitigations present - fully mitigated
1124
- severity = 'info'
1125
- description += ' (Content filtering and delimiters detected - mitigated.)'
1126
- } else if (hasFiltering) {
1127
- // Partial mitigation - filtering present
1128
- severity = severity === 'high' ? 'medium' : 'low'
1129
- description += ' (Content filtering detected.)'
1130
- } else if (hasDelimiters) {
1131
- // Partial mitigation - delimiters present
1132
- severity = severity === 'high' ? 'medium' : 'low'
1133
- description += ' (External content delimiters detected.)'
1134
- }
1135
-
1136
- // Downgrade test files
1137
- if (isTestFile) {
1138
- severity = 'info'
1139
- description += ' (in test file)'
1140
- }
1141
-
1142
- vulnerabilities.push({
1143
- id: `ai-indirect-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1144
- filePath,
1145
- lineNumber,
1146
- lineContent,
1147
- severity,
1148
- category: 'ai_prompt_injection',
1149
- title: pattern.name + ' (Indirect Injection)',
1150
- description,
1151
- suggestedFix: pattern.suggestedFix,
1152
- confidence: severity === 'info' ? 'low' : 'medium',
1153
- layer: 2,
1154
- source: 'ai_code' as const,
1155
- requiresAIValidation: severity !== 'info',
1156
- baseConfidence: BASE_CONFIDENCE,
1157
- })
1158
- }
1159
- }
1160
-
1161
- // ========== Sprint 6: Model-specific injection markers ==========
1162
- for (const pattern of MODEL_SPECIFIC_INJECTION_PATTERNS) {
1163
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1164
- let match
1165
-
1166
- while ((match = regex.exec(content)) !== null) {
1167
- const lineNumber = content.substring(0, match.index).split('\n').length
1168
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1169
-
1170
- // Skip comments
1171
- if (isComment(lineContent)) continue
1172
-
1173
- let severity = pattern.severity
1174
- let description = pattern.description
1175
- const contextLines = getSurroundingContext(content, lineNumber - 1, 15, lines)
1176
-
1177
- // Check for delimiters/sanitization
1178
- if (pattern.checkDelimiters && hasPromptDelimiters(lineContent, contextLines)) {
1179
- severity = 'info'
1180
- description += ' (Delimiters detected, risk mitigated.)'
1181
- }
1182
-
1183
- // Check for jailbreak filtering
1184
- if (hasJailbreakFiltering(content, lineNumber, lines)) {
1185
- severity = severity === 'high' ? 'medium' : 'low'
1186
- description += ' (Jailbreak filtering detected.)'
1187
- }
1188
-
1189
- if (isTestFile) {
1190
- severity = 'info'
1191
- description += ' (in test file)'
1192
- }
1193
-
1194
- vulnerabilities.push({
1195
- id: `ai-model-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1196
- filePath,
1197
- lineNumber,
1198
- lineContent,
1199
- severity,
1200
- category: 'ai_prompt_injection',
1201
- title: pattern.name,
1202
- description,
1203
- suggestedFix: pattern.suggestedFix,
1204
- confidence: severity === 'info' ? 'low' : 'medium',
1205
- layer: 2,
1206
- source: 'ai_code' as const,
1207
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1208
- baseConfidence: BASE_CONFIDENCE,
1209
- })
1210
- }
1211
- }
1212
-
1213
- // ========== Sprint 6: Encoding-based escape detection ==========
1214
- for (const pattern of ENCODING_ESCAPE_PATTERNS) {
1215
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1216
- let match
1217
-
1218
- while ((match = regex.exec(content)) !== null) {
1219
- const lineNumber = content.substring(0, match.index).split('\n').length
1220
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1221
-
1222
- // Skip comments
1223
- if (isComment(lineContent)) continue
1224
-
1225
- let severity = pattern.severity
1226
- let description = pattern.description
1227
- const contextLines = getSurroundingContext(content, lineNumber - 1, 15, lines)
1228
-
1229
- // Check for encoding sanitization
1230
- if (hasEncodingSanitization(content, lineNumber, lines)) {
1231
- severity = 'info'
1232
- description += ' (Encoding sanitization detected.)'
1233
- }
1234
-
1235
- // Check for delimiters
1236
- if (pattern.checkDelimiters && hasPromptDelimiters(lineContent, contextLines)) {
1237
- severity = 'info'
1238
- description += ' (Delimiters detected.)'
1239
- }
1240
-
1241
- if (isTestFile) {
1242
- severity = 'info'
1243
- description += ' (in test file)'
1244
- }
1245
-
1246
- vulnerabilities.push({
1247
- id: `ai-encoding-escape-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1248
- filePath,
1249
- lineNumber,
1250
- lineContent,
1251
- severity,
1252
- category: 'ai_prompt_injection',
1253
- title: pattern.name + ' (Encoding Bypass)',
1254
- description,
1255
- suggestedFix: pattern.suggestedFix,
1256
- confidence: 'medium',
1257
- layer: 2,
1258
- source: 'ai_code' as const,
1259
- requiresAIValidation: severity !== 'info',
1260
- baseConfidence: BASE_CONFIDENCE,
1261
- })
1262
- }
1263
- }
1264
-
1265
- // ========== Sprint 6: Jailbreak pattern detection ==========
1266
- for (const pattern of JAILBREAK_INDICATOR_PATTERNS) {
1267
- const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags)
1268
- let match
1269
-
1270
- while ((match = regex.exec(content)) !== null) {
1271
- const lineNumber = content.substring(0, match.index).split('\n').length
1272
- const lineContent = lines[lineNumber - 1]?.trim() || ''
1273
-
1274
- // Skip comments
1275
- if (isComment(lineContent)) continue
1276
-
1277
- let severity = pattern.severity
1278
- let description = pattern.description
1279
-
1280
- // Check for jailbreak filtering
1281
- if (hasJailbreakFiltering(content, lineNumber, lines)) {
1282
- severity = 'info'
1283
- description += ' (Jailbreak filtering detected - mitigated.)'
1284
- }
1285
-
1286
- if (isTestFile) {
1287
- severity = 'info'
1288
- description += ' (in test file)'
1289
- }
1290
-
1291
- vulnerabilities.push({
1292
- id: `ai-jailbreak-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
1293
- filePath,
1294
- lineNumber,
1295
- lineContent,
1296
- severity,
1297
- category: 'ai_prompt_injection',
1298
- title: pattern.name + ' (Jailbreak Risk)',
1299
- description,
1300
- suggestedFix: pattern.suggestedFix,
1301
- confidence: severity === 'info' ? 'low' : 'medium',
1302
- layer: 2,
1303
- source: 'ai_code' as const,
1304
- requiresAIValidation: severity !== 'info' && severity !== 'low',
1305
- baseConfidence: BASE_CONFIDENCE,
1306
- })
1307
- }
1308
- }
1309
-
1310
- return vulnerabilities
1311
- }
1312
-
1313
- // Export helper for use in other modules
1314
- export { isLLMContextFile }