@oculum/scanner 1.0.9 → 1.0.11

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 (365) hide show
  1. package/dist/baseline/diff.d.ts +32 -0
  2. package/dist/baseline/diff.d.ts.map +1 -0
  3. package/dist/baseline/diff.js +119 -0
  4. package/dist/baseline/diff.js.map +1 -0
  5. package/dist/baseline/index.d.ts +9 -0
  6. package/dist/baseline/index.d.ts.map +1 -0
  7. package/dist/baseline/index.js +19 -0
  8. package/dist/baseline/index.js.map +1 -0
  9. package/dist/baseline/manager.d.ts +67 -0
  10. package/dist/baseline/manager.d.ts.map +1 -0
  11. package/dist/baseline/manager.js +180 -0
  12. package/dist/baseline/manager.js.map +1 -0
  13. package/dist/baseline/types.d.ts +91 -0
  14. package/dist/baseline/types.d.ts.map +1 -0
  15. package/dist/baseline/types.js +12 -0
  16. package/dist/baseline/types.js.map +1 -0
  17. package/dist/formatters/cli-terminal.d.ts +38 -0
  18. package/dist/formatters/cli-terminal.d.ts.map +1 -1
  19. package/dist/formatters/cli-terminal.js +365 -42
  20. package/dist/formatters/cli-terminal.js.map +1 -1
  21. package/dist/formatters/github-comment.d.ts +1 -1
  22. package/dist/formatters/github-comment.d.ts.map +1 -1
  23. package/dist/formatters/github-comment.js +75 -11
  24. package/dist/formatters/github-comment.js.map +1 -1
  25. package/dist/formatters/index.d.ts +1 -1
  26. package/dist/formatters/index.d.ts.map +1 -1
  27. package/dist/formatters/index.js +4 -1
  28. package/dist/formatters/index.js.map +1 -1
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +155 -16
  32. package/dist/index.js.map +1 -1
  33. package/dist/layer1/config-audit.d.ts.map +1 -1
  34. package/dist/layer1/config-audit.js +20 -3
  35. package/dist/layer1/config-audit.js.map +1 -1
  36. package/dist/layer1/config-mcp-audit.d.ts +20 -0
  37. package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
  38. package/dist/layer1/config-mcp-audit.js +239 -0
  39. package/dist/layer1/config-mcp-audit.js.map +1 -0
  40. package/dist/layer1/index.d.ts +1 -0
  41. package/dist/layer1/index.d.ts.map +1 -1
  42. package/dist/layer1/index.js +9 -1
  43. package/dist/layer1/index.js.map +1 -1
  44. package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
  45. package/dist/layer2/ai-agent-tools.js +303 -0
  46. package/dist/layer2/ai-agent-tools.js.map +1 -1
  47. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
  48. package/dist/layer2/ai-endpoint-protection.js +17 -3
  49. package/dist/layer2/ai-endpoint-protection.js.map +1 -1
  50. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
  51. package/dist/layer2/ai-execution-sinks.js +462 -12
  52. package/dist/layer2/ai-execution-sinks.js.map +1 -1
  53. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
  54. package/dist/layer2/ai-fingerprinting.js +3 -0
  55. package/dist/layer2/ai-fingerprinting.js.map +1 -1
  56. package/dist/layer2/ai-mcp-security.d.ts +17 -0
  57. package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
  58. package/dist/layer2/ai-mcp-security.js +679 -0
  59. package/dist/layer2/ai-mcp-security.js.map +1 -0
  60. package/dist/layer2/ai-package-hallucination.d.ts +19 -0
  61. package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
  62. package/dist/layer2/ai-package-hallucination.js +696 -0
  63. package/dist/layer2/ai-package-hallucination.js.map +1 -0
  64. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
  65. package/dist/layer2/ai-prompt-hygiene.js +495 -9
  66. package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
  67. package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
  68. package/dist/layer2/ai-rag-safety.js +372 -1
  69. package/dist/layer2/ai-rag-safety.js.map +1 -1
  70. package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
  71. package/dist/layer2/auth-antipatterns.js +4 -0
  72. package/dist/layer2/auth-antipatterns.js.map +1 -1
  73. package/dist/layer2/byok-patterns.d.ts.map +1 -1
  74. package/dist/layer2/byok-patterns.js +3 -0
  75. package/dist/layer2/byok-patterns.js.map +1 -1
  76. package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
  77. package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
  78. package/dist/layer2/dangerous-functions/child-process.js +74 -0
  79. package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
  80. package/dist/layer2/dangerous-functions/dom-xss.d.ts +29 -0
  81. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
  82. package/dist/layer2/dangerous-functions/dom-xss.js +179 -0
  83. package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
  84. package/dist/layer2/dangerous-functions/index.d.ts +13 -0
  85. package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
  86. package/dist/layer2/dangerous-functions/index.js +621 -0
  87. package/dist/layer2/dangerous-functions/index.js.map +1 -0
  88. package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
  89. package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
  90. package/dist/layer2/dangerous-functions/json-parse.js +319 -0
  91. package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
  92. package/dist/layer2/dangerous-functions/math-random.d.ts +61 -0
  93. package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
  94. package/dist/layer2/dangerous-functions/math-random.js +459 -0
  95. package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
  96. package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
  97. package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
  98. package/dist/layer2/dangerous-functions/patterns.js +161 -0
  99. package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
  100. package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
  101. package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
  102. package/dist/layer2/dangerous-functions/request-validation.js +119 -0
  103. package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
  104. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +23 -0
  105. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  106. package/dist/layer2/dangerous-functions/utils/control-flow.js +149 -0
  107. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
  108. package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
  109. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
  110. package/dist/layer2/dangerous-functions/utils/helpers.js +124 -0
  111. package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
  112. package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
  113. package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
  114. package/dist/layer2/dangerous-functions/utils/index.js +23 -0
  115. package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
  116. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
  117. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  118. package/dist/layer2/dangerous-functions/utils/schema-validation.js +89 -0
  119. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
  120. package/dist/layer2/data-exposure.d.ts.map +1 -1
  121. package/dist/layer2/data-exposure.js +3 -0
  122. package/dist/layer2/data-exposure.js.map +1 -1
  123. package/dist/layer2/framework-checks.d.ts.map +1 -1
  124. package/dist/layer2/framework-checks.js +3 -0
  125. package/dist/layer2/framework-checks.js.map +1 -1
  126. package/dist/layer2/index.d.ts +3 -0
  127. package/dist/layer2/index.d.ts.map +1 -1
  128. package/dist/layer2/index.js +61 -2
  129. package/dist/layer2/index.js.map +1 -1
  130. package/dist/layer2/logic-gates.d.ts.map +1 -1
  131. package/dist/layer2/logic-gates.js +4 -0
  132. package/dist/layer2/logic-gates.js.map +1 -1
  133. package/dist/layer2/model-supply-chain.d.ts +20 -0
  134. package/dist/layer2/model-supply-chain.d.ts.map +1 -0
  135. package/dist/layer2/model-supply-chain.js +376 -0
  136. package/dist/layer2/model-supply-chain.js.map +1 -0
  137. package/dist/layer2/risky-imports.d.ts.map +1 -1
  138. package/dist/layer2/risky-imports.js +4 -0
  139. package/dist/layer2/risky-imports.js.map +1 -1
  140. package/dist/layer2/variables.d.ts.map +1 -1
  141. package/dist/layer2/variables.js +4 -0
  142. package/dist/layer2/variables.js.map +1 -1
  143. package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
  144. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
  145. package/dist/layer3/anthropic/auto-dismiss.js +188 -0
  146. package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
  147. package/dist/layer3/anthropic/clients.d.ts +44 -0
  148. package/dist/layer3/anthropic/clients.d.ts.map +1 -0
  149. package/dist/layer3/anthropic/clients.js +81 -0
  150. package/dist/layer3/anthropic/clients.js.map +1 -0
  151. package/dist/layer3/anthropic/index.d.ts +41 -0
  152. package/dist/layer3/anthropic/index.d.ts.map +1 -0
  153. package/dist/layer3/anthropic/index.js +141 -0
  154. package/dist/layer3/anthropic/index.js.map +1 -0
  155. package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
  156. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
  157. package/dist/layer3/anthropic/prompts/index.js +14 -0
  158. package/dist/layer3/anthropic/prompts/index.js.map +1 -0
  159. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
  160. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
  161. package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
  162. package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
  163. package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
  164. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
  165. package/dist/layer3/anthropic/prompts/validation.js +421 -0
  166. package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
  167. package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
  168. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
  169. package/dist/layer3/anthropic/providers/anthropic.js +266 -0
  170. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
  171. package/dist/layer3/anthropic/providers/index.d.ts +8 -0
  172. package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
  173. package/dist/layer3/anthropic/providers/index.js +15 -0
  174. package/dist/layer3/anthropic/providers/index.js.map +1 -0
  175. package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
  176. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
  177. package/dist/layer3/anthropic/providers/openai.js +340 -0
  178. package/dist/layer3/anthropic/providers/openai.js.map +1 -0
  179. package/dist/layer3/anthropic/request-builder.d.ts +20 -0
  180. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
  181. package/dist/layer3/anthropic/request-builder.js +134 -0
  182. package/dist/layer3/anthropic/request-builder.js.map +1 -0
  183. package/dist/layer3/anthropic/types.d.ts +88 -0
  184. package/dist/layer3/anthropic/types.d.ts.map +1 -0
  185. package/dist/layer3/anthropic/types.js +38 -0
  186. package/dist/layer3/anthropic/types.js.map +1 -0
  187. package/dist/layer3/anthropic/utils/index.d.ts +9 -0
  188. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
  189. package/dist/layer3/anthropic/utils/index.js +24 -0
  190. package/dist/layer3/anthropic/utils/index.js.map +1 -0
  191. package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
  192. package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
  193. package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
  194. package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
  195. package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
  196. package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
  197. package/dist/layer3/anthropic/utils/response-parser.js +285 -0
  198. package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
  199. package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
  200. package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
  201. package/dist/layer3/anthropic/utils/retry.js +62 -0
  202. package/dist/layer3/anthropic/utils/retry.js.map +1 -0
  203. package/dist/layer3/index.d.ts +1 -0
  204. package/dist/layer3/index.d.ts.map +1 -1
  205. package/dist/layer3/index.js +16 -6
  206. package/dist/layer3/index.js.map +1 -1
  207. package/dist/layer3/osv-check.d.ts +75 -0
  208. package/dist/layer3/osv-check.d.ts.map +1 -0
  209. package/dist/layer3/osv-check.js +308 -0
  210. package/dist/layer3/osv-check.js.map +1 -0
  211. package/dist/rules/framework-fixes.d.ts +48 -0
  212. package/dist/rules/framework-fixes.d.ts.map +1 -0
  213. package/dist/rules/framework-fixes.js +439 -0
  214. package/dist/rules/framework-fixes.js.map +1 -0
  215. package/dist/rules/index.d.ts +8 -0
  216. package/dist/rules/index.d.ts.map +1 -0
  217. package/dist/rules/index.js +18 -0
  218. package/dist/rules/index.js.map +1 -0
  219. package/dist/rules/metadata.d.ts +43 -0
  220. package/dist/rules/metadata.d.ts.map +1 -0
  221. package/dist/rules/metadata.js +734 -0
  222. package/dist/rules/metadata.js.map +1 -0
  223. package/dist/suppression/config-loader.d.ts +74 -0
  224. package/dist/suppression/config-loader.d.ts.map +1 -0
  225. package/dist/suppression/config-loader.js +424 -0
  226. package/dist/suppression/config-loader.js.map +1 -0
  227. package/dist/suppression/hash.d.ts +48 -0
  228. package/dist/suppression/hash.d.ts.map +1 -0
  229. package/dist/suppression/hash.js +88 -0
  230. package/dist/suppression/hash.js.map +1 -0
  231. package/dist/suppression/index.d.ts +11 -0
  232. package/dist/suppression/index.d.ts.map +1 -0
  233. package/dist/suppression/index.js +39 -0
  234. package/dist/suppression/index.js.map +1 -0
  235. package/dist/suppression/inline-parser.d.ts +39 -0
  236. package/dist/suppression/inline-parser.d.ts.map +1 -0
  237. package/dist/suppression/inline-parser.js +218 -0
  238. package/dist/suppression/inline-parser.js.map +1 -0
  239. package/dist/suppression/manager.d.ts +94 -0
  240. package/dist/suppression/manager.d.ts.map +1 -0
  241. package/dist/suppression/manager.js +292 -0
  242. package/dist/suppression/manager.js.map +1 -0
  243. package/dist/suppression/types.d.ts +151 -0
  244. package/dist/suppression/types.d.ts.map +1 -0
  245. package/dist/suppression/types.js +28 -0
  246. package/dist/suppression/types.js.map +1 -0
  247. package/dist/tiers.d.ts +1 -1
  248. package/dist/tiers.d.ts.map +1 -1
  249. package/dist/tiers.js +27 -0
  250. package/dist/tiers.js.map +1 -1
  251. package/dist/types.d.ts +62 -1
  252. package/dist/types.d.ts.map +1 -1
  253. package/dist/types.js.map +1 -1
  254. package/dist/utils/context-helpers.d.ts +4 -0
  255. package/dist/utils/context-helpers.d.ts.map +1 -1
  256. package/dist/utils/context-helpers.js +13 -9
  257. package/dist/utils/context-helpers.js.map +1 -1
  258. package/package.json +4 -2
  259. package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
  260. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
  261. package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
  262. package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
  263. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
  264. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
  265. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
  266. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
  267. package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
  268. package/src/__tests__/benchmark/fixtures/layer2/index.ts +18 -0
  269. package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
  270. package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
  271. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +758 -0
  272. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
  273. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
  274. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
  275. package/src/baseline/__tests__/diff.test.ts +261 -0
  276. package/src/baseline/__tests__/manager.test.ts +225 -0
  277. package/src/baseline/diff.ts +135 -0
  278. package/src/baseline/index.ts +29 -0
  279. package/src/baseline/manager.ts +230 -0
  280. package/src/baseline/types.ts +97 -0
  281. package/src/formatters/cli-terminal.ts +444 -41
  282. package/src/formatters/github-comment.ts +79 -11
  283. package/src/formatters/index.ts +4 -0
  284. package/src/index.ts +197 -14
  285. package/src/layer1/config-audit.ts +24 -3
  286. package/src/layer1/config-mcp-audit.ts +276 -0
  287. package/src/layer1/index.ts +16 -6
  288. package/src/layer2/ai-agent-tools.ts +336 -0
  289. package/src/layer2/ai-endpoint-protection.ts +16 -3
  290. package/src/layer2/ai-execution-sinks.ts +516 -12
  291. package/src/layer2/ai-fingerprinting.ts +5 -1
  292. package/src/layer2/ai-mcp-security.ts +730 -0
  293. package/src/layer2/ai-package-hallucination.ts +791 -0
  294. package/src/layer2/ai-prompt-hygiene.ts +547 -9
  295. package/src/layer2/ai-rag-safety.ts +382 -3
  296. package/src/layer2/auth-antipatterns.ts +5 -0
  297. package/src/layer2/byok-patterns.ts +5 -1
  298. package/src/layer2/dangerous-functions/child-process.ts +98 -0
  299. package/src/layer2/dangerous-functions/dom-xss.ts +220 -0
  300. package/src/layer2/dangerous-functions/index.ts +949 -0
  301. package/src/layer2/dangerous-functions/json-parse.ts +385 -0
  302. package/src/layer2/dangerous-functions/math-random.ts +537 -0
  303. package/src/layer2/dangerous-functions/patterns.ts +174 -0
  304. package/src/layer2/dangerous-functions/request-validation.ts +145 -0
  305. package/src/layer2/dangerous-functions/utils/control-flow.ts +162 -0
  306. package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
  307. package/src/layer2/dangerous-functions/utils/index.ts +25 -0
  308. package/src/layer2/dangerous-functions/utils/schema-validation.ts +91 -0
  309. package/src/layer2/data-exposure.ts +5 -1
  310. package/src/layer2/framework-checks.ts +5 -0
  311. package/src/layer2/index.ts +63 -1
  312. package/src/layer2/logic-gates.ts +5 -0
  313. package/src/layer2/model-supply-chain.ts +456 -0
  314. package/src/layer2/risky-imports.ts +5 -0
  315. package/src/layer2/variables.ts +5 -0
  316. package/src/layer3/__tests__/osv-check.test.ts +384 -0
  317. package/src/layer3/anthropic/auto-dismiss.ts +212 -0
  318. package/src/layer3/anthropic/clients.ts +84 -0
  319. package/src/layer3/anthropic/index.ts +170 -0
  320. package/src/layer3/anthropic/prompts/index.ts +14 -0
  321. package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
  322. package/src/layer3/anthropic/prompts/validation.ts +419 -0
  323. package/src/layer3/anthropic/providers/anthropic.ts +310 -0
  324. package/src/layer3/anthropic/providers/index.ts +8 -0
  325. package/src/layer3/anthropic/providers/openai.ts +384 -0
  326. package/src/layer3/anthropic/request-builder.ts +150 -0
  327. package/src/layer3/anthropic/types.ts +148 -0
  328. package/src/layer3/anthropic/utils/index.ts +26 -0
  329. package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
  330. package/src/layer3/anthropic/utils/response-parser.ts +322 -0
  331. package/src/layer3/anthropic/utils/retry.ts +75 -0
  332. package/src/layer3/index.ts +18 -5
  333. package/src/layer3/osv-check.ts +420 -0
  334. package/src/rules/__tests__/framework-fixes.test.ts +689 -0
  335. package/src/rules/__tests__/metadata.test.ts +218 -0
  336. package/src/rules/framework-fixes.ts +470 -0
  337. package/src/rules/index.ts +21 -0
  338. package/src/rules/metadata.ts +831 -0
  339. package/src/suppression/__tests__/config-loader.test.ts +382 -0
  340. package/src/suppression/__tests__/hash.test.ts +166 -0
  341. package/src/suppression/__tests__/inline-parser.test.ts +212 -0
  342. package/src/suppression/__tests__/manager.test.ts +415 -0
  343. package/src/suppression/config-loader.ts +462 -0
  344. package/src/suppression/hash.ts +95 -0
  345. package/src/suppression/index.ts +51 -0
  346. package/src/suppression/inline-parser.ts +273 -0
  347. package/src/suppression/manager.ts +379 -0
  348. package/src/suppression/types.ts +174 -0
  349. package/src/tiers.ts +36 -0
  350. package/src/types.ts +90 -0
  351. package/src/utils/context-helpers.ts +13 -9
  352. package/dist/layer2/dangerous-functions.d.ts +0 -7
  353. package/dist/layer2/dangerous-functions.d.ts.map +0 -1
  354. package/dist/layer2/dangerous-functions.js +0 -1701
  355. package/dist/layer2/dangerous-functions.js.map +0 -1
  356. package/dist/layer3/anthropic.d.ts +0 -87
  357. package/dist/layer3/anthropic.d.ts.map +0 -1
  358. package/dist/layer3/anthropic.js +0 -1948
  359. package/dist/layer3/anthropic.js.map +0 -1
  360. package/dist/layer3/openai.d.ts +0 -25
  361. package/dist/layer3/openai.d.ts.map +0 -1
  362. package/dist/layer3/openai.js +0 -238
  363. package/dist/layer3/openai.js.map +0 -1
  364. package/src/layer2/dangerous-functions.ts +0 -1940
  365. package/src/layer3/anthropic.ts +0 -2257
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-package-hallucination.js","sourceRoot":"","sources":["../../src/layer2/ai-package-hallucination.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-prompt-hygiene.d.ts","sourceRoot":"","sources":["../../src/layer2/ai-prompt-hygiene.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAA;AAQpE;;GAEG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA0BpE;AA8MD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CAqJjB;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"ai-prompt-hygiene.d.ts","sourceRoot":"","sources":["../../src/layer2/ai-prompt-hygiene.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAA;AAQpE;;GAEG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA0BpE;AA6lBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CA0RjB;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
@@ -108,14 +108,88 @@ const UNSAFE_INTERPOLATION_PATTERNS = [
108
108
  checkDelimiters: true,
109
109
  },
110
110
  ];
