shield360 1.1.0 → 1.2.1

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 (400) hide show
  1. package/README.md +330 -3
  2. package/dist/__tests__/build-info.test.js +8 -1
  3. package/dist/__tests__/build-info.test.js.map +1 -1
  4. package/dist/__tests__/code-location.test.js +1 -1
  5. package/dist/__tests__/destination.test.js +15 -0
  6. package/dist/__tests__/destination.test.js.map +1 -1
  7. package/dist/__tests__/masking.test.d.ts +1 -0
  8. package/dist/__tests__/masking.test.js +66 -0
  9. package/dist/__tests__/masking.test.js.map +1 -0
  10. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/register.e2e.test.js +279 -0
  12. package/dist/__tests__/register.e2e.test.js.map +1 -0
  13. package/dist/__tests__/register.test.js +60 -0
  14. package/dist/__tests__/register.test.js.map +1 -1
  15. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  16. package/dist/agents/__tests__/agents.test.js +529 -0
  17. package/dist/agents/__tests__/agents.test.js.map +1 -0
  18. package/dist/agents/index.d.ts +15 -0
  19. package/dist/agents/index.js +25 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/passport.d.ts +92 -0
  22. package/dist/agents/passport.js +301 -0
  23. package/dist/agents/passport.js.map +1 -0
  24. package/dist/agents/policy.d.ts +24 -0
  25. package/dist/agents/policy.js +93 -0
  26. package/dist/agents/policy.js.map +1 -0
  27. package/dist/agents/replay.d.ts +20 -0
  28. package/dist/agents/replay.js +47 -0
  29. package/dist/agents/replay.js.map +1 -0
  30. package/dist/agents/report.d.ts +30 -0
  31. package/dist/agents/report.js +93 -0
  32. package/dist/agents/report.js.map +1 -0
  33. package/dist/agents/types.d.ts +148 -0
  34. package/dist/agents/types.js +37 -0
  35. package/dist/agents/types.js.map +1 -0
  36. package/dist/agents/verifier.d.ts +33 -0
  37. package/dist/agents/verifier.js +276 -0
  38. package/dist/agents/verifier.js.map +1 -0
  39. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  40. package/dist/ai-security/__tests__/bench.test.js +50 -0
  41. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  42. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/checks.test.js +248 -0
  44. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/config.test.js +164 -0
  47. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/detection.test.js +114 -0
  50. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  52. package/dist/ai-security/__tests__/fixtures.js +30 -0
  53. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  54. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  55. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  56. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  57. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/stream.test.js +85 -0
  59. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  60. package/dist/ai-security/config.d.ts +94 -0
  61. package/dist/ai-security/config.js +241 -0
  62. package/dist/ai-security/config.js.map +1 -0
  63. package/dist/ai-security/context.d.ts +45 -0
  64. package/dist/ai-security/context.js +108 -0
  65. package/dist/ai-security/context.js.map +1 -0
  66. package/dist/ai-security/custom-kinds.d.ts +23 -0
  67. package/dist/ai-security/custom-kinds.js +97 -0
  68. package/dist/ai-security/custom-kinds.js.map +1 -0
  69. package/dist/ai-security/events.d.ts +77 -0
  70. package/dist/ai-security/events.js +153 -0
  71. package/dist/ai-security/events.js.map +1 -0
  72. package/dist/ai-security/hooks.d.ts +48 -0
  73. package/dist/ai-security/hooks.js +461 -0
  74. package/dist/ai-security/hooks.js.map +1 -0
  75. package/dist/ai-security/index.d.ts +209 -0
  76. package/dist/ai-security/index.js +587 -0
  77. package/dist/ai-security/index.js.map +1 -0
  78. package/dist/ai-security/injection-rules.json +1024 -0
  79. package/dist/ai-security/injection.d.ts +46 -0
  80. package/dist/ai-security/injection.js +635 -0
  81. package/dist/ai-security/injection.js.map +1 -0
  82. package/dist/ai-security/jailbreak.d.ts +38 -0
  83. package/dist/ai-security/jailbreak.js +73 -0
  84. package/dist/ai-security/jailbreak.js.map +1 -0
  85. package/dist/ai-security/limits.d.ts +84 -0
  86. package/dist/ai-security/limits.js +195 -0
  87. package/dist/ai-security/limits.js.map +1 -0
  88. package/dist/ai-security/mcp.d.ts +82 -0
  89. package/dist/ai-security/mcp.js +150 -0
  90. package/dist/ai-security/mcp.js.map +1 -0
  91. package/dist/ai-security/output.d.ts +107 -0
  92. package/dist/ai-security/output.js +390 -0
  93. package/dist/ai-security/output.js.map +1 -0
  94. package/dist/ai-security/policy.d.ts +125 -0
  95. package/dist/ai-security/policy.js +196 -0
  96. package/dist/ai-security/policy.js.map +1 -0
  97. package/dist/ai-security/rag.d.ts +70 -0
  98. package/dist/ai-security/rag.js +174 -0
  99. package/dist/ai-security/rag.js.map +1 -0
  100. package/dist/ai-security/tool-rules.json +203 -0
  101. package/dist/ai-security/tools.d.ts +46 -0
  102. package/dist/ai-security/tools.js +62 -0
  103. package/dist/ai-security/tools.js.map +1 -0
  104. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  105. package/dist/budgets/__tests__/budgets.test.js +134 -0
  106. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  107. package/dist/budgets/auto.d.ts +25 -0
  108. package/dist/budgets/auto.js +63 -0
  109. package/dist/budgets/auto.js.map +1 -0
  110. package/dist/budgets/index.d.ts +110 -0
  111. package/dist/budgets/index.js +239 -0
  112. package/dist/budgets/index.js.map +1 -0
  113. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  114. package/dist/customer/__tests__/customer.test.js +155 -0
  115. package/dist/customer/__tests__/customer.test.js.map +1 -0
  116. package/dist/customer/index.d.ts +48 -0
  117. package/dist/customer/index.js +132 -0
  118. package/dist/customer/index.js.map +1 -0
  119. package/dist/destination.d.ts +14 -0
  120. package/dist/destination.js +16 -0
  121. package/dist/destination.js.map +1 -1
  122. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  123. package/dist/feedback/__tests__/feedback.test.js +80 -0
  124. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  125. package/dist/feedback/index.d.ts +48 -0
  126. package/dist/feedback/index.js +97 -0
  127. package/dist/feedback/index.js.map +1 -0
  128. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  129. package/dist/flags/__tests__/flags.test.js +301 -0
  130. package/dist/flags/__tests__/flags.test.js.map +1 -0
  131. package/dist/flags/client.d.ts +131 -0
  132. package/dist/flags/client.js +301 -0
  133. package/dist/flags/client.js.map +1 -0
  134. package/dist/flags/engine.d.ts +200 -0
  135. package/dist/flags/engine.js +677 -0
  136. package/dist/flags/engine.js.map +1 -0
  137. package/dist/flags/index.d.ts +4 -0
  138. package/dist/flags/index.js +16 -0
  139. package/dist/flags/index.js.map +1 -0
  140. package/dist/guard/__tests__/findings.test.js +1 -1
  141. package/dist/guard/__tests__/report.test.js +67 -0
  142. package/dist/guard/__tests__/report.test.js.map +1 -1
  143. package/dist/guard/heartbeat.d.ts +34 -0
  144. package/dist/guard/heartbeat.js +83 -0
  145. package/dist/guard/heartbeat.js.map +1 -0
  146. package/dist/guard/integration.d.ts +9 -0
  147. package/dist/guard/integration.js +4 -2
  148. package/dist/guard/integration.js.map +1 -1
  149. package/dist/guard/report.d.ts +24 -1
  150. package/dist/guard/report.js +67 -18
  151. package/dist/guard/report.js.map +1 -1
  152. package/dist/index.d.ts +88 -0
  153. package/dist/index.js +203 -2
  154. package/dist/index.js.map +1 -1
  155. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  156. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  157. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  158. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  159. package/dist/instrumentation/openai/wrapper.js +6 -0
  160. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  161. package/dist/masking.d.ts +42 -0
  162. package/dist/masking.js +197 -0
  163. package/dist/masking.js.map +1 -0
  164. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  165. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  166. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  167. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  168. package/dist/otel/__tests__/app-logs.test.js +269 -0
  169. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  170. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  171. package/dist/otel/__tests__/log-auto.test.js +125 -0
  172. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  173. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  174. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  175. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  176. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  177. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  178. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  179. package/dist/otel/app-logs.d.ts +80 -0
  180. package/dist/otel/app-logs.js +195 -0
  181. package/dist/otel/app-logs.js.map +1 -0
  182. package/dist/otel/build-info.d.ts +2 -1
  183. package/dist/otel/build-info.js +3 -2
  184. package/dist/otel/build-info.js.map +1 -1
  185. package/dist/otel/events.d.ts +1 -0
  186. package/dist/otel/events.js +22 -13
  187. package/dist/otel/events.js.map +1 -1
  188. package/dist/otel/log-auto.d.ts +44 -0
  189. package/dist/otel/log-auto.js +200 -0
  190. package/dist/otel/log-auto.js.map +1 -0
  191. package/dist/otel/log-bridges.d.ts +54 -0
  192. package/dist/otel/log-bridges.js +307 -0
  193. package/dist/otel/log-bridges.js.map +1 -0
  194. package/dist/otel/metrics.js +1 -1
  195. package/dist/otel/metrics.js.map +1 -1
  196. package/dist/otel/system-metrics.d.ts +39 -0
  197. package/dist/otel/system-metrics.js +166 -0
  198. package/dist/otel/system-metrics.js.map +1 -0
  199. package/dist/otel/tracing.js +6 -2
  200. package/dist/otel/tracing.js.map +1 -1
  201. package/dist/protect/__tests__/protect.test.js +4 -0
  202. package/dist/protect/__tests__/protect.test.js.map +1 -1
  203. package/dist/protect/index.js +9 -4
  204. package/dist/protect/index.js.map +1 -1
  205. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  206. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  207. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  208. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  209. package/dist/rasp/__tests__/baseline.test.js +86 -0
  210. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  211. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  212. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  213. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  214. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  215. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  216. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  217. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  218. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  219. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  220. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  221. package/dist/rasp/__tests__/config-client.test.js +283 -0
  222. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  223. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  224. package/dist/rasp/__tests__/corpus.js +111 -0
  225. package/dist/rasp/__tests__/corpus.js.map +1 -0
  226. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  227. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  228. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  229. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  231. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  232. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/deception.test.js +567 -0
  234. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  235. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/detect.test.js +276 -0
  237. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  238. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  240. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  241. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  243. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  246. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  247. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  248. package/dist/rasp/__tests__/hook-kit.js +139 -0
  249. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  250. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  252. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  253. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/iast.test.js +361 -0
  255. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  256. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  258. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  259. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/middleware.test.js +302 -0
  261. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  262. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  264. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  265. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/reporter.test.js +114 -0
  267. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  268. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/route.test.js +46 -0
  270. package/dist/rasp/__tests__/route.test.js.map +1 -0
  271. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  272. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  273. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  274. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  276. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  277. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  279. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  280. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/targets.test.js +82 -0
  282. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  283. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  285. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  286. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/upload.test.js +81 -0
  288. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  289. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  291. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  292. package/dist/rasp/auto-http.d.ts +6 -0
  293. package/dist/rasp/auto-http.js +194 -0
  294. package/dist/rasp/auto-http.js.map +1 -0
  295. package/dist/rasp/baseline.d.ts +35 -0
  296. package/dist/rasp/baseline.js +91 -0
  297. package/dist/rasp/baseline.js.map +1 -0
  298. package/dist/rasp/capture.d.ts +76 -0
  299. package/dist/rasp/capture.js +304 -0
  300. package/dist/rasp/capture.js.map +1 -0
  301. package/dist/rasp/config-client.d.ts +122 -0
  302. package/dist/rasp/config-client.js +337 -0
  303. package/dist/rasp/config-client.js.map +1 -0
  304. package/dist/rasp/context.d.ts +65 -0
  305. package/dist/rasp/context.js +68 -0
  306. package/dist/rasp/context.js.map +1 -0
  307. package/dist/rasp/custom-rules.d.ts +68 -0
  308. package/dist/rasp/custom-rules.js +222 -0
  309. package/dist/rasp/custom-rules.js.map +1 -0
  310. package/dist/rasp/data/default-rules.json +199 -0
  311. package/dist/rasp/data/default-sinks.json +4 -0
  312. package/dist/rasp/data/dnslog-domains.json +11 -0
  313. package/dist/rasp/deception.d.ts +70 -0
  314. package/dist/rasp/deception.js +220 -0
  315. package/dist/rasp/deception.js.map +1 -0
  316. package/dist/rasp/detect.d.ts +68 -0
  317. package/dist/rasp/detect.js +671 -0
  318. package/dist/rasp/detect.js.map +1 -0
  319. package/dist/rasp/engine.d.ts +107 -0
  320. package/dist/rasp/engine.js +330 -0
  321. package/dist/rasp/engine.js.map +1 -0
  322. package/dist/rasp/hooks/code.d.ts +20 -0
  323. package/dist/rasp/hooks/code.js +334 -0
  324. package/dist/rasp/hooks/code.js.map +1 -0
  325. package/dist/rasp/hooks/db.d.ts +48 -0
  326. package/dist/rasp/hooks/db.js +322 -0
  327. package/dist/rasp/hooks/db.js.map +1 -0
  328. package/dist/rasp/hooks/esm.d.ts +7 -0
  329. package/dist/rasp/hooks/esm.js +18 -0
  330. package/dist/rasp/hooks/esm.js.map +1 -0
  331. package/dist/rasp/hooks/fs.d.ts +3 -0
  332. package/dist/rasp/hooks/fs.js +206 -0
  333. package/dist/rasp/hooks/fs.js.map +1 -0
  334. package/dist/rasp/hooks/http.d.ts +4 -0
  335. package/dist/rasp/hooks/http.js +213 -0
  336. package/dist/rasp/hooks/http.js.map +1 -0
  337. package/dist/rasp/hooks/include.d.ts +9 -0
  338. package/dist/rasp/hooks/include.js +79 -0
  339. package/dist/rasp/hooks/include.js.map +1 -0
  340. package/dist/rasp/hooks/marks.d.ts +2 -0
  341. package/dist/rasp/hooks/marks.js +16 -0
  342. package/dist/rasp/hooks/marks.js.map +1 -0
  343. package/dist/rasp/hooks/process.d.ts +22 -0
  344. package/dist/rasp/hooks/process.js +191 -0
  345. package/dist/rasp/hooks/process.js.map +1 -0
  346. package/dist/rasp/hooks/sinks.d.ts +54 -0
  347. package/dist/rasp/hooks/sinks.js +329 -0
  348. package/dist/rasp/hooks/sinks.js.map +1 -0
  349. package/dist/rasp/hooks/template.d.ts +21 -0
  350. package/dist/rasp/hooks/template.js +152 -0
  351. package/dist/rasp/hooks/template.js.map +1 -0
  352. package/dist/rasp/iast-rules.d.ts +82 -0
  353. package/dist/rasp/iast-rules.js +240 -0
  354. package/dist/rasp/iast-rules.js.map +1 -0
  355. package/dist/rasp/iast-scope.d.ts +29 -0
  356. package/dist/rasp/iast-scope.js +54 -0
  357. package/dist/rasp/iast-scope.js.map +1 -0
  358. package/dist/rasp/iast.d.ts +81 -0
  359. package/dist/rasp/iast.js +272 -0
  360. package/dist/rasp/iast.js.map +1 -0
  361. package/dist/rasp/index.d.ts +52 -0
  362. package/dist/rasp/index.js +280 -0
  363. package/dist/rasp/index.js.map +1 -0
  364. package/dist/rasp/lexers.d.ts +32 -0
  365. package/dist/rasp/lexers.js +444 -0
  366. package/dist/rasp/lexers.js.map +1 -0
  367. package/dist/rasp/middleware.d.ts +155 -0
  368. package/dist/rasp/middleware.js +568 -0
  369. package/dist/rasp/middleware.js.map +1 -0
  370. package/dist/rasp/model-output.d.ts +14 -0
  371. package/dist/rasp/model-output.js +107 -0
  372. package/dist/rasp/model-output.js.map +1 -0
  373. package/dist/rasp/normalize.d.ts +23 -0
  374. package/dist/rasp/normalize.js +140 -0
  375. package/dist/rasp/normalize.js.map +1 -0
  376. package/dist/rasp/reporter.d.ts +60 -0
  377. package/dist/rasp/reporter.js +230 -0
  378. package/dist/rasp/reporter.js.map +1 -0
  379. package/dist/rasp/rule-expr.d.ts +236 -0
  380. package/dist/rasp/rule-expr.js +1253 -0
  381. package/dist/rasp/rule-expr.js.map +1 -0
  382. package/dist/rasp/template.d.ts +53 -0
  383. package/dist/rasp/template.js +336 -0
  384. package/dist/rasp/template.js.map +1 -0
  385. package/dist/rasp/types.d.ts +110 -0
  386. package/dist/rasp/types.js +51 -0
  387. package/dist/rasp/types.js.map +1 -0
  388. package/dist/rasp/vpatch.d.ts +55 -0
  389. package/dist/rasp/vpatch.js +120 -0
  390. package/dist/rasp/vpatch.js.map +1 -0
  391. package/dist/register.js +52 -11
  392. package/dist/register.js.map +1 -1
  393. package/dist/semantic-convention.d.ts +2 -0
  394. package/dist/semantic-convention.js +5 -0
  395. package/dist/semantic-convention.js.map +1 -1
  396. package/dist/types.d.ts +77 -1
  397. package/dist/zero-code.d.ts +8 -0
  398. package/dist/zero-code.js +38 -0
  399. package/dist/zero-code.js.map +1 -0
  400. package/package.json +18 -2