111
+ // ============================================================================
112
+ // Secret Patterns - Comprehensive provider-specific detection
113
+ // ============================================================================
114
+ /**
115
+ * Provider-specific secret patterns with known prefixes
116
+ * These are high-confidence patterns that don't need context matching
117
+ */
118
+ const KNOWN_SECRET_PREFIXES = [
119
+ // OpenAI
120
+ { name: 'OpenAI API Key', pattern: /sk-[a-zA-Z0-9]{20,}/g, severity: 'critical' },
121
+ { name: 'OpenAI Project Key', pattern: /sk-proj-[a-zA-Z0-9]{48,}/g, severity: 'critical' },
122
+ // Anthropic
123
+ { name: 'Anthropic API Key', pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g, severity: 'critical' },
124
+ { name: 'Anthropic Full Key', pattern: /sk-ant-api03-[a-zA-Z0-9_-]{90,}/g, severity: 'critical' },
125
+ // GitHub
126
+ { name: 'GitHub PAT', pattern: /ghp_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
127
+ { name: 'GitHub OAuth', pattern: /gho_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
128
+ { name: 'GitHub App Token', pattern: /ghu_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
129
+ { name: 'GitHub Refresh Token', pattern: /ghr_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
130
+ { name: 'GitHub Fine-grained PAT', pattern: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/g, severity: 'critical' },
131
+ // Stripe
132
+ { name: 'Stripe Live Secret', pattern: /sk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
133
+ { name: 'Stripe Test Secret', pattern: /sk_test_[a-zA-Z0-9]{24,}/g, severity: 'medium' },
134
+ { name: 'Stripe Restricted Key', pattern: /rk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
135
+ // AWS
136
+ { name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/g, severity: 'critical' },
137
+ { name: 'AWS Session Token', pattern: /ASIA[0-9A-Z]{16}/g, severity: 'critical' },
138
+ // Google
139
+ { name: 'Google API Key', pattern: /AIza[0-9A-Za-z-_]{35}/g, severity: 'high' },
140
+ // Slack
141
+ { name: 'Slack Bot Token', pattern: /xoxb-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
142
+ { name: 'Slack User Token', pattern: /xoxp-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
143
+ { name: 'Slack App Token', pattern: /xoxa-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
144
+ { name: 'Slack Legacy Token', pattern: /xox[baprs]-[0-9a-zA-Z]{10,}/g, severity: 'critical' },
145
+ // Twilio
146
+ { name: 'Twilio API Key', pattern: /SK[a-f0-9]{32}/g, severity: 'critical' },
147
+ { name: 'Twilio Account SID', pattern: /AC[a-f0-9]{32}/g, severity: 'high' },
148
+ // SendGrid
149
+ { name: 'SendGrid API Key', pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/g, severity: 'critical' },
150
+ // Mailgun
151
+ { name: 'Mailgun API Key', pattern: /key-[a-zA-Z0-9]{32}/g, severity: 'critical' },
152
+ // NPM/PyPI
153
+ { name: 'NPM Token', pattern: /npm_[a-zA-Z0-9]{36}/g, severity: 'critical' },
154
+ { name: 'PyPI Token', pattern: /pypi-[a-zA-Z0-9]{32,}/g, severity: 'critical' },
155
+ // Vercel/Netlify
156
+ { name: 'Vercel Token', pattern: /vercel_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
157
+ { name: 'Netlify Token', pattern: /nfp_[a-zA-Z0-9]{40,}/g, severity: 'critical' },
158
+ // Square
159
+ { name: 'Square Access Token', pattern: /sq0csp-[a-zA-Z0-9-_]{43}/g, severity: 'critical' },
160
+ { name: 'Square OAuth Secret', pattern: /sq0csp-[a-zA-Z0-9-_]{40,}/g, severity: 'critical' },
161
+ // Shopify
162
+ { name: 'Shopify Access Token', pattern: /shpat_[a-fA-F0-9]{32}/g, severity: 'critical' },
163
+ { name: 'Shopify Private App', pattern: /shppa_[a-fA-F0-9]{32}/g, severity: 'critical' },
164
+ // Datadog
165
+ { name: 'Datadog API Key', pattern: /dd[a-z]{1}[a-f0-9]{39}/g, severity: 'critical' },
166
+ // HuggingFace
167
+ { name: 'HuggingFace Token', pattern: /hf_[a-zA-Z0-9]{34,}/g, severity: 'critical' },
168
+ // Replicate
169
+ { name: 'Replicate API Token', pattern: /r8_[a-zA-Z0-9]{37}/g, severity: 'critical' },
170
+ // OpenRouter
171
+ { name: 'OpenRouter Key', pattern: /sk-or-v1-[a-zA-Z0-9]{64}/g, severity: 'critical' },
172
+ // Cohere
173
+ { name: 'Cohere API Key', pattern: /[a-zA-Z0-9]{40}(?=.*cohere)/gi, severity: 'high' },
174
+ // Private Keys
175
+ { name: 'Private Key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g, severity: 'critical' },
176
+ // JWT Tokens (full format)
177
+ { name: 'JWT Token', pattern: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, severity: 'high' },
178
+ // Database URLs with credentials
179
+ { name: 'Database URL', pattern: /(mongodb|postgres|mysql|redis|amqp)(\+srv)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi, severity: 'critical' },
180
+ // Webhook URLs (often contain secrets)
181
+ { 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' },
182
+ { name: 'Discord Webhook', pattern: /https:\/\/discord(?:app)?\.com\/api\/webhooks\/[0-9]+\/[a-zA-Z0-9_-]+/g, severity: 'high' },
183
+ ];
111
184
  /**
112
- * B3: Secrets in prompt context patterns
185
+ * B3: Secrets in prompt context patterns (original context-aware patterns)
186
+ * Note: Using [^\n;]* instead of [^;]* to prevent matching across lines
113
187
  */
114
188
  const SECRETS_IN_PROMPTS_PATTERNS = [
115
- // API keys in message content
189
+ // API keys in message content (same line only)
116
190
  {
117
191
  name: 'API key in prompt content',
118
- pattern: /(?:messages|prompt|system|content)\s*[=:][^;]*(?:sk-[a-zA-Z0-9]{20,}|api[_-]?key\s*[:=]\s*['"][^'"]{16,}['"])/gi,
192
+ pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:sk-[a-zA-Z0-9]{20,}|api[_-]?key\s*[:=]\s*['"][^'"]{16,}['"])/gi,
119
193
  severity: 'critical',
120
194
  description: 'API key appears to be hardcoded in prompt content. Keys in prompts may be logged, cached, or sent to model providers.',
121
195
  suggestedFix: 'Never include API keys in prompts. Use environment variables and keep them server-side only.',
@@ -123,7 +197,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
123
197
  // AWS keys in prompts
124
198
  {
125
199
  name: 'AWS credentials in prompt',
126
- pattern: /(?:messages|prompt|system|content)\s*[=:][^;]*(?:AKIA[A-Z0-9]{16}|aws[_-]?(?:secret|access)[_-]?key)/gi,
200
+ pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:AKIA[A-Z0-9]{16}|aws[_-]?(?:secret|access)[_-]?key)/gi,
127
201
  severity: 'critical',
128
202
  description: 'AWS credentials detected in prompt content.',
129
203
  suggestedFix: 'Remove credentials from prompts. Use IAM roles or environment variables instead.',
@@ -131,7 +205,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
131
205
  // Database URLs with credentials
132
206
  {
133
207
  name: 'Database credentials in prompt',
134
- pattern: /(?:messages|prompt|system|content).*(?:mongodb|postgres|mysql|redis):\/\/[^:]+:[^@]+@/gi,
208
+ pattern: /(?:messages|prompt|system|content)[^\n]*(?:mongodb|postgres|mysql|redis):\/\/[^:]+:[^@]+@/gi,
135
209
  severity: 'critical',
136
210
  description: 'Database connection string with credentials in prompt. This exposes database access.',
137
211
  suggestedFix: 'Never include connection strings in prompts. Reference data by ID instead.',
@@ -139,7 +213,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
139
213
  // Passwords in prompt context
140
214
  {
141
215
  name: 'Password in prompt content',
142
- pattern: /(?:messages|prompt|content)\s*[=:].*(?:password|passwd|pwd)\s*[:=]\s*['"`][^'"`]{8,}/gi,
216
+ pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:password|passwd|pwd)\s*[:=]\s*['"`][^'"`]{8,}/gi,
143
217
  severity: 'high',
144
218
  description: 'Password appears in prompt content. This may be logged or exposed to model providers.',
145
219
  suggestedFix: 'Remove passwords from prompts. Use authentication tokens or session references instead.',
@@ -147,7 +221,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
147
221
  // Private keys
148
222
  {
149
223
  name: 'Private key in prompt',
150
- pattern: /(?:messages|prompt|content).*(?:-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/gi,
224
+ pattern: /(?:messages|prompt|content)[^\n]*(?:-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/gi,
151
225
  severity: 'critical',
152
226
  description: 'Private key material detected in prompt context.',
153
227
  suggestedFix: 'Never include private keys in prompts. Sign data server-side instead.',
@@ -155,12 +229,300 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
155
229
  // Generic token patterns
156
230
  {
157
231
  name: 'Access token in prompt',
158
- pattern: /(?:messages|prompt|content)\s*[=:].*(?:access[_-]?token|auth[_-]?token|bearer)\s*[:=]\s*['"`][a-zA-Z0-9_.-]{20,}/gi,
232
+ pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:access[_-]?token|auth[_-]?token|bearer)\s*[:=]\s*['"`][a-zA-Z0-9_.-]{20,}/gi,
159
233
  severity: 'high',
160
234
  description: 'Access token detected in prompt content. Tokens in prompts risk exposure.',
161
235
  suggestedFix: 'Do not include tokens in prompts. Pass token context through secure server-side channels.',
162
236
  },
163
237
  ];
238
+ // ============================================================================
239
+ // Variable Flow Detection - Secrets flowing into prompts
240
+ // ============================================================================
241
+ /**
242
+ * Patterns for detecting secret variable declarations
243
+ */
244
+ const SECRET_VARIABLE_PATTERNS = [
245
+ // Direct assignment patterns
246
+ /(?:const|let|var)\s+(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*=\s*['"`]([^'"`]{16,})['"`]/gi,
247
+ // Object property patterns
248
+ /(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*:\s*['"`]([^'"`]{16,})['"`]/gi,
249
+ ];
250
+ /**
251
+ * Patterns for detecting prompt variable usage
252
+ */
253
+ const PROMPT_USAGE_PATTERNS = [
254
+ // Template literal interpolation
255
+ /`[^`]*\$\{(\w+)\}[^`]*`/g,
256
+ // String concatenation
257
+ /\+\s*(\w+)\s*(?:\+|$)/g,
258
+ // f-string interpolation (Python)
259
+ /f['"][^'"]*\{(\w+)\}[^'"]*['"]/g,
260
+ // Format string
261
+ /\.format\s*\([^)]*(\w+)[^)]*\)/g,
262
+ ];
263
+ /**
264
+ * Check if a variable name suggests it contains a secret
265
+ */
266
+ function isSecretVariableName(varName) {
267
+ const secretIndicators = [
268
+ /api[_-]?key/i,
269
+ /secret[_-]?key/i,
270
+ /access[_-]?token/i,
271
+ /auth[_-]?token/i,
272
+ /password/i,
273
+ /credential/i,
274
+ /private[_-]?key/i,
275
+ /bearer/i,
276
+ /jwt/i,
277
+ /oauth/i,
278
+ /^sk_/i,
279
+ /^pk_/i,
280
+ /token$/i,
281
+ /key$/i,
282
+ /secret$/i,
283
+ ];
284
+ return secretIndicators.some(p => p.test(varName));
285
+ }
286
+ /**
287
+ * Detect secrets flowing from variables into prompts (variable indirection)
288
+ */
289
+ function detectSecretVariableFlow(content, filePath, isTestFile) {
290
+ const vulnerabilities = [];
291
+ const lines = content.split('\n');
292
+ // First pass: collect all secret variable declarations
293
+ const secretVariables = new Map();
294
+ for (let i = 0; i < lines.length; i++) {
295
+ const line = lines[i];
296
+ if ((0, context_helpers_1.isComment)(line))
297
+ continue;
298
+ for (const pattern of SECRET_VARIABLE_PATTERNS) {
299
+ const regex = new RegExp(pattern.source, pattern.flags);
300
+ let match;
301
+ while ((match = regex.exec(line)) !== null) {
302
+ const varName = match[1];
303
+ const value = match[2];
304
+ // Check if variable name suggests it's a secret
305
+ if (isSecretVariableName(varName)) {
306
+ secretVariables.set(varName, { line: i + 1, value });
307
+ }
308
+ }
309
+ }
310
+ }
311
+ // Second pass: find where these variables flow into prompts
312
+ const promptContextPatterns = [
313
+ /(?:system|prompt|message|content)\s*[:=]/i,
314
+ /role:\s*['"`](?:system|user|assistant)['"`]/i,
315
+ /\.chat\.completions?\.create/i,
316
+ /\.messages\.create/i,
317
+ /messages\s*:\s*\[/i,
318
+ ];
319
+ for (let i = 0; i < lines.length; i++) {
320
+ const line = lines[i];
321
+ if ((0, context_helpers_1.isComment)(line))
322
+ continue;
323
+ // Check if this line or nearby lines are in prompt context
324
+ const contextWindow = lines.slice(Math.max(0, i - 5), Math.min(lines.length, i + 5)).join('\n');
325
+ const isPromptContext = promptContextPatterns.some(p => p.test(contextWindow));
326
+ if (!isPromptContext)
327
+ continue;
328
+ // Check for template interpolation of secret variables
329
+ const templateMatch = line.match(/\$\{(\w+)\}/);
330
+ if (templateMatch) {
331
+ const varName = templateMatch[1];
332
+ if (secretVariables.has(varName)) {
333
+ const secretInfo = secretVariables.get(varName);
334
+ let severity = 'high';
335
+ let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is interpolated into LLM prompt. This exposes the secret to the model provider.`;
336
+ if (isTestFile) {
337
+ severity = 'low';
338
+ description += ' (in test file)';
339
+ }
340
+ vulnerabilities.push({
341
+ id: `secret-flow-${filePath}-${i + 1}-${varName}`,
342
+ filePath,
343
+ lineNumber: i + 1,
344
+ lineContent: line.trim(),
345
+ severity,
346
+ category: 'hardcoded_secret',
347
+ title: `Secret variable '${varName}' in prompt`,
348
+ description,
349
+ 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.`,
350
+ confidence: 'medium',
351
+ layer: 2,
352
+ requiresAIValidation: true,
353
+ });
354
+ }
355
+ }
356
+ // Check for string concatenation with secret variables
357
+ for (const [varName] of secretVariables) {
358
+ if (line.includes(`+ ${varName}`) || line.includes(`${varName} +`) || line.includes(`+ ${varName} +`)) {
359
+ const secretInfo = secretVariables.get(varName);
360
+ let severity = 'high';
361
+ let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is concatenated into prompt. This exposes the secret to the model provider.`;
362
+ if (isTestFile) {
363
+ severity = 'low';
364
+ description += ' (in test file)';
365
+ }
366
+ vulnerabilities.push({
367
+ id: `secret-concat-${filePath}-${i + 1}-${varName}`,
368
+ filePath,
369
+ lineNumber: i + 1,
370
+ lineContent: line.trim(),
371
+ severity,
372
+ category: 'hardcoded_secret',
373
+ title: `Secret variable '${varName}' concatenated in prompt`,
374
+ description,
375
+ suggestedFix: `Remove the secret from the prompt. If the AI needs to use an API, make the call server-side.`,
376
+ confidence: 'medium',
377
+ layer: 2,
378
+ requiresAIValidation: true,
379
+ });
380
+ }
381
+ }
382
+ }
383
+ return vulnerabilities;
384
+ }
385
+ // ============================================================================
386
+ // Phase 2: Indirect Prompt Injection Detection
387
+ // ============================================================================
388
+ /**
389
+ * Check if content filtering/sanitization is present for external content
390
+ */
391
+ function hasContentFiltering(content, lineNumber) {
392
+ const lines = content.split('\n');
393
+ const contextStart = Math.max(0, lineNumber - 20);
394
+ const contextEnd = Math.min(lines.length, lineNumber + 10);
395
+ const context = lines.slice(contextStart, contextEnd).join('\n');
396
+ const filteringPatterns = [
397
+ /filterContent|sanitizeContent|cleanContent/i,
398
+ /sanitizeContext|filterContext/i,
399
+ /contentModeration|moderateContent/i,
400
+ /stripInstructions|removeInstructions/i,
401
+ /escapePrompt|sanitizePrompt/i,
402
+ /validateInput|inputValidation/i,
403
+ ];
404
+ return filteringPatterns.some(p => p.test(context));
405
+ }
406
+ /**
407
+ * Check if proper delimiters are used for external content
408
+ */
409
+ function hasExternalContentDelimiters(content, lineNumber) {
410
+ const lines = content.split('\n');
411
+ const contextStart = Math.max(0, lineNumber - 15);
412
+ const contextEnd = Math.min(lines.length, lineNumber + 15);
413
+ const context = lines.slice(contextStart, contextEnd).join('\n');
414
+ const delimiterPatterns = [
415
+ /<context>|<\/context>/i,
416
+ /<document>|<\/document>/i,
417
+ /<retrieved>|<\/retrieved>/i,
418
+ /<external>|<\/external>/i,
419
+ /```[^`]*context|context[^`]*```/i,
420
+ /---\s*(?:context|document|retrieved)/i,
421
+ /\[CONTEXT\]|\[\/CONTEXT\]/i,
422
+ /\[DOCUMENT\]|\[\/DOCUMENT\]/i,
423
+ ];
424
+ return delimiterPatterns.some(p => p.test(context));
425
+ }
426
+ /**
427
+ * Indirect prompt injection patterns - external content flowing to LLM context
428
+ */
429
+ const INDIRECT_INJECTION_PATTERNS = [
430
+ // ========== External Fetch to Prompt ==========
431
+ {
432
+ name: 'Fetched content in prompt',
433
+ pattern: /fetch\s*\([^)]+\)[\s\S]{0,100}(?:\.then|await)[\s\S]{0,200}(?:prompt|messages|content\s*:)/gi,
434
+ severity: 'high',
435
+ description: 'Content fetched from external URL flows into LLM prompt. Malicious websites can embed instructions that hijack the model\'s behavior (indirect prompt injection).',
436
+ suggestedFix: 'Wrap external content with clear delimiters: <external_content>...</external_content>. Implement content filtering to strip instruction-like patterns.',
437
+ checkDelimiters: true,
438
+ },
439
+ {
440
+ name: 'HTTP response in system prompt',
441
+ pattern: /(?:axios|fetch|got|request)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=+]/gi,
442
+ severity: 'high',
443
+ description: 'HTTP response content used in system prompt. External data in system prompts is especially dangerous as it can override model instructions.',
444
+ suggestedFix: 'Never put external content in system prompts. Use user messages with clear delimiters for context. Implement content sanitization.',
445
+ checkDelimiters: true,
446
+ },
447
+ // ========== RAG Vector Store to Prompt ==========
448
+ {
449
+ name: 'Vector store results in system message',
450
+ pattern: /(?:vectorStore|similaritySearch|query|search|retrieve)[\s\S]{0,200}role:\s*['"`]system['"`]/gi,
451
+ severity: 'high',
452
+ description: 'Vector store search results injected into system message. Poisoned documents in the corpus can hijack model behavior.',
453
+ suggestedFix: 'Place retrieved content in user messages, not system. Use delimiters: <retrieved_context>...</retrieved_context>. Implement document sanitization before indexing.',
454
+ checkDelimiters: true,
455
+ },
456
+ {
457
+ name: 'RAG retrieval directly in context',
458
+ pattern: /(?:retriever\.invoke|retrieve|getRelevantDocuments)\s*\([^)]*\)[\s\S]{0,150}(?:context|prompt|messages)/gi,
459
+ severity: 'high',
460
+ description: 'Retrieved documents flow directly into LLM context. Adversarial documents can contain prompt injection payloads.',
461
+ suggestedFix: 'Sanitize retrieved content before including in prompt. Use XML tags to clearly separate context from instructions.',
462
+ checkDelimiters: true,
463
+ },
464
+ // ========== Document Loading to LLM ==========
465
+ {
466
+ name: 'Loaded documents in LLM chain',
467
+ pattern: /(?:loadDocuments|DirectoryLoader|TextLoader|PDFLoader)[\s\S]{0,200}(?:chain|llm|invoke|call)/gi,
468
+ severity: 'high',
469
+ description: 'Documents loaded from files flow into LLM chain. Malicious files (PDFs, docs) can contain hidden prompt injection text.',
470
+ suggestedFix: 'Scan loaded documents for instruction-like patterns. Use separate document processing pipeline with content filtering.',
471
+ checkDelimiters: true,
472
+ },
473
+ {
474
+ name: 'Document content interpolated',
475
+ pattern: /\$\{.*(?:document|doc|file|page)(?:Content|Text|Data).*\}[\s\S]{0,50}(?:prompt|messages|llm)/gi,
476
+ severity: 'medium',
477
+ description: 'Document content interpolated into LLM prompt. Documents may contain adversarial instructions.',
478
+ suggestedFix: 'Wrap document content with delimiters: ```document\\n${content}\\n```. Implement text sanitization.',
479
+ checkDelimiters: true,
480
+ },
481
+ // ========== Web Scraping to Prompt ==========
482
+ {
483
+ name: 'Scraped content in prompt',
484
+ pattern: /(?:scrape|crawl|spider|puppeteer|playwright|cheerio)[\s\S]{0,200}(?:prompt|messages|context|content\s*:)/gi,
485
+ severity: 'high',
486
+ description: 'Web-scraped content flows into LLM prompt. Malicious websites can embed instructions in their HTML content.',
487
+ suggestedFix: 'Sanitize scraped content to remove instruction-like patterns. Use delimiters: <scraped_content url="...">...</scraped_content>',
488
+ checkDelimiters: true,
489
+ },
490
+ {
491
+ name: 'HTML content in LLM context',
492
+ pattern: /\.(?:html|innerHTML|textContent|innerText)\s*[\s\S]{0,100}(?:prompt|messages|system|context)/gi,
493
+ severity: 'medium',
494
+ description: 'HTML content from web pages used in LLM context. Web pages can contain hidden prompt injection in metadata, comments, or invisible text.',
495
+ suggestedFix: 'Extract only relevant text content. Filter out scripts, comments, and metadata. Use content sanitization.',
496
+ checkDelimiters: true,
497
+ },
498
+ // ========== Email/Message Content to Prompt ==========
499
+ {
500
+ name: 'Email content in prompt',
501
+ pattern: /(?:email|message|inbox)(?:Content|Body|Text)[\s\S]{0,150}(?:prompt|messages|llm|analyze)/gi,
502
+ severity: 'medium',
503
+ description: 'Email or message content flows into LLM prompt. Attackers can craft emails with embedded prompt injection.',
504
+ suggestedFix: 'Sanitize email content before LLM processing. Remove potentially malicious patterns. Use clear delimiters.',
505
+ checkDelimiters: true,
506
+ },
507
+ // ========== Database Content to Prompt ==========
508
+ {
509
+ name: 'Database record in system prompt',
510
+ pattern: /(?:findOne|findById|query|select)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=]/gi,
511
+ severity: 'medium',
512
+ description: 'Database content used in system prompt. If users can modify database records, they can inject malicious instructions.',
513
+ suggestedFix: 'Keep system prompts static. Place database content in user messages with delimiters. Validate data before use.',
514
+ checkDelimiters: true,
515
+ },
516
+ // ========== Generic External Data Patterns ==========
517
+ {
518
+ name: 'External data concatenation',
519
+ pattern: /(?:externalData|fetchedContent|scrapedData|retrievedText)\s*\+[\s\S]{0,50}(?:prompt|system|instructions)/gi,
520
+ severity: 'medium',
521
+ description: 'External data concatenated with prompt content without clear separation.',
522
+ suggestedFix: 'Use structured prompts with XML/markdown delimiters to separate instructions from external content.',
523
+ checkDelimiters: true,
524
+ },
525
+ ];
164
526
  /**
165
527
  * Missing boundary patterns - prompts without clear user/system separation
166
528
  */
@@ -278,7 +640,7 @@ function detectAIPromptHygiene(content, filePath) {
278
640
  });
279
641
  }
280
642
  }
281
- // Scan for secrets in prompts (B3)
643
+ // Scan for secrets in prompts (B3) - Original context-aware patterns
282
644
  for (const pattern of SECRETS_IN_PROMPTS_PATTERNS) {
283
645
  const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
284
646
  let match;
@@ -292,6 +654,14 @@ function detectAIPromptHygiene(content, filePath) {
292
654
  const isEnvRef = /process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent);
293
655
  if (isEnvRef)
294
656
  continue;
657
+ // Skip test variable names
658
+ if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent))
659
+ continue;
660
+ if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent))
661
+ continue;
662
+ // Skip placeholder/example values in the line
663
+ if (/example|sample|demo|placeholder|your[_-]?api[_-]?key/i.test(lineContent))
664
+ continue;
295
665
  let severity = pattern.severity;
296
666
  let description = pattern.description;
297
667
  // Downgrade test files but still flag
@@ -315,6 +685,71 @@ function detectAIPromptHygiene(content, filePath) {
315
685
  });
316
686
  }
317
687
  }
688
+ // ========== NEW: Direct secret detection with known prefixes ==========
689
+ // Scan for any known secret patterns anywhere in prompt-related code
690
+ const seenSecretLines = new Set(); // Avoid duplicates
691
+ for (const secretDef of KNOWN_SECRET_PREFIXES) {
692
+ const regex = new RegExp(secretDef.pattern.source, secretDef.pattern.flags);
693
+ let match;
694
+ while ((match = regex.exec(content)) !== null) {
695
+ const lineNumber = content.substring(0, match.index).split('\n').length;
696
+ const lineContent = lines[lineNumber - 1]?.trim() || '';
697
+ // Skip if already reported on this line
698
+ const lineKey = `${lineNumber}-${secretDef.name}`;
699
+ if (seenSecretLines.has(lineNumber))
700
+ continue;
701
+ seenSecretLines.add(lineNumber);
702
+ // Skip comments
703
+ if ((0, context_helpers_1.isComment)(lineContent))
704
+ continue;
705
+ // Skip env var references
706
+ if (/process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent))
707
+ continue;
708
+ // Skip obvious placeholders/examples in the value
709
+ const matchValue = match[0];
710
+ if (/example|sample|demo|dummy|fake|mock|your[_-]|placeholder/i.test(matchValue))
711
+ continue;
712
+ if (/example|sample|demo|placeholder/i.test(lineContent))
713
+ continue;
714
+ // Skip values that contain "test" right after the prefix (e.g., sk-test..., ghp_test...)
715
+ // These are clearly test/development keys, not production secrets
716
+ if (/^(sk-|ghp_|gho_|sk_live_|sk_test_|xoxb-|SG\.)test/i.test(matchValue))
717
+ continue;
718
+ if (/[-_]test[-_0-9]/i.test(matchValue))
719
+ continue;
720
+ // Skip test variable names (e.g., TEST_API_KEY, MOCK_SECRET)
721
+ if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent))
722
+ continue;
723
+ // Skip if variable name contains test/mock/example (broader check)
724
+ if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent))
725
+ continue;
726
+ let severity = secretDef.severity;
727
+ let description = `${secretDef.name} detected in LLM-related code. This secret may be exposed to the model provider, logged, or cached.`;
728
+ // Downgrade test files
729
+ if (isTestFile) {
730
+ severity = severity === 'critical' ? 'medium' : 'low';
731
+ description += ' (in test file)';
732
+ }
733
+ vulnerabilities.push({
734
+ id: `ai-direct-secret-${filePath}-${lineNumber}-${secretDef.name.replace(/\s+/g, '-')}`,
735
+ filePath,
736
+ lineNumber,
737
+ lineContent,
738
+ severity,
739
+ category: 'hardcoded_secret',
740
+ title: `${secretDef.name} in LLM context`,
741
+ description,
742
+ suggestedFix: 'Remove the hardcoded secret. Use environment variables server-side. Never expose secrets to LLM prompts.',
743
+ confidence: 'high',
744
+ layer: 2,
745
+ requiresAIValidation: false,
746
+ });
747
+ }
748
+ }
749
+ // ========== NEW: Variable flow detection ==========
750
+ // Detect secrets flowing from variables into prompts
751
+ const flowVulns = detectSecretVariableFlow(content, filePath, isTestFile);
752
+ vulnerabilities.push(...flowVulns);
318
753
  // Scan for missing boundary patterns (B1 continued)
319
754
  for (const pattern of MISSING_BOUNDARY_PATTERNS) {
320
755
  const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
@@ -351,6 +786,57 @@ function detectAIPromptHygiene(content, filePath) {
351
786
  });
352
787
  }
353
788
  }
789
+ // Scan for indirect prompt injection patterns (Phase 2)
790
+ for (const pattern of INDIRECT_INJECTION_PATTERNS) {
791
+ const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
792
+ let match;
793
+ while ((match = regex.exec(content)) !== null) {
794
+ const lineNumber = content.substring(0, match.index).split('\n').length;
795
+ const lineContent = lines[lineNumber - 1]?.trim() || '';
796
+ // Skip comments
797
+ if ((0, context_helpers_1.isComment)(lineContent))
798
+ continue;
799
+ let severity = pattern.severity;
800
+ let description = pattern.description;
801
+ // Check for content filtering/sanitization
802
+ const hasFiltering = hasContentFiltering(content, lineNumber);
803
+ const hasDelimiters = hasExternalContentDelimiters(content, lineNumber);
804
+ if (hasFiltering && hasDelimiters) {
805
+ // Both mitigations present - fully mitigated
806
+ severity = 'info';
807
+ description += ' (Content filtering and delimiters detected - mitigated.)';
808
+ }
809
+ else if (hasFiltering) {
810
+ // Partial mitigation - filtering present
811
+ severity = severity === 'high' ? 'medium' : 'low';
812
+ description += ' (Content filtering detected.)';
813
+ }
814
+ else if (hasDelimiters) {
815
+ // Partial mitigation - delimiters present
816
+ severity = severity === 'high' ? 'medium' : 'low';
817
+ description += ' (External content delimiters detected.)';
818
+ }
819
+ // Downgrade test files
820
+ if (isTestFile) {
821
+ severity = 'info';
822
+ description += ' (in test file)';
823
+ }
824
+ vulnerabilities.push({
825
+ id: `ai-indirect-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
826
+ filePath,
827
+ lineNumber,
828
+ lineContent,
829
+ severity,
830
+ category: 'ai_prompt_injection',
831
+ title: pattern.name + ' (Indirect Injection)',
832
+ description,
833
+ suggestedFix: pattern.suggestedFix,
834
+ confidence: severity === 'info' ? 'low' : 'medium',
835
+ layer: 2,
836
+ requiresAIValidation: severity !== 'info',
837
+ });
838
+ }
839
+ }
354
840
  return vulnerabilities;
355
841
  }
356
842
  //# sourceMappingURL=ai-prompt-hygiene.js.map