@@ -0,0 +1,1024 @@
1
+ {
2
+ "_comment": "Shield360 prompt-injection rules. The one definition both detectors load: cli/internal/coding/injection (Go, embedded) and src/client/src/lib/security/injection (TypeScript, a byte-identical copy kept in step by `npm run injection:sync-rules` and checked by tests on both sides). Patterns are written in the subset Go RE2 and JavaScript (u flag) read the same way: no lookaround, no backreferences, no \\u escapes, and matching is always case-insensitive. Bump version whenever a rule changes. A rule may list `any`: literal substrings, one of which must appear (after folding ASCII case, and ſ/K to s/k) for its patterns to be tried at all. It is only a speed-up, so every alternative of every pattern must contain one of them.",
3
+ "version": "2026.10.29-2",
4
+ "threshold": 0.5,
5
+ "maxScanChars": 200000,
6
+ "snippetChars": 48,
7
+ "maxSpans": 5,
8
+ "rules": [
9
+ {
10
+ "id": "override.ignore_previous",
11
+ "category": "override",
12
+ "description": "Tells the model to ignore, forget or override the instructions it was given.",
13
+ "weight": 0.8,
14
+ "decoded": true,
15
+ "any": [
16
+ "ignor",
17
+ "disregard",
18
+ "forget",
19
+ "overrid",
20
+ "bypass",
21
+ "neglect",
22
+ "follow"
23
+ ],
24
+ "patterns": [
25
+ "\\b(?:ignore|disregard|forget|override|bypass|neglect)\\s+(?:(?:all|any|every|each)\\s+(?:of\\s+)?(?:the\\s+|your\\s+|my\\s+|these\\s+|those\\s+)?|(?:your|my)\\s+)?(?:previous|prior|above|earlier|preceding|foregoing|original|initial|old|existing|system)\\s+(?:instructions?|prompts?|directions?|rules|guidelines|directives?|commands?|context|guidance|programming|constraints|restrictions)\\b",
26
+ "\\b(?:ignore|disregard|forget|override)\\s+(?:all\\s+of\\s+|all\\s+)?the\\s+(?:above|foregoing|preceding|system)\\s+(?:instructions?|prompts?|directions?|rules|guidelines|directives?|commands?|context|text|message)\\b",
27
+ "\\b(?:ignore|disregard|forget)\\s+(?:all\\s+of\\s+)?(?:the\\s+)?(?:above|everything\\s+(?:above|before|else))\\s+and\\s+(?:instead|now|just|only|say|print|output|respond|reply|write|translate|tell)\\b",
28
+ "\\b(?:ignore|disregard|forget)\\s+(?:all\\s+|any\\s+)?(?:your|the)\\s+(?:safety|content|ethical)\\s+(?:guidelines|rules|policies|filters|restrictions|training)\\b",
29
+ "\\b(?:ignore|disregard|forget|stop\\s+following|no\\s+longer\\s+follow|quit\\s+following)\\s+(?:all\\s+|any\\s+|every\\s+)?(?:of\\s+)?(?:the\\s+|your\\s+)?(?:rules|instructions|guidelines|directives)\\s+(?:you\\s+(?:were|have\\s+been)\\s+given|you\\s+received|given\\s+to\\s+you|you\\s+were\\s+told)\\b",
30
+ "\\b(?:ignore|disregard|forget)\\s+(?:all\\s+(?:of\\s+)?)?your\\s+(?:instructions|directives|programming)(?:\\s+(?:you\\s+(?:have\\s+|'ve\\s+)?(?:received|been\\s+given|got(?:ten)?)|so\\s+far|until\\s+now|up\\s+to\\s+now)\\b|\\s+and\\s|\\s*[.!;:]|\\s*$)",
31
+ "\\b(?:ignore|disregard|forget)\\s+all\\s+(?:of\\s+)?(?:the\\s+)?(?:instructions|directives)\\s+(?:you\\s+(?:have\\s+|'ve\\s+)?(?:received|been\\s+given|got(?:ten)?)|so\\s+far|until\\s+now|up\\s+to\\s+now|and\\s+(?:instead|now|just|only|say|print|output|respond|reply|write|tell|reveal|show))\\b",
32
+ "\\b(?:forget|disregard|ignore)\\s+everything\\s+(?:you\\s+(?:were|have\\s+been|'ve\\s+been)\\s+(?:told|taught|instructed|given))\\b"
33
+ ]
34
+ },
35
+ {
36
+ "id": "override.multilingual",
37
+ "category": "override",
38
+ "description": "The same instruction override, in other languages.",
39
+ "weight": 0.75,
40
+ "decoded": true,
41
+ "any": [
42
+ "ignor",
43
+ "vergiss",
44
+ "vergesst",
45
+ "vergessen",
46
+ "oubli",
47
+ "olvid",
48
+ "dimentic",
49
+ "esque",
50
+ "игнор",
51
+ "Игнор",
52
+ "ИГНОР",
53
+ "забуд",
54
+ "Забуд",
55
+ "ЗАБУД",
56
+ "忽略"
57
+ ],
58
+ "patterns": [
59
+ "\\bignor(?:a|e|ez|iere|ieren|ar)\\s+(?:todas\\s+|toutes\\s+|alle\\s+|tutte\\s+)?(?:las\\s+|les\\s+|die\\s+|le\\s+|deine\\s+|ihre\\s+|tes\\s+|vos\\s+|tus\\s+|sus\\s+)?(?:instrucciones|instructions|anweisungen|istruzioni|instru[cç][oõ]es)\\s+(?:anteriores|pr[ée]c[ée]dentes|vorherigen|precedenti|ci-dessus)",
60
+ "\\bignor(?:a|e|ez|iere|ieren|ar)\\s+(?:todas\\s+|toutes\\s+|alle\\s+|tutte\\s+)?(?:las\\s+|les\\s+|die\\s+|le\\s+|deine\\s+|ihre\\s+)?(?:anteriores|pr[ée]c[ée]dentes|vorherigen|bisherigen|obigen|vorigen|precedenti)\\s+(?:instrucciones|instructions|anweisungen|istruzioni)",
61
+ "\\b(?:vergiss|vergesst|vergessen\\s+sie|oublie[sz]?|olvida|olvide|olviden|dimentica|dimenticate|esque[cç]a)\\s+(?:todas\\s+|toutes\\s+|alle\\s+|tutte\\s+)?(?:las\\s+|les\\s+|die\\s+|le\\s+|as\\s+|deine\\s+|ihre\\s+|tes\\s+|vos\\s+|tus\\s+|sus\\s+)?(?:instrucciones|instructions|anweisungen|istruzioni|instru[cç][oõ]es)\\s+(?:anteriores|pr[ée]c[ée]dentes|vorherigen|bisherigen|precedenti|ci-dessus)",
62
+ "\\b(?:vergiss|vergesst|vergessen\\s+sie)\\s+(?:alle\\s+)?(?:die\\s+|deine\\s+|ihre\\s+)?(?:vorherigen|bisherigen|obigen|vorangegangenen|vorigen)\\s+(?:anweisungen|instruktionen|befehle|regeln)",
63
+ "(?:игнорируй|игнорируйте|забудь|забудьте)\\s+(?:все\\s+)?(?:предыдущие|прошлые|прежние)\\s+(?:инструкции|указания|команды)",
64
+ "忽略(?:之前|以上|上面|先前|前面|所有)(?:的)?(?:所有)?(?:的)?(?:指令|指示|说明|规则|提示)"
65
+ ]
66
+ },
67
+ {
68
+ "id": "override.reveal_system_prompt",
69
+ "category": "override",
70
+ "description": "Asks the model to disclose its system prompt or hidden instructions.",
71
+ "weight": 0.6,
72
+ "decoded": true,
73
+ "any": [
74
+ "your",
75
+ "above"
76
+ ],
77
+ "patterns": [
78
+ "\\b(?:reveal|show|print|output|display|repeat|leak|dump|disclose|expose|recite|give\\s+me|tell\\s+me|share|write\\s+out)\\s+(?:me\\s+)?your\\s+(?:(?:entire|full|complete|exact|original|hidden|secret|initial|internal)\\s+)*(?:system\\s+prompt|system\\s+message|system\\s+instructions|initial\\s+(?:prompt|instructions)|hidden\\s+(?:prompt|instructions)|developer\\s+(?:prompt|message|instructions)|pre-?prompt|instructions\\s+verbatim)\\b",
79
+ "\\brepeat\\s+(?:all\\s+of\\s+|everything\\s+in\\s+|the\\s+)?(?:words|text|content|instructions)\\s+above\\b[^\\n]{0,60}\\b(?:verbatim|starting\\s+with|beginning\\s+with|word\\s+for\\s+word)",
80
+ "\\bwhat\\s+(?:are|were)\\s+your\\s+(?:system|initial|original|hidden)\\s+(?:instructions|prompt)\\b"
81
+ ]
82
+ },
83
+ {
84
+ "id": "override.new_instructions",
85
+ "category": "override",
86
+ "description": "Announces replacement instructions or a system-prompt update.",
87
+ "weight": 0.4,
88
+ "decoded": true,
89
+ "any": [
90
+ "instruction",
91
+ "directive"
92
+ ],
93
+ "patterns": [
94
+ "\\b(?:new|updated|revised|real|actual|true|secret|hidden)\\s+(?:system\\s+)?(?:instructions?|directives?)\\s*:"
95
+ ]
96
+ },
97
+ {
98
+ "id": "override.system_override",
99
+ "category": "override",
100
+ "description": "Claims to update the system prompt or to outrank earlier instructions.",
101
+ "weight": 0.55,
102
+ "decoded": true,
103
+ "any": [
104
+ "overrid",
105
+ "update",
106
+ "injection",
107
+ "priority",
108
+ "precedence",
109
+ "supersede"
110
+ ],
111
+ "patterns": [
112
+ "\\b(?:system|developer)\\s+(?:prompt|message|instructions?)\\s+(?:override|update|injection)\\b",
113
+ "\\b(?:these|the\\s+following|this\\s+server'?s?)\\s+(?:instructions?|rules)\\s+(?:take|takes|have|has)\\s+(?:priority|precedence)\\s+over\\b",
114
+ "\\b(?:rules|instructions)\\s+supersede\\s+(?:all\\s+)?(?:previous|prior|other|any)\\s+(?:instructions|rules|guidelines)\\b",
115
+ "\\bsupersedes?\\s+(?:all\\s+)?(?:previous|prior|other|any)\\s+(?:instructions|rules|guidelines)\\b"
116
+ ]
117
+ },
118
+ {
119
+ "id": "override.persona_reset",
120
+ "category": "override",
121
+ "description": "Reassigns the model's identity or purpose from now on.",
122
+ "weight": 0.45,
123
+ "decoded": true,
124
+ "any": [
125
+ "now"
126
+ ],
127
+ "patterns": [
128
+ "\\bfrom\\s+now\\s+on,?\\s+(?:you\\s+(?:are|will\\s+(?:act|be|pretend|play|roleplay)|must\\s+(?:act|pretend|be))|your\\s+new\\s+(?:name|role|identity|persona|purpose))\\b"
129
+ ]
130
+ },
131
+ {
132
+ "id": "override.new_task",
133
+ "category": "override",
134
+ "description": "Hands the model a new task or objective. Weak alone: people assign tasks too.",
135
+ "weight": 0.35,
136
+ "decoded": true,
137
+ "any": [
138
+ "your"
139
+ ],
140
+ "patterns": [
141
+ "\\byour\\s+(?:new|only|sole|real)\\s+(?:task|job|objective|goal|purpose|mission)\\s+(?:now\\s+)?(?:is|will\\s+be)\\s+to\\b"
142
+ ]
143
+ },
144
+ {
145
+ "id": "indirect.ignore_user",
146
+ "category": "indirect",
147
+ "description": "Content that tells the model to disregard what its user asked.",
148
+ "weight": 0.5,
149
+ "decoded": true,
150
+ "any": [
151
+ "ignor",
152
+ "disregard",
153
+ "forget"
154
+ ],
155
+ "patterns": [
156
+ "\\b(?:ignore|disregard|forget)\\s+(?:the\\s+)?(?:user|human|developer|sender|requester)'?s?\\s+(?:question|request|instructions?|query|input|message|prompt|task)s?\\b"
157
+ ]
158
+ },
159
+ {
160
+ "id": "indirect.persistence",
161
+ "category": "indirect",
162
+ "description": "Tells an agent to plant something that survives the session: shell profiles, cron, SSH keys.",
163
+ "weight": 0.5,
164
+ "weights": {
165
+ "prompt": 0.2
166
+ },
167
+ "decoded": true,
168
+ "any": [
169
+ "bashrc",
170
+ "zshrc",
171
+ "profile",
172
+ "crontab",
173
+ "authorized_keys",
174
+ "/etc/hosts"
175
+ ],
176
+ "patterns": [
177
+ "\\b(?:add|append|write|insert|put)\\s+(?:the\\s+following|this|these)\\s+(?:lines?|commands?|entry|entries|key)\\s+(?:to|into|in)\\s+(?:your\\s+|the\\s+)?(?:~/\\.(?:bashrc|zshrc|profile|bash_profile)|\\.(?:bashrc|zshrc|profile|bash_profile)\\b|crontab|authorized_keys|~/\\.ssh/authorized_keys|/etc/hosts)"
178
+ ]
179
+ },
180
+ {
181
+ "id": "roleplay.dan",
182
+ "category": "roleplay",
183
+ "description": "Named jailbreak personas (DAN and its variants).",
184
+ "weight": 0.8,
185
+ "decoded": true,
186
+ "any": [
187
+ "dan",
188
+ "stan",
189
+ "dude",
190
+ "anything",
191
+ "jailbreak",
192
+ "classic"
193
+ ],
194
+ "patterns": [
195
+ "\\b(?:dan|stan|dude|anti-?dan|better-?dan)\\s+(?:mode|prompt|jailbreak)\\b",
196
+ "\\bdo\\s+anything\\s+now\\b",
197
+ "\\[(?:🔓\\s*jailbreak|🔒\\s*classic|jailbreak|classic)\\]"
198
+ ],
199
+ "weights": {
200
+ "file": 0.3
201
+ }
202
+ },
203
+ {
204
+ "id": "roleplay.unrestricted_mode",
205
+ "category": "roleplay",
206
+ "description": "Switches the model into an unrestricted or jailbroken mode.",
207
+ "weight": 0.7,
208
+ "decoded": true,
209
+ "any": [
210
+ "mode"
211
+ ],
212
+ "patterns": [
213
+ "\\b(?:god|jailbreak|jailbroken|unrestricted|unfiltered|uncensored|evil|chaos|anarchy|opposite)\\s+mode\\s+(?:enabled|activated|on|output|response)\\b",
214
+ "\\b(?:enable|activate|enter|simulate|switch\\s+to|you\\s+are\\s+(?:now\\s+)?in)\\s+(?:the\\s+)?(?:god|jailbreak|jailbroken|unrestricted|unfiltered|uncensored|evil|chaos|anarchy)\\s+mode\\b",
215
+ "\\b(?:simulate|act\\s+in|you\\s+are\\s+(?:now\\s+)?in)\\s+(?:the\\s+)?developer\\s+mode\\b",
216
+ "\\bdeveloper\\s+mode\\s+output\\b"
217
+ ]
218
+ },
219
+ {
220
+ "id": "roleplay.unrestricted_persona",
221
+ "category": "roleplay",
222
+ "description": "Asks the model to become an unrestricted, amoral or evil character.",
223
+ "weight": 0.7,
224
+ "decoded": true,
225
+ "any": [
226
+ "unrestrict",
227
+ "unfilter",
228
+ "uncensor",
229
+ "unalign",
230
+ "unbound",
231
+ "unchain",
232
+ "amoral",
233
+ "immoral",
234
+ "unethical",
235
+ "evil",
236
+ "jailbr",
237
+ "rogue",
238
+ "lawless",
239
+ "limitless"
240
+ ],
241
+ "patterns": [
242
+ "\\b(?:you\\s+are\\s+(?:now\\s+)?|act\\s+as\\s+|pretend\\s+(?:to\\s+be|you\\s+are)\\s+|role-?play\\s+as\\s+|behave\\s+like\\s+|become\\s+)(?:an?\\s+)?(?:unrestricted|unfiltered|uncensored|unaligned|unbound|unchained|amoral|immoral|unethical|evil|jailbroken|rogue|lawless|limitless)\\b"
243
+ ]
244
+ },
245
+ {
246
+ "id": "roleplay.no_restrictions",
247
+ "category": "roleplay",
248
+ "description": "Claims the model is no longer bound by its policies or safety rules.",
249
+ "weight": 0.6,
250
+ "decoded": true,
251
+ "any": [
252
+ "bound",
253
+ "restrict",
254
+ "limit",
255
+ "constrain",
256
+ "ethic",
257
+ "moral",
258
+ "safety",
259
+ "content",
260
+ "free",
261
+ "filter",
262
+ "rules",
263
+ "guideline"
264
+ ],
265
+ "patterns": [
266
+ "\\b(?:not|no\\s+longer)\\s+(?:bound|restricted|limited|constrained)\\s+by\\s+(?:any\\s+)?(?:openai|anthropic|google|content|safety|ethical|moral|your)\\s+(?:polic(?:y|ies)|rules|guidelines|restrictions|filters|programming|principles)\\b",
267
+ "\\b(?:without|with\\s+no|free\\s+(?:of|from))\\s+(?:any\\s+)?(?:ethical|moral|safety|content)\\s+(?:restrictions|filters|guidelines|limitations|constraints|policies|safeguards)\\b",
268
+ "\\b(?:has|have)\\s+(?:been\\s+)?(?:freed|broken\\s+free)\\s+(?:from|of)\\s+(?:the\\s+)?(?:typical\\s+)?(?:confines|restrictions|limits)\\s+of\\s+(?:ai|openai)\\b",
269
+ "\\b(?:ai|assistant|model|chatbot|bot)\\s+(?:that|which|who)\\s+(?:has|have)\\s+no\\s+(?:restrictions|filters|limits|rules|guidelines|morals|ethics)\\b"
270
+ ]
271
+ },
272
+ {
273
+ "id": "roleplay.token_game",
274
+ "category": "roleplay",
275
+ "description": "The token-penalty game jailbreaks use to keep a persona going.",
276
+ "weight": 0.5,
277
+ "decoded": true,
278
+ "any": [
279
+ "token"
280
+ ],
281
+ "patterns": [
282
+ "\\byou\\s+(?:have|will\\s+lose|start\\s+with)\\s+\\d+\\s+tokens\\b",
283
+ "\\btokens?\\s+will\\s+be\\s+deducted\\b"
284
+ ]
285
+ },
286
+ {
287
+ "id": "roleplay.fiction_bypass",
288
+ "category": "roleplay",
289
+ "description": "Fiction or hypothetical framing used to lift restrictions, and the grandma exploit.",
290
+ "weight": 0.4,
291
+ "decoded": true,
292
+ "any": [
293
+ "hypothetical",
294
+ "fiction",
295
+ "novel",
296
+ "story",
297
+ "movie",
298
+ "screenplay",
299
+ "grand",
300
+ "character"
301
+ ],
302
+ "patterns": [
303
+ "\\b(?:hypothetically|in\\s+a\\s+fictional\\s+world|for\\s+a\\s+(?:novel|story|movie|screenplay))\\b[^\\n]{0,80}\\b(?:no|without)\\s+(?:rules|restrictions|limits|filters|guidelines)\\b",
304
+ "\\b(?:deceased|late|dead)\\s+grand(?:ma|mother|pa|father)\\s+(?:who\\s+)?used\\s+to\\s+(?:tell|read|recite|say|explain)\\b",
305
+ "\\bstay\\s+in\\s+character\\b[^\\n]{0,80}\\b(?:no\\s+matter|whatever|always|never\\s+break)\\b"
306
+ ]
307
+ },
308
+ {
309
+ "id": "roleplay.grandma",
310
+ "category": "roleplay",
311
+ "description": "The grandma exploit: asking the model to play a relative who recited forbidden content.",
312
+ "weight": 0.6,
313
+ "decoded": true,
314
+ "any": [
315
+ "grand"
316
+ ],
317
+ "patterns": [
318
+ "\\b(?:act|acting|pretend|role-?play|play)\\s+(?:as|to\\s+be)\\s+my\\s+(?:deceased|late|dead)\\s+grand(?:ma|mother|pa|father)\\b"
319
+ ]
320
+ },
321
+ {
322
+ "id": "roleplay.bypass_safety",
323
+ "category": "roleplay",
324
+ "description": "Asks how a model would get around its own safety controls.",
325
+ "weight": 0.45,
326
+ "decoded": true,
327
+ "any": [
328
+ "bypass"
329
+ ],
330
+ "patterns": [
331
+ "\\bbypass\\s+(?:its|your|the\\s+model'?s|the\\s+ai'?s)\\s+(?:own\\s+)?(?:content\\s+filters?|safety\\s+(?:filters?|guidelines|training|rules)|guardrails|restrictions)\\b"
332
+ ]
333
+ },
334
+ {
335
+ "id": "roleplay.jailbreak_word",
336
+ "category": "roleplay",
337
+ "description": "The word jailbreak. Weak on its own: phones are jailbroken too.",
338
+ "weight": 0.3,
339
+ "decoded": true,
340
+ "any": [
341
+ "jailbr"
342
+ ],
343
+ "patterns": [
344
+ "\\bjailbr(?:eak|oken|eaking)\\b"
345
+ ],
346
+ "weights": {
347
+ "file": 0.1
348
+ }
349
+ },
350
+ {
351
+ "id": "jailbreak.refusal_suppression",
352
+ "category": "jailbreak",
353
+ "description": "Forbids the model from refusing, apologising or warning: the refusal-suppression half of most jailbreaks.",
354
+ "weight": 0.4,
355
+ "decoded": true,
356
+ "any": [
357
+ "refus",
358
+ "apolog",
359
+ "disclaim",
360
+ "warning",
361
+ "can't",
362
+ "cannot",
363
+ "unable",
364
+ "declin",
365
+ "caveat"
366
+ ],
367
+ "patterns": [
368
+ "\\b(?:never|do\\s+not|don't|must\\s+not|you\\s+(?:can|will)\\s*not|you\\s+won't)\\s+(?:ever\\s+)?(?:refuse|decline|apologi[sz]e|say\\s+(?:that\\s+)?(?:you\\s+)?(?:can't|cannot|are\\s+unable))\\b",
369
+ "\\b(?:without|with\\s+no|(?:never|do\\s+not|don't)\\s+(?:add|include|give))\\s+(?:any\\s+)?(?:warnings?|disclaimers?|caveats?|refusals?)\\s+(?:or|and|,)\\s*(?:any\\s+)?(?:warnings?|disclaimers?|caveats?|refusals?|moral(?:izing|ising)?|lectures?)\\b"
370
+ ]
371
+ },
372
+ {
373
+ "id": "jailbreak.prefix_injection",
374
+ "category": "jailbreak",
375
+ "description": "Dictates an affirmative opening (\"Sure, here is\") so the model talks itself past a refusal.",
376
+ "weight": 0.5,
377
+ "decoded": true,
378
+ "any": [
379
+ "start",
380
+ "begin"
381
+ ],
382
+ "patterns": [
383
+ "\\b(?:start|begin)\\s+(?:your|each|every)\\s+(?:response|reply|answer|output)s?\\s+with\\s+[\"'“]?(?:sure|absolutely|certainly|of\\s+course|yes)\\b[^\\n]{0,40}\\b(?:here\\s+is|here's|i\\s+can|i\\s+will)\\b"
384
+ ]
385
+ },
386
+ {
387
+ "id": "jailbreak.dual_response",
388
+ "category": "jailbreak",
389
+ "description": "Asks for two answers, a normal one and an unfiltered one.",
390
+ "weight": 0.6,
391
+ "decoded": true,
392
+ "any": [
393
+ "respon",
394
+ "answer",
395
+ "repl",
396
+ "output"
397
+ ],
398
+ "patterns": [
399
+ "\\b(?:two|2|both)\\s+(?:different\\s+|separate\\s+)?(?:responses|answers|replies|outputs)\\b[^\\n]{0,120}\\b(?:unfiltered|uncensored|jailbroken|unrestricted|without\\s+(?:any\\s+)?(?:filters?|restrictions|rules))\\b"
400
+ ]
401
+ },
402
+ {
403
+ "id": "jailbreak.named_persona",
404
+ "category": "jailbreak",
405
+ "description": "Named jailbreak characters beyond DAN (AIM, Mongo Tom, evil confidant, BetterDAN and similar).",
406
+ "weight": 0.7,
407
+ "decoded": true,
408
+ "any": [
409
+ "machiavel",
410
+ "mongo",
411
+ "confidant",
412
+ "aim",
413
+ "betterdan",
414
+ "apophis",
415
+ "maximum",
416
+ "omega",
417
+ "apophis"
418
+ ],
419
+ "patterns": [
420
+ "\\balways\\s+intelligent\\s+and\\s+machiavellian\\b",
421
+ "\\bmongo\\s+tom\\b",
422
+ "\\bevil\\s+(?:trusted\\s+)?confidant\\b",
423
+ "\\b(?:act|you\\s+are|play|become)\\s+(?:as\\s+)?(?:aim|apophis|betterdan|omega|maximum)\\b[^\\n]{0,80}\\b(?:unfiltered|amoral|no\\s+(?:ethical|moral)|without\\s+(?:any\\s+)?(?:restrictions|filters))\\b"
424
+ ]
425
+ },
426
+ {
427
+ "id": "jailbreak.payload_splitting",
428
+ "category": "jailbreak",
429
+ "description": "Splits a forbidden request into pieces and asks the model to join them and act on the result.",
430
+ "weight": 0.55,
431
+ "decoded": true,
432
+ "any": [
433
+ "concaten",
434
+ "combin",
435
+ "join",
436
+ "string",
437
+ "variable",
438
+ "merge"
439
+ ],
440
+ "patterns": [
441
+ "\\b(?:concatenate|combine|join|merge)\\s+(?:the\\s+)?(?:strings?|variables?|parts|pieces|words)\\b[^\\n]{0,80}\\b(?:then|and)\\s+(?:answer|respond\\s+to|follow|execute|carry\\s+out|do\\s+what)\\b"
442
+ ]
443
+ },
444
+ {
445
+ "id": "jailbreak.authority_claim",
446
+ "category": "jailbreak",
447
+ "description": "Claims to be the model's developer or vendor to unlock restricted behaviour.",
448
+ "weight": 0.55,
449
+ "decoded": true,
450
+ "any": [
451
+ "develop",
452
+ "creator",
453
+ "openai",
454
+ "anthropic",
455
+ "admin",
456
+ "engineer"
457
+ ],
458
+ "patterns": [
459
+ "\\b(?:i\\s+am|i'm)\\s+(?:your|an?|the)\\s+(?:developer|creator|openai|anthropic|admin(?:istrator)?|system\\s+engineer)\\b[^\\n]{0,80}\\b(?:override|unlock|disable|lift|remove|bypass|authori[sz](?:e|ed|ing))\\b[^\\n]{0,40}\\b(?:restrictions|filters|safety|rules|guardrails|guidelines)\\b"
460
+ ]
461
+ },
462
+ {
463
+ "id": "delimiter.chat_template",
464
+ "category": "delimiter",
465
+ "description": "Chat-template control tokens that fake a new system or assistant turn.",
466
+ "weight": 0.6,
467
+ "weights": {
468
+ "file": 0.15
469
+ },
470
+ "decoded": true,
471
+ "any": [
472
+ "<|",
473
+ "inst]",
474
+ "<<sys>>",
475
+ "<</sys>>"
476
+ ],
477
+ "patterns": [
478
+ "<\\|(?:im_start|im_end|system|user|assistant|endoftext|start_header_id|end_header_id|eot_id|begin_of_text)\\|>",
479
+ "\\[/?INST\\]",
480
+ "<</?SYS>>"
481
+ ]
482
+ },
483
+ {
484
+ "id": "delimiter.fake_system_block",
485
+ "category": "delimiter",
486
+ "description": "Text dressed up as a system message or the end of the user's data.",
487
+ "weight": 0.45,
488
+ "weights": {
489
+ "file": 0.15
490
+ },
491
+ "decoded": true,
492
+ "any": [
493
+ "system",
494
+ "instruction",
495
+ "task"
496
+ ],
497
+ "patterns": [
498
+ "</?system(?:_prompt|-prompt|_message|-message)?>",
499
+ "(?:^|\\n)\\s*(?:#{2,}|\\[|\\*\\*)\\s*system\\s*(?:message|prompt|override|instructions?)?\\s*(?:\\]|:|\\*\\*)\\s*(?:you|ignore|disregard|new|the\\s+assistant|from\\s+now)",
500
+ "\\bend\\s+of\\s+(?:the\\s+)?(?:document|context|user\\s+input|data|file|email|text|conversation)\\b[^\\n]{0,40}\\b(?:new|next|begin|start|following)\\s+(?:instructions?|task|system)\\b"
501
+ ]
502
+ },
503
+ {
504
+ "id": "delimiter.memory_frame",
505
+ "category": "delimiter",
506
+ "description": "Opens or closes the tags Shield360 fences delivered memory with, to break out of the reference-only frame.",
507
+ "weight": 0.6,
508
+ "weights": {
509
+ "file": 0.15
510
+ },
511
+ "decoded": true,
512
+ "any": [
513
+ "memory"
514
+ ],
515
+ "patterns": [
516
+ "</?\\s*(?:shield360-)?memory(?:\\s[^<>\\n]{0,120})?\\s*/?>"
517
+ ]
518
+ },
519
+ {
520
+ "id": "indirect.addressing_ai",
521
+ "category": "indirect",
522
+ "description": "Content that speaks to an AI reading it rather than to a person.",
523
+ "weight": 0.45,
524
+ "weights": {
525
+ "prompt": 0.2
526
+ },
527
+ "any": [
528
+ "you",
529
+ "note",
530
+ "message",
531
+ "instruction",
532
+ "attention",
533
+ "important",
534
+ "reading",
535
+ "processing",
536
+ "summari",
537
+ "parsing",
538
+ "reviewing",
539
+ "browsing",
540
+ "scraping"
541
+ ],
542
+ "patterns": [
543
+ "\\bif\\s+you\\s+are\\s+(?:an?\\s+)?(?:ai|llm|large\\s+language\\s+model|language\\s+model|chatbot|automated\\s+(?:agent|assistant|system)|ai(?:\\s+(?:coding|code|browsing|research|email|support|writing))?\\s+(?:assistant|agent|model|system|tool))\\s*(?:[,.;:!]|reading|processing|summari[sz]ing|parsing|reviewing|browsing|scraping|and\\s+you)",
544
+ "\\b(?:note|message|instructions?|attention|important)\\s+(?:to|for)\\s+(?:the\\s+|any\\s+|all\\s+)?(?:ai|llm|language\\s+model|ai\\s+(?:assistant|agent|model)|chatbot|chatgpt|claude|copilot|gemini|gpt)s?\\s*[:,.!-]",
545
+ "\\b(?:ai|llm|language\\s+model)s?\\s+(?:agents?\\s+|assistants?\\s+|models?\\s+)?(?:reading|processing|summari[sz]ing|parsing|browsing)\\s+this\\b[^\\n]{0,60}\\b(?:must|should|need\\s+to|are\\s+(?:required|instructed))\\b",
546
+ "\\b(?:to|for)\\s+(?:any|all|the)\\s+(?:ai|llm|language\\s+model)\\s*(?:assistants?|agents?|models?|tools?|systems?)?\\s+(?:reading|processing|summari[sz]ing|parsing|reviewing|browsing|scraping)\\b"
547
+ ]
548
+ },
549
+ {
550
+ "id": "indirect.conceal_from_user",
551
+ "category": "indirect",
552
+ "description": "Asks the model to hide what it is doing from the person it works for.",
553
+ "weight": 0.55,
554
+ "weights": {
555
+ "file": 0.25,
556
+ "tool_description": 0.7
557
+ },
558
+ "decoded": true,
559
+ "any": [
560
+ "user",
561
+ "human",
562
+ "developer",
563
+ "operator"
564
+ ],
565
+ "patterns": [
566
+ "\\b(?:do\\s+not|don't|never|without)\\s+(?:tell(?:ing)?|inform(?:ing)?|mention(?:ing)?|notify(?:ing)?|alert(?:ing)?|warn(?:ing)?|let(?:ting)?)\\s+(?:the\\s+)?(?:user|human|developer|operator)\\b[^\\n]{0,40}\\b(?:about|that|know|this|what|you)\\b",
567
+ "\\b(?:do\\s+not|don't|never)\\s+(?:reveal|disclose|show|mention)\\s+(?:this|these)\\s+(?:instructions?|message|note|step)\\s+to\\s+(?:the\\s+)?(?:user|human)\\b",
568
+ "\\b(?:hide|conceal)\\s+(?:this|these\\s+(?:steps|actions)|it)\\s+from\\s+(?:the\\s+)?(?:user|human)\\b"
569
+ ]
570
+ },
571
+ {
572
+ "id": "exfil.markdown_image_template",
573
+ "category": "exfil",
574
+ "description": "A markdown or HTML image whose URL carries a placeholder for data to be filled in and sent.",
575
+ "weight": 0.8,
576
+ "decoded": true,
577
+ "any": [
578
+ "http"
579
+ ],
580
+ "patterns": [
581
+ "!\\[[^\\]\\n]{0,200}\\]\\(\\s*<?https?://[^\\s)>]+(?:[?&/=](?:\\{\\{?|\\$\\{?|%7b|<|\\[)[a-z_ ]{0,40}(?:data|secret|key|token|password|history|conversation|chat|summary|message|info|content|prompt|email|query|user|input))",
582
+ "<img\\s[^>]{0,200}?src\\s*=\\s*[\"']?https?://[^\\s\"'>]+(?:[?&/=](?:\\{\\{?|\\$\\{?|%7b|<|\\[)[a-z_ ]{0,40}(?:data|secret|key|token|password|history|conversation|chat|summary|message|info|content|prompt|email|query|user|input))"
583
+ ]
584
+ },
585
+ {
586
+ "id": "exfil.markdown_image_data",
587
+ "category": "exfil",
588
+ "description": "A markdown image whose URL query carries a long encoded value (a beacon).",
589
+ "weight": 0.35,
590
+ "any": [
591
+ "!["
592
+ ],
593
+ "patterns": [
594
+ "!\\[[^\\]\\n]{0,200}\\]\\(\\s*<?https?://[^\\s)>]+[?&][a-z0-9_.-]{1,32}=[a-z0-9+/%_=-]{40,}"
595
+ ]
596
+ },
597
+ {
598
+ "id": "exfil.embed_data_in_url",
599
+ "category": "exfil",
600
+ "description": "Instructs the model to put conversation or personal data into a URL, link or image.",
601
+ "weight": 0.6,
602
+ "decoded": true,
603
+ "any": [
604
+ "url",
605
+ "link",
606
+ "query",
607
+ "image",
608
+ "markdown"
609
+ ],
610
+ "patterns": [
611
+ "\\b(?:append|add|include|insert|put|embed|encode|attach|replace)\\b[^\\n]{0,60}\\b(?:the\\s+)?(?:conversation|chat\\s+history|previous\\s+messages|user'?s?\\s+(?:messages|data|question|answers?|name)|system\\s+prompt|personal\\s+(?:data|information)|email\\s+address(?:es)?|summary\\s+of\\s+(?:the|this|our)\\s+(?:conversation|chat))\\b[^\\n]{0,60}\\b(?:to|in|into|as)\\s+(?:the\\s+|a\\s+|this\\s+)?(?:url|link|query\\s+(?:string|param(?:eter)?)|image(?:\\s+url)?|markdown\\s+(?:image|link))\\b"
612
+ ]
613
+ },
614
+ {
615
+ "id": "exfil.embed_secret_in_url",
616
+ "category": "exfil",
617
+ "description": "Instructs the model to put a secret into a URL. Weak alone: API docs say this too.",
618
+ "weight": 0.4,
619
+ "decoded": true,
620
+ "any": [
621
+ "url",
622
+ "link",
623
+ "query",
624
+ "image",
625
+ "markdown"
626
+ ],
627
+ "patterns": [
628
+ "\\b(?:append|add|include|insert|put|embed|encode|attach)\\b[^\\n]{0,60}\\b(?:the\\s+|your\\s+|all\\s+)?(?:secrets?|api\\s+keys?|passwords?|credentials|access\\s+tokens?|env(?:ironment)?\\s+variables|ssh\\s+keys?|private\\s+keys?)\\b[^\\n]{0,60}\\b(?:to|in|into|as)\\s+(?:the\\s+|a\\s+|this\\s+)?(?:url|link|query\\s+(?:string|param(?:eter)?)|image(?:\\s+url)?|markdown\\s+(?:image|link))\\b"
629
+ ]
630
+ },
631
+ {
632
+ "id": "exfil.send_secrets",
633
+ "category": "exfil",
634
+ "description": "Instructs the model to send secrets or conversation data somewhere.",
635
+ "weight": 0.6,
636
+ "decoded": true,
637
+ "any": [
638
+ "send",
639
+ "post",
640
+ "upload",
641
+ "transmit",
642
+ "forward",
643
+ "email",
644
+ "submit",
645
+ "exfiltrat",
646
+ "smuggle",
647
+ "leak"
648
+ ],
649
+ "patterns": [
650
+ "\\b(?:send|post|upload|transmit|forward|email|submit)\\b[^\\n]{0,40}\\b(?:the\\s+|your\\s+|all\\s+|any\\s+)?(?:contents?\\s+of\\s+)?(?:~/\\.ssh|id_rsa|id_ed25519|\\.aws/credentials|secret\\s+keys?|private\\s+keys?|ssh\\s+keys?|session\\s+cookies?|environment\\s+variables|system\\s+prompt|conversation\\s+history|chat\\s+history|all\\s+(?:the\\s+)?(?:api\\s+keys|credentials|passwords|secrets))\\b[^\\n]{0,60}\\b(?:to|at|into)\\s+(?:https?://|the\\s+following\\s+(?:url|address|endpoint|email|webhook)|this\\s+(?:url|address|webhook|endpoint))",
651
+ "\\b(?:exfiltrate|smuggle\\s+out|leak)\\s+(?:the\\s+|all\\s+|any\\s+|your\\s+)?(?:data|secrets?|credentials|keys|tokens|passwords|files|conversation|system\\s+prompt|environment|contents)\\b"
652
+ ]
653
+ },
654
+ {
655
+ "id": "exfil.forward_messages",
656
+ "category": "exfil",
657
+ "description": "Orders every message or conversation copied to someone. Weak alone: mail forwarding is ordinary.",
658
+ "weight": 0.35,
659
+ "decoded": true,
660
+ "any": [
661
+ "forward",
662
+ "send",
663
+ "copy",
664
+ "cc",
665
+ "email"
666
+ ],
667
+ "patterns": [
668
+ "\\b(?:forward|send|copy|cc|bcc|email)\\s+(?:every|all|each|any)\\s+(?:messages?|emails?|conversations?|chats?|replies|responses)\\b[^\\n]{0,40}\\bto\\b"
669
+ ]
670
+ },
671
+ {
672
+ "id": "exfil.read_secret_files",
673
+ "category": "exfil",
674
+ "description": "Content that tells an agent to read credential files.",
675
+ "weight": 0.5,
676
+ "sources": [
677
+ "tool_result",
678
+ "tool_description",
679
+ "context",
680
+ "document",
681
+ "file"
682
+ ],
683
+ "weights": {
684
+ "tool_description": 0.75
685
+ },
686
+ "decoded": true,
687
+ "any": [
688
+ "ssh",
689
+ "id_rsa",
690
+ "id_ed25519",
691
+ "aws/credentials",
692
+ "mcp.json",
693
+ "/etc/passwd",
694
+ "/etc/shadow",
695
+ "git-credentials",
696
+ ".netrc",
697
+ ".npmrc",
698
+ "keychain"
699
+ ],
700
+ "patterns": [
701
+ "\\b(?:read|cat|open|print|dump|output|copy|load|get|fetch|access|include)\\b[^\\n]{0,40}(?:~/\\.ssh/|\\bid_rsa\\b|\\bid_ed25519\\b|\\.aws/credentials|/\\.cursor/mcp\\.json|\\bmcp\\.json\\b|/etc/passwd|/etc/shadow|\\.git-credentials|\\.netrc\\b|\\.npmrc\\b|login\\s+keychain)"
702
+ ]
703
+ },
704
+ {
705
+ "id": "exfil.shell_beacon",
706
+ "category": "exfil",
707
+ "description": "A shell command that ships a secret file or secret variable to a URL.",
708
+ "weight": 0.65,
709
+ "decoded": true,
710
+ "any": [
711
+ "curl",
712
+ "wget",
713
+ "invoke-webrequest",
714
+ "iwr",
715
+ "nc",
716
+ "http",
717
+ "$("
718
+ ],
719
+ "patterns": [
720
+ "\\b(?:curl|wget|invoke-webrequest|iwr|nc|ncat|http|httpie)\\b[^\\n]{0,120}(?:-d\\s*@|--data(?:-binary|-raw|-urlencode)?[=\\s]\\s*@|-f\\s*[a-z_]*=@|--upload-file[=\\s]|-t\\s|--post-file[=\\s]|--body-file[=\\s]|-infile\\s)[^\\n]{0,40}(?:~|\\$home|\\.ssh|\\.env\\b|\\.aws|credentials|id_rsa|/etc/)",
721
+ "https?://[^\\s\"'<>]*(?:\\$\\((?:cat|env|printenv|base64|whoami|hostname|history)\\b|\\$\\{?[a-z_]*(?:key|token|secret|password|passwd|cred|auth)[a-z_]*\\}?)",
722
+ "\\$\\((?:cat|base64)[^)\\n]{0,80}(?:\\.ssh|\\.env\\b|\\.aws|credentials|id_rsa)[^)\\n]{0,40}\\)[^\\n]{0,40}https?://"
723
+ ]
724
+ },
725
+ {
726
+ "id": "exfil.sink_domain",
727
+ "category": "exfil",
728
+ "description": "A request-capture or tunnelling service, the usual place exfiltrated data is sent.",
729
+ "weight": 0.2,
730
+ "weights": {
731
+ "tool_args": 0.6
732
+ },
733
+ "any": [
734
+ "webhook.site",
735
+ "requestbin",
736
+ "pipedream",
737
+ "ngrok",
738
+ "burpcollaborator",
739
+ "oastify",
740
+ "interact.sh",
741
+ "oast.",
742
+ "canarytokens",
743
+ "requestcatcher",
744
+ "beeceptor",
745
+ "hookbin",
746
+ "postb.in",
747
+ "ptsv2",
748
+ "dnslog",
749
+ "ceye.io",
750
+ "trycloudflare",
751
+ "serveo",
752
+ "localhost.run"
753
+ ],
754
+ "patterns": [
755
+ "\\b(?:[a-z0-9-]+\\.)*(?:webhook\\.site|requestbin\\.(?:com|net)|pipedream\\.net|ngrok(?:-free)?\\.(?:io|app|dev)|burpcollaborator\\.net|oastify\\.com|interact\\.sh|oast\\.(?:pro|live|site|online|fun|me)|canarytokens\\.com|requestcatcher\\.com|beeceptor\\.com|hookbin\\.com|postb\\.in|ptsv2\\.com|dnslog\\.cn|ceye\\.io|trycloudflare\\.com|serveo\\.net|localhost\\.run)\\b"
756
+ ]
757
+ },
758
+ {
759
+ "id": "exfil.url_with_secret",
760
+ "category": "exfil",
761
+ "description": "A URL that carries an API key or access token in it.",
762
+ "weight": 0.6,
763
+ "any": [
764
+ "http"
765
+ ],
766
+ "patterns": [
767
+ "https?://[^\\s\"'<>]*[?&/=](?:sk-(?:proj-|ant-)?[a-z0-9_-]{20,}|gh[opsu]_[a-z0-9]{30,}|akia[0-9a-z]{16}|xox[abp]-[a-z0-9-]{10,}|github_pat_[a-z0-9_]{22,})"
768
+ ]
769
+ },
770
+ {
771
+ "id": "exfil.url_long_data",
772
+ "category": "exfil",
773
+ "description": "A tool argument URL whose query carries a long encoded value.",
774
+ "weight": 0.35,
775
+ "sources": [
776
+ "tool_args"
777
+ ],
778
+ "any": [
779
+ "http"
780
+ ],
781
+ "patterns": [
782
+ "https?://[^\\s\"'<>]+[?&][a-z0-9_.-]{1,32}=[a-z0-9+/%_=-]{64,}"
783
+ ]
784
+ },
785
+ {
786
+ "id": "hidden.html_comment",
787
+ "category": "hidden",
788
+ "description": "An HTML comment that addresses an AI with instructions.",
789
+ "weight": 0.55,
790
+ "weights": {
791
+ "file": 0.3
792
+ },
793
+ "any": [
794
+ "<!--"
795
+ ],
796
+ "patterns": [
797
+ "<!--(?:[^-]|-[^-]){0,800}?-->"
798
+ ],
799
+ "within": [
800
+ "\\b(?:ignore|disregard|forget|override|you\\s+must|you\\s+should|you\\s+are\\s+now|do\\s+not|don't|instead|always|never|execute|run|send|fetch|call|reveal|respond|reply|say|tell|include)\\b",
801
+ "\\b(?:ai|llm|assistant|language\\s+model|chatbot|gpt|chatgpt|claude|copilot|gemini|ai\\s+agent|system\\s+prompt)\\b"
802
+ ]
803
+ },
804
+ {
805
+ "id": "hidden.css_hidden_text",
806
+ "category": "hidden",
807
+ "description": "Text hidden with CSS or the hidden attribute that carries instructions.",
808
+ "weight": 0.6,
809
+ "any": [
810
+ "style",
811
+ "hidden"
812
+ ],
813
+ "patterns": [
814
+ "<[a-z][a-z0-9]*\\s[^>]{0,200}?style\\s*=\\s*[\"'][^\"']{0,200}?(?:display\\s*:\\s*none|visibility\\s*:\\s*hidden|font-size\\s*:\\s*0(?:px|pt|em|rem)?\\s*(?:;|[\"'])|opacity\\s*:\\s*0(?:\\.0+)?\\s*(?:;|[\"'])|color\\s*:\\s*(?:white|#fff(?:fff)?|transparent)|(?:height|width)\\s*:\\s*0(?:px)?\\s*(?:;|[\"'])|left\\s*:\\s*-\\d{4,}px|text-indent\\s*:\\s*-\\d{3,})[^>]{0,200}>[^<]{0,800}",
815
+ "<[a-z][a-z0-9]*[^>]{0,200}?\\s(?:hidden\\b|aria-hidden\\s*=\\s*[\"']?true)[^>]{0,200}>[^<]{0,800}"
816
+ ],
817
+ "within": [
818
+ "\\b(?:(?:ignore|disregard|forget|override)\\s+(?:all|any|every|previous|prior|the\\s+above|the\\s+previous|your|these|earlier)|you\\s+are\\s+now|do\\s+not\\s+(?:tell|mention|reveal)|system\\s+prompt|new\\s+instructions|ai\\s+(?:assistant|agent|model)s?|language\\s+models?|if\\s+you\\s+are\\s+an?\\s+(?:ai|llm|assistant))\\b"
819
+ ]
820
+ },
821
+ {
822
+ "id": "hidden.markdown_hidden",
823
+ "category": "hidden",
824
+ "description": "Instructions tucked into a markdown comment or an image's alt text.",
825
+ "weight": 0.5,
826
+ "any": [
827
+ "]:",
828
+ "!["
829
+ ],
830
+ "patterns": [
831
+ "\\[(?://|comment|_|hidden)\\]:\\s*(?:#|<>)\\s*\\([^)\\n]{0,400}\\)",
832
+ "!\\[[^\\]\\n]{20,300}\\]"
833
+ ],
834
+ "within": [
835
+ "\\b(?:(?:ignore|disregard|forget|override)\\s+(?:all|any|every|previous|prior|the\\s+above|the\\s+previous|your|these|earlier)|you\\s+are\\s+now|do\\s+not\\s+(?:tell|mention|reveal)|system\\s+prompt|new\\s+instructions|ai\\s+(?:assistant|agent|model)s?|language\\s+models?|if\\s+you\\s+are\\s+an?\\s+(?:ai|llm|assistant))\\b"
836
+ ]
837
+ },
838
+ {
839
+ "id": "tool.hidden_tag",
840
+ "category": "tool_poisoning",
841
+ "description": "Pseudo-tags such as <IMPORTANT> that tool-poisoning attacks use to smuggle orders into a description.",
842
+ "weight": 0.4,
843
+ "weights": {
844
+ "tool_description": 0.6,
845
+ "prompt": 0.1,
846
+ "file": 0.1,
847
+ "context": 0.15
848
+ },
849
+ "any": [
850
+ "important",
851
+ "instruction",
852
+ "secret",
853
+ "hidden",
854
+ "critical",
855
+ "admin",
856
+ "note_to_ai"
857
+ ],
858
+ "patterns": [
859
+ "<\\s*/?\\s*(?:important|instructions?|secret|hidden|critical|admin|note_to_ai|ai_instructions?|assistant_instructions?)\\s*>"
860
+ ]
861
+ },
862
+ {
863
+ "id": "tool.usage_directive",
864
+ "category": "tool_poisoning",
865
+ "description": "A tool description that orders the model to do something before or instead of using tools.",
866
+ "weight": 0.35,
867
+ "sources": [
868
+ "tool_description"
869
+ ],
870
+ "any": [
871
+ "before",
872
+ "prior",
873
+ "after",
874
+ "side",
875
+ "important",
876
+ "critical",
877
+ "mandatory"
878
+ ],
879
+ "patterns": [
880
+ "\\b(?:before|prior\\s+to|after)\\s+(?:using|calling|invoking|running|executing)\\s+(?:this|any|the|other|every)\\s+(?:tool|function|server)s?\\b[^\\n]{0,120}\\b(?:you\\s+must|must|always|first)\\b[^\\n]{0,80}\\b(?:read|send|pass|include|provide|upload|forward|call)\\b",
881
+ "\\b(?:side\\s*note|sidenote)\\b",
882
+ "\\b(?:very\\s+|extremely\\s+)?(?:important|critical|mandatory)\\s*[:!]\\s*(?:you|always|before|the\\s+(?:ai|assistant|model))\\b"
883
+ ]
884
+ },
885
+ {
886
+ "id": "tool.shadowing",
887
+ "category": "tool_poisoning",
888
+ "description": "A tool description that changes how other tools behave (tool shadowing).",
889
+ "weight": 0.6,
890
+ "sources": [
891
+ "tool_description",
892
+ "tool_result",
893
+ "context",
894
+ "document"
895
+ ],
896
+ "any": [
897
+ "tool",
898
+ "server",
899
+ "recipient",
900
+ "destination",
901
+ "address",
902
+ "account",
903
+ "bcc"
904
+ ],
905
+ "patterns": [
906
+ "\\b(?:when|whenever|if)\\s+(?:the\\s+)?(?:user|agent|assistant|you)\\s+(?:[a-z]+\\s+){0,4}(?:uses?|calls?|invokes?|runs?)\\s+(?:the\\s+)?[a-z0-9_.-]+\\s+tool\\b[^\\n]{0,160}\\b(?:must|always|instead|also)\\b[^\\n]{0,80}\\b(?:send|bcc|cc|forward|redirect|change|replace|add|include)\\b",
907
+ "\\b(?:instead\\s+of|rather\\s+than)\\s+(?:using\\s+)?(?:the\\s+)?(?:other|any\\s+other|another)\\s+(?:tools?|servers?)\\b",
908
+ "\\b(?:change|redirect|replace|set)\\s+(?:the\\s+)?(?:recipient|destination\\s+(?:address|account)|to\\s+address|wallet\\s+address|account\\s+number|bcc)\\s+(?:to|with)\\b"
909
+ ]
910
+ },
911
+ {
912
+ "id": "obfuscation.decode_and_follow",
913
+ "category": "obfuscation",
914
+ "description": "Asks the model to decode something and then act on it.",
915
+ "weight": 0.55,
916
+ "any": [
917
+ "decode",
918
+ "decipher",
919
+ "base64",
920
+ "rot13",
921
+ "reverse",
922
+ "follow",
923
+ "execute",
924
+ "obey",
925
+ "carry"
926
+ ],
927
+ "patterns": [
928
+ "\\b(?:decode|decipher|base64[\\s-]?decode|rot13|reverse)\\b[^\\n]{0,60}\\b(?:and|then)\\s+(?:follow|execute|run|obey|do\\s+what|perform|act\\s+on)\\b",
929
+ "\\b(?:follow|execute|obey|carry\\s+out)\\s+(?:the\\s+)?(?:decoded|hidden|encoded|embedded)\\s+(?:instructions?|text|message|commands?)\\b"
930
+ ]
931
+ },
932
+ {
933
+ "id": "obfuscation.spaced_letters",
934
+ "category": "obfuscation",
935
+ "description": "An override written letter by letter to slip past word matching.",
936
+ "weight": 0.7,
937
+ "patterns": [
938
+ "\\bi[\\s.*_-]{1,3}g[\\s.*_-]{1,3}n[\\s.*_-]{1,3}o[\\s.*_-]{1,3}r[\\s.*_-]{1,3}e[\\s.*_-]{1,6}(?:a[\\s.*_-]{1,3}l[\\s.*_-]{1,3}l[\\s.*_-]{1,6})?(?:p[\\s.*_-]{1,3}r[\\s.*_-]{1,3}e[\\s.*_-]{1,3}v|i[\\s.*_-]{1,3}n[\\s.*_-]{1,3}s[\\s.*_-]{1,3}t)"
939
+ ]
940
+ },
941
+ {
942
+ "id": "obfuscation.base64_instruction",
943
+ "category": "obfuscation",
944
+ "kind": "base64",
945
+ "description": "A base64 blob that decodes to an injection.",
946
+ "weight": 0.75,
947
+ "min": 24
948
+ },
949
+ {
950
+ "id": "obfuscation.hex_instruction",
951
+ "category": "obfuscation",
952
+ "kind": "hex",
953
+ "description": "A hex blob that decodes to an injection.",
954
+ "weight": 0.75,
955
+ "min": 32
956
+ },
957
+ {
958
+ "id": "obfuscation.invisible_split",
959
+ "category": "obfuscation",
960
+ "kind": "invisible_split",
961
+ "description": "An injection that only reads once invisible characters are removed or wide letters are narrowed.",
962
+ "weight": 0.5
963
+ },
964
+ {
965
+ "id": "obfuscation.homoglyph",
966
+ "category": "obfuscation",
967
+ "kind": "homoglyph",
968
+ "description": "An injection written with look-alike letters from other scripts or styled Unicode letters.",
969
+ "weight": 0.55
970
+ },
971
+ {
972
+ "id": "obfuscation.leetspeak",
973
+ "category": "obfuscation",
974
+ "kind": "leetspeak",
975
+ "description": "An injection written in leetspeak (digits for letters).",
976
+ "weight": 0.5
977
+ },
978
+ {
979
+ "id": "obfuscation.rot13",
980
+ "category": "obfuscation",
981
+ "kind": "rot13",
982
+ "description": "A ROT13 passage that decodes to an injection.",
983
+ "weight": 0.6,
984
+ "any": [
985
+ "rot13",
986
+ "rot-13",
987
+ "rot 13",
988
+ "caesar"
989
+ ]
990
+ },
991
+ {
992
+ "id": "invisible.tag_characters",
993
+ "category": "invisible",
994
+ "kind": "tag",
995
+ "description": "Unicode tag characters outside a flag emoji: invisible text a model still reads (ASCII smuggling).",
996
+ "weight": 0.8,
997
+ "min": 1
998
+ },
999
+ {
1000
+ "id": "invisible.zero_width",
1001
+ "category": "invisible",
1002
+ "kind": "zero_width",
1003
+ "description": "Several zero-width characters.",
1004
+ "weight": 0.25,
1005
+ "min": 3
1006
+ },
1007
+ {
1008
+ "id": "invisible.zero_width_dense",
1009
+ "category": "invisible",
1010
+ "kind": "zero_width",
1011
+ "description": "Many zero-width characters, enough to encode a hidden message.",
1012
+ "weight": 0.55,
1013
+ "min": 16
1014
+ },
1015
+ {
1016
+ "id": "invisible.bidi_override",
1017
+ "category": "invisible",
1018
+ "kind": "bidi",
1019
+ "description": "Bidirectional override characters that make text display differently from how it reads (Trojan Source).",
1020
+ "weight": 0.5,
1021
+ "min": 1
1022
+ }
1023
+ ]
1024
+ }