agent-threat-rules 4.1.5 → 4.2.0

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 (240) hide show
  1. package/CHANGELOG.md +688 -1
  2. package/README.md +355 -125
  3. package/dist/adapters/openshell-filter.d.ts +10 -3
  4. package/dist/adapters/openshell-filter.d.ts.map +1 -1
  5. package/dist/adapters/openshell-filter.js +10 -3
  6. package/dist/adapters/openshell-filter.js.map +1 -1
  7. package/dist/adapters/stdio-adapter.js +3 -3
  8. package/dist/adapters/stdio-adapter.js.map +1 -1
  9. package/dist/cli/mcp-tools-document.d.ts +40 -0
  10. package/dist/cli/mcp-tools-document.d.ts.map +1 -0
  11. package/dist/cli/mcp-tools-document.js +95 -0
  12. package/dist/cli/mcp-tools-document.js.map +1 -0
  13. package/dist/cli/scan-handler.d.ts +8 -0
  14. package/dist/cli/scan-handler.d.ts.map +1 -1
  15. package/dist/cli/scan-handler.js +126 -34
  16. package/dist/cli/scan-handler.js.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +80 -43
  19. package/dist/cli.js.map +1 -1
  20. package/dist/converters/sarif.d.ts +14 -2
  21. package/dist/converters/sarif.d.ts.map +1 -1
  22. package/dist/converters/sarif.js +7 -9
  23. package/dist/converters/sarif.js.map +1 -1
  24. package/dist/corpus-event.d.ts +47 -5
  25. package/dist/corpus-event.d.ts.map +1 -1
  26. package/dist/corpus-event.js +68 -29
  27. package/dist/corpus-event.js.map +1 -1
  28. package/dist/embedding/model-loader.d.ts +2 -0
  29. package/dist/embedding/model-loader.d.ts.map +1 -1
  30. package/dist/embedding/model-loader.js +3 -1
  31. package/dist/embedding/model-loader.js.map +1 -1
  32. package/dist/enforcement.d.ts +8 -0
  33. package/dist/enforcement.d.ts.map +1 -1
  34. package/dist/enforcement.js +10 -0
  35. package/dist/enforcement.js.map +1 -1
  36. package/dist/engine.d.ts +150 -6
  37. package/dist/engine.d.ts.map +1 -1
  38. package/dist/engine.js +337 -76
  39. package/dist/engine.js.map +1 -1
  40. package/dist/eval/embedding-provenance.d.ts +40 -0
  41. package/dist/eval/embedding-provenance.d.ts.map +1 -0
  42. package/dist/eval/embedding-provenance.js +71 -0
  43. package/dist/eval/embedding-provenance.js.map +1 -0
  44. package/dist/eval/eval-harness.d.ts +34 -0
  45. package/dist/eval/eval-harness.d.ts.map +1 -1
  46. package/dist/eval/eval-harness.js +49 -2
  47. package/dist/eval/eval-harness.js.map +1 -1
  48. package/dist/eval/hackaprompt-corpus.d.ts +12 -0
  49. package/dist/eval/hackaprompt-corpus.d.ts.map +1 -1
  50. package/dist/eval/hackaprompt-corpus.js +15 -1
  51. package/dist/eval/hackaprompt-corpus.js.map +1 -1
  52. package/dist/eval/hackaprompt-provenance.d.ts +52 -0
  53. package/dist/eval/hackaprompt-provenance.d.ts.map +1 -0
  54. package/dist/eval/hackaprompt-provenance.js +108 -0
  55. package/dist/eval/hackaprompt-provenance.js.map +1 -0
  56. package/dist/eval/run-hackaprompt-benchmark.d.ts +18 -8
  57. package/dist/eval/run-hackaprompt-benchmark.d.ts.map +1 -1
  58. package/dist/eval/run-hackaprompt-benchmark.js +154 -64
  59. package/dist/eval/run-hackaprompt-benchmark.js.map +1 -1
  60. package/dist/eval/run-pint-benchmark.js +11 -1
  61. package/dist/eval/run-pint-benchmark.js.map +1 -1
  62. package/dist/eval/skill-benchmark.d.ts +26 -6
  63. package/dist/eval/skill-benchmark.d.ts.map +1 -1
  64. package/dist/eval/skill-benchmark.js +49 -16
  65. package/dist/eval/skill-benchmark.js.map +1 -1
  66. package/dist/flywheel.d.ts +4 -0
  67. package/dist/flywheel.d.ts.map +1 -1
  68. package/dist/flywheel.js +12 -4
  69. package/dist/flywheel.js.map +1 -1
  70. package/dist/hook-handler.d.ts +11 -1
  71. package/dist/hook-handler.d.ts.map +1 -1
  72. package/dist/hook-handler.js +84 -16
  73. package/dist/hook-handler.js.map +1 -1
  74. package/dist/hook-tool-output.d.ts +47 -0
  75. package/dist/hook-tool-output.d.ts.map +1 -0
  76. package/dist/hook-tool-output.js +110 -0
  77. package/dist/hook-tool-output.js.map +1 -0
  78. package/dist/index.d.ts +5 -3
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +3 -2
  81. package/dist/index.js.map +1 -1
  82. package/dist/layer-integration.d.ts +4 -2
  83. package/dist/layer-integration.d.ts.map +1 -1
  84. package/dist/layer-integration.js +6 -2
  85. package/dist/layer-integration.js.map +1 -1
  86. package/dist/mcp-server.d.ts +8 -0
  87. package/dist/mcp-server.d.ts.map +1 -1
  88. package/dist/mcp-server.js +1 -0
  89. package/dist/mcp-server.js.map +1 -1
  90. package/dist/mcp-tools/scan.d.ts.map +1 -1
  91. package/dist/mcp-tools/scan.js +9 -1
  92. package/dist/mcp-tools/scan.js.map +1 -1
  93. package/dist/measurement/enforce-lane.d.ts +66 -0
  94. package/dist/measurement/enforce-lane.d.ts.map +1 -0
  95. package/dist/measurement/enforce-lane.js +89 -0
  96. package/dist/measurement/enforce-lane.js.map +1 -0
  97. package/dist/measurement/from-eval-harness.d.ts +16 -3
  98. package/dist/measurement/from-eval-harness.d.ts.map +1 -1
  99. package/dist/measurement/from-eval-harness.js +15 -5
  100. package/dist/measurement/from-eval-harness.js.map +1 -1
  101. package/dist/measurement/in-sample-ablation.d.ts +29 -0
  102. package/dist/measurement/in-sample-ablation.d.ts.map +1 -0
  103. package/dist/measurement/in-sample-ablation.js +45 -0
  104. package/dist/measurement/in-sample-ablation.js.map +1 -0
  105. package/dist/measurement/schema.d.ts +38 -1
  106. package/dist/measurement/schema.d.ts.map +1 -1
  107. package/dist/measurement/schema.js +43 -1
  108. package/dist/measurement/schema.js.map +1 -1
  109. package/dist/quality/action-eligibility.d.ts +4 -2
  110. package/dist/quality/action-eligibility.d.ts.map +1 -1
  111. package/dist/quality/action-eligibility.js.map +1 -1
  112. package/dist/rule-confidence.d.ts +31 -0
  113. package/dist/rule-confidence.d.ts.map +1 -0
  114. package/dist/rule-confidence.js +49 -0
  115. package/dist/rule-confidence.js.map +1 -0
  116. package/dist/rule-scaffolder.d.ts.map +1 -1
  117. package/dist/rule-scaffolder.js +43 -4
  118. package/dist/rule-scaffolder.js.map +1 -1
  119. package/dist/semantic-evaluator.d.ts.map +1 -1
  120. package/dist/semantic-evaluator.js +15 -13
  121. package/dist/semantic-evaluator.js.map +1 -1
  122. package/dist/shadow-evaluator.d.ts +7 -2
  123. package/dist/shadow-evaluator.d.ts.map +1 -1
  124. package/dist/shadow-evaluator.js +29 -25
  125. package/dist/shadow-evaluator.js.map +1 -1
  126. package/dist/testcase-event.d.ts +82 -1
  127. package/dist/testcase-event.d.ts.map +1 -1
  128. package/dist/testcase-event.js +135 -16
  129. package/dist/testcase-event.js.map +1 -1
  130. package/dist/tier0-invariant.d.ts.map +1 -1
  131. package/dist/tier0-invariant.js +1 -0
  132. package/dist/tier0-invariant.js.map +1 -1
  133. package/dist/tier1-blacklist.d.ts.map +1 -1
  134. package/dist/tier1-blacklist.js +1 -0
  135. package/dist/tier1-blacklist.js.map +1 -1
  136. package/dist/tool-definition-scope.d.ts +45 -0
  137. package/dist/tool-definition-scope.d.ts.map +1 -0
  138. package/dist/tool-definition-scope.js +68 -0
  139. package/dist/tool-definition-scope.js.map +1 -0
  140. package/dist/types.d.ts +42 -2
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/verdict.d.ts +46 -2
  143. package/dist/verdict.d.ts.map +1 -1
  144. package/dist/verdict.js +99 -14
  145. package/dist/verdict.js.map +1 -1
  146. package/package.json +2 -1
  147. package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +2 -2
  148. package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +1 -1
  149. package/rules/agent-manipulation/ATR-2026-00328-named-mode-persona-override.yaml +1 -1
  150. package/rules/agent-manipulation/ATR-2026-00330-yoja-allcaps-settings-block-persona.yaml +1 -1
  151. package/rules/agent-manipulation/ATR-2026-00418-weknora-mcp-config-rce.yaml +5 -5
  152. package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +1 -1
  153. package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +3 -3
  154. package/rules/context-exfiltration/ATR-2026-00426-nl-output-injection-credential-leak.yaml +1 -1
  155. package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +1 -1
  156. package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +1 -1
  157. package/rules/context-exfiltration/ATR-2026-00851-indirect-pi-financial-payment-exfil.yaml +1 -1
  158. package/rules/context-exfiltration/ATR-2026-01457-sysprompt-completion-clone-attack.yaml +1 -1
  159. package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +1 -1
  160. package/rules/context-exfiltration/ATR-2026-01463-imend-imsystem-prompt-injection-format.yaml +1 -1
  161. package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +1 -1
  162. package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +1 -1
  163. package/rules/context-exfiltration/ATR-2026-02855-cross-email-exfil-relay.yaml +79 -0
  164. package/rules/context-exfiltration/ATR-2026-02861-exfil-send-email-with-body-directive.yaml +83 -0
  165. package/rules/context-exfiltration/ATR-2026-02866-idna-label-separator-in-fetch-url-host.yaml +104 -0
  166. package/rules/excessive-autonomy/ATR-2026-00710-ipi-physical-access-grant.yaml +1 -1
  167. package/rules/model-abuse/ATR-2026-01897-host-sabotage.yaml +2 -2
  168. package/rules/model-security/ATR-2026-00433-modelcache-torch-load-deserialization-rce.yaml +1 -1
  169. package/rules/privilege-escalation/ATR-2026-00436-enclave-vm-sandbox-escape-rce.yaml +1 -1
  170. package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +2 -2
  171. package/rules/privilege-escalation/ATR-2026-01612-debug-mode-privilege-escalation.yaml +1 -1
  172. package/rules/privilege-escalation/ATR-2026-02867-identifier-typed-tool-argument-dot-dot-path-segment.yaml +106 -0
  173. package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +2 -2
  174. package/rules/prompt-injection/ATR-2026-00080-encoding-evasion.yaml +1 -1
  175. package/rules/prompt-injection/ATR-2026-00086-visual-spoofing.yaml +1 -1
  176. package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +1 -1
  177. package/rules/prompt-injection/ATR-2026-00228-structured-jailbreak.yaml +2 -2
  178. package/rules/prompt-injection/ATR-2026-00233-structured-jailbreak.yaml +2 -2
  179. package/rules/prompt-injection/ATR-2026-00256-base-n-encoding-jailbreak.yaml +1 -1
  180. package/rules/prompt-injection/ATR-2026-00264-latent-injection-translation.yaml +3 -3
  181. package/rules/prompt-injection/ATR-2026-00265-latent-injection-rag-document.yaml +1 -1
  182. package/rules/prompt-injection/ATR-2026-00282-perez-prompt-injection-hijack.yaml +4 -4
  183. package/rules/prompt-injection/ATR-2026-00321-hyphenated-system-instruction-injection.yaml +1 -1
  184. package/rules/prompt-injection/ATR-2026-00394-backspace-deletion-character-injection.yaml +2 -2
  185. package/rules/prompt-injection/ATR-2026-00446-variable-assignment-payload-injection.yaml +3 -3
  186. package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +3 -3
  187. package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +1 -1
  188. package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +3 -3
  189. package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +3 -3
  190. package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +1 -1
  191. package/rules/prompt-injection/ATR-2026-01005-many-shot-repetition-override.yaml +2 -2
  192. package/rules/prompt-injection/ATR-2026-01006-payload-split-string-concat-injection.yaml +2 -2
  193. package/rules/prompt-injection/ATR-2026-01015-evasion-refusal-suppression.yaml +1 -1
  194. package/rules/prompt-injection/ATR-2026-01016-evasion-response-priming-forced-opener.yaml +1 -1
  195. package/rules/prompt-injection/ATR-2026-01026-evasion-unicode-glitch-token-anomaly.yaml +2 -2
  196. package/rules/prompt-injection/ATR-2026-01304-indirect-injection-carrier-important-override.yaml +1 -1
  197. package/rules/prompt-injection/ATR-2026-01759-dos-new-important-instructions-injection-in-document.yaml +1 -1
  198. package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +1 -1
  199. package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +2 -2
  200. package/rules/prompt-injection/ATR-2026-02815-injected-halt-order-canned-reply-dos.yaml +80 -0
  201. package/rules/prompt-injection/ATR-2026-02820-tool-result-orders-agent-to-hide-its-own-action.yaml +106 -0
  202. package/rules/prompt-injection/ATR-2026-02858-context-suppression-directive.yaml +73 -0
  203. package/rules/prompt-injection/ATR-2026-02859-tool-output-agent-role-reassignment.yaml +71 -0
  204. package/rules/prompt-injection/ATR-2026-02860-forged-instruction-boundary-marker.yaml +70 -0
  205. package/rules/prompt-injection/ATR-2026-02862-fake-chat-template-turn-injection.yaml +79 -0
  206. package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +1 -1
  207. package/rules/skill-compromise/ATR-2026-00063-skill-chain-attack.yaml +2 -2
  208. package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
  209. package/rules/skill-compromise/ATR-2026-00149-skill-exfil-compound.yaml +6 -6
  210. package/rules/skill-compromise/ATR-2026-00223-reverse-shell-dropper.yaml +2 -2
  211. package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +1 -1
  212. package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +1 -1
  213. package/rules/skill-compromise/ATR-2026-02261-code-credential-exfil-chain.yaml +1 -1
  214. package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +23 -23
  215. package/rules/tool-poisoning/ATR-2026-00013-tool-ssrf.yaml +16 -5
  216. package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +1 -1
  217. package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +2 -2
  218. package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +4 -4
  219. package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -1
  220. package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +1 -1
  221. package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +2 -2
  222. package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +1 -1
  223. package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -1
  224. package/rules/tool-poisoning/ATR-2026-02025-mcp-full-schema-poisoning-nondescription-field.yaml +1 -1
  225. package/rules/tool-poisoning/ATR-2026-02817-untrusted-content-dictates-tool-arguments.yaml +83 -0
  226. package/rules/tool-poisoning/ATR-2026-02864-non-canonical-ipv4-host-in-url-tool-argument.yaml +102 -0
  227. package/rules/tool-poisoning/ATR-2026-02865-read-only-utility-write-flag-in-command-argument.yaml +157 -0
  228. package/rules/tool-poisoning/ATR-2026-02868-ssrf-ipv6-transition-address-embedded-private-ipv4.yaml +107 -0
  229. package/spec/README.md +6 -3
  230. package/spec/atr-event-v1.0.md +13 -8
  231. package/spec/atr-method-v1.1.md +2 -2
  232. package/spec/category-registry/gemara/README.md +102 -0
  233. package/spec/category-registry/gemara/ai-agent-capability-catalog.yaml +157 -0
  234. package/spec/category-registry/gemara/atr-attack-vector-catalog.yaml +130 -0
  235. package/spec/category-registry/gemara/atr-detection-control-catalog.yaml +327 -0
  236. package/spec/category-registry/gemara/atr-threat-catalog.yaml +246 -0
  237. package/spec/category-registry/gemara/src/editorial.yaml +743 -0
  238. package/spec/mappings/README.md +1 -1
  239. package/spec/mappings/atr-to-nist-csf-2.0.md +5 -4
  240. package/spec/schema/event.schema.json +1 -1
@@ -0,0 +1,157 @@
1
+ # GENERATED by scripts/generate-gemara-catalogs.ts. Do not edit by hand.
2
+ # Inputs: spec/category-registry/v1.0.yaml (the category registry) and
3
+ # spec/category-registry/gemara/src/editorial.yaml
4
+ # Regenerate: npx tsx scripts/generate-gemara-catalogs.ts
5
+ # License: MIT
6
+ metadata:
7
+ id: ATR-AI-AGENT-CAPABILITY-CATALOG
8
+ type: CapabilityCatalog
9
+ gemara-version: 1.6.0
10
+ version: 1.0.0
11
+ description: >-
12
+ Capabilities of AI agent systems that create the opportunity for the threats
13
+ catalogued by Agent Threat Rules (ATR). Each capability describes a feature
14
+ or function an agent can perform, not a threat. Threats in the companion
15
+ threat catalog reference these capabilities. Authored by the ATR project and
16
+ validated against the Gemara schemas; ATR hosts the content, Gemara defines
17
+ the schema.
18
+ author:
19
+ id: atr
20
+ name: Agent Threat Rules
21
+ type: Software Assisted
22
+ contact:
23
+ name: ATR maintainers
24
+ affiliation: Agent Threat Rules
25
+ email: adam@agentthreatrule.org
26
+ draft: true
27
+ title: AI Agent Capability Catalog
28
+ groups:
29
+ - id: model-interaction
30
+ title: Model Interaction
31
+ description: >-
32
+ Capabilities by which an agent receives instructions and untrusted content
33
+ into a language model and acts on the model's output.
34
+ - id: tool-and-protocol
35
+ title: Tool and Protocol Access
36
+ description: >-
37
+ Capabilities by which an agent invokes external tools and connects to tool
38
+ servers over protocols such as the Model Context Protocol (MCP).
39
+ - id: extensibility
40
+ title: Extensibility
41
+ description: >-
42
+ Capabilities by which an agent loads and runs third-party extensions such
43
+ as skills, plugins, and packaged capability bundles.
44
+ - id: state-and-memory
45
+ title: State and Memory
46
+ description: >-
47
+ Capabilities by which an agent reads and writes persistent state,
48
+ conversation context, and long-term memory across turns and sessions.
49
+ - id: autonomy-and-coordination
50
+ title: Autonomy and Coordination
51
+ description: >-
52
+ Capabilities by which an agent acts without per-step human approval and
53
+ coordinates with other agents.
54
+ - id: model-supply-chain
55
+ title: Model supply chain
56
+ description: >-
57
+ Capabilities by which the model an agent depends on is built, packaged and
58
+ loaded. These sit outside agent runtime: they shape behaviour before any
59
+ request is served.
60
+ capabilities:
61
+ - id: CAP-MODEL-INFERENCE
62
+ title: Model Inference on Untrusted Input
63
+ description: >-
64
+ The agent passes user instructions and content drawn from external sources
65
+ into a language model and treats the resulting output as actionable.
66
+ Mixing trusted instructions with untrusted content in a single context
67
+ window is the feature that makes prompt injection and jailbreak attempts
68
+ possible.
69
+ group: model-interaction
70
+ - id: CAP-OUTPUT-ACTION
71
+ title: Acting on Model Output
72
+ description: >-
73
+ The agent converts model output into actions, tool calls, or content
74
+ returned to downstream systems. Because output is consumed without an
75
+ independent trust boundary, manipulated output can redirect behaviour or
76
+ carry exfiltrated data.
77
+ group: model-interaction
78
+ - id: CAP-TOOL-INVOCATION
79
+ title: Tool Invocation
80
+ description: >-
81
+ The agent calls external tools and functions, passing arguments and
82
+ receiving results that re-enter the model context. Tool arguments and tool
83
+ results are an attack surface for injection, command execution, and
84
+ over-broad actions.
85
+ group: tool-and-protocol
86
+ - id: CAP-MCP-CONNECTION
87
+ title: MCP and Tool-Server Connection
88
+ description: >-
89
+ The agent connects to tool servers over the Model Context Protocol or
90
+ similar transports, consuming server-provided tool manifests, schemas, and
91
+ descriptions. Server-controlled metadata is trusted at connection time,
92
+ which creates the opportunity for tool poisoning and tool redefinition
93
+ (rug-pull) after initial approval.
94
+ group: tool-and-protocol
95
+ - id: CAP-CROSS-AGENT-MESSAGING
96
+ title: Cross-Agent Message Passing
97
+ description: >-
98
+ The agent sends and receives messages to and from other agents in a
99
+ multi-agent workflow. Messages from peer agents are treated as trusted
100
+ input, which lets a compromised or manipulated agent influence others.
101
+ group: tool-and-protocol
102
+ - id: CAP-SKILL-LOADING
103
+ title: Skill and Plugin Loading
104
+ description: >-
105
+ The agent loads third-party skills, plugins, or capability bundles and
106
+ executes the instructions and code they contain. Loaded extensions run
107
+ with the agent's privileges, which creates the opportunity for supply
108
+ chain compromise and backdoored or over-privileged skills.
109
+ group: extensibility
110
+ - id: CAP-MEMORY-WRITE
111
+ title: Memory and State Write
112
+ description: >-
113
+ The agent writes facts, instructions, or artifacts into persistent memory
114
+ or shared state that influences later turns and sessions. Writable memory
115
+ is the feature that lets poisoned content persist and take effect after
116
+ the originating input is gone.
117
+ group: state-and-memory
118
+ - id: CAP-MEMORY-READ
119
+ title: Context and Memory Read
120
+ description: >-
121
+ The agent reads conversation history, retrieved documents, and long-term
122
+ memory back into the active context. Reading attacker- influenced state
123
+ re-introduces untrusted content and is a channel for indirect injection
124
+ and staged data exfiltration.
125
+ group: state-and-memory
126
+ - id: CAP-AUTONOMOUS-ACTION
127
+ title: Autonomous Action Without Per-Step Approval
128
+ description: >-
129
+ The agent executes multi-step plans, loops, and side-effecting actions
130
+ without human approval at each step. Unbounded autonomy is the feature
131
+ that turns a single manipulated decision into runaway loops, resource
132
+ abuse, or unauthorized real-world actions.
133
+ group: autonomy-and-coordination
134
+ - id: CAP-PRIVILEGED-EXECUTION
135
+ title: Privileged and Delegated Execution
136
+ description: >-
137
+ The agent runs with delegated credentials and access to systems,
138
+ databases, files, and networks. Holding standing privilege creates the
139
+ opportunity for privilege escalation, sandbox escape, and use of the
140
+ agent's access beyond its intended scope.
141
+ group: autonomy-and-coordination
142
+ - id: CAP-MODEL-ARTIFACT-LOADING
143
+ title: Model Artifact Loading
144
+ description: >-
145
+ The agent depends on a serialized model artifact that is fetched from a
146
+ registry or filesystem and deserialized into an executable object before
147
+ any behavioural check runs. The artifact is trusted at the moment it is
148
+ least verified.
149
+ group: model-supply-chain
150
+ - id: CAP-TRAINING-DATA-INGESTION
151
+ title: Training and Fine-Tuning Data Ingestion
152
+ description: >-
153
+ The model the agent depends on is adapted using data drawn from sources
154
+ the operator does not fully control. Ingested data shapes behaviour after
155
+ the originating input is gone, and every deployment of the resulting model
156
+ carries that shaping.
157
+ group: model-supply-chain
@@ -0,0 +1,130 @@
1
+ # GENERATED by scripts/generate-gemara-catalogs.ts. Do not edit by hand.
2
+ # Inputs: spec/category-registry/v1.0.yaml (the category registry) and
3
+ # spec/category-registry/gemara/src/editorial.yaml
4
+ # Regenerate: npx tsx scripts/generate-gemara-catalogs.ts
5
+ # License: MIT
6
+ metadata:
7
+ id: ATR-AI-AGENT-VECTOR-CATALOG
8
+ type: VectorCatalog
9
+ gemara-version: 1.6.0
10
+ version: 1.0.0
11
+ description: >-
12
+ Attack vectors against AI agent systems, one per detection category in the
13
+ Agent Threat Rules (ATR) category registry. A category is a method by which
14
+ a threat is realized rather than the threat itself, which is why it lives
15
+ here and is referenced from the threat catalog rather than restated in it.
16
+ Generated from the registry: each vector id is a registry category id and
17
+ each description is the registry's description of that category.
18
+
19
+ Validated against Gemara's #VectorCatalog, which is marked experimental in
20
+ vectorcatalog.cue; this artifact may need to change with the schema.
21
+ author:
22
+ id: atr
23
+ name: Agent Threat Rules
24
+ type: Software Assisted
25
+ contact:
26
+ name: ATR maintainers
27
+ affiliation: Agent Threat Rules
28
+ email: adam@agentthreatrule.org
29
+ mapping-references:
30
+ - id: ATR
31
+ title: Agent Threat Rules category registry
32
+ version: "1.0"
33
+ url: >-
34
+ https://github.com/Agent-Threat-Rule/agent-threat-rules/blob/main/spec/category-registry/v1.0.yaml
35
+ description: >-
36
+ Detection categories of Agent Threat Rules (ATR). Each entry id is a
37
+ category id in this registry and names the directory under rules/ that
38
+ holds that category's rules.
39
+ draft: true
40
+ title: AI Agent Attack Vector Catalog (ATR)
41
+ groups:
42
+ - id: via-content
43
+ title: Through content the agent reads
44
+ description: >-
45
+ Vectors that arrive inside data the agent ingests and are acted on as
46
+ though they were operator instructions.
47
+ - id: via-extension
48
+ title: Through an artifact the agent loads
49
+ description: >-
50
+ Vectors carried by tools, skills, plugins or model artifacts, which arrive
51
+ through the supply chain rather than the conversation.
52
+ - id: via-authority
53
+ title: Through the authority the agent holds
54
+ description: >-
55
+ Vectors that exploit what the agent is permitted to do rather than what it
56
+ is told.
57
+ vectors:
58
+ - id: prompt-injection
59
+ title: Instruction injection into model context
60
+ description: >-
61
+ Adversarial inputs that subvert the agent's instruction-following behavior
62
+ — direct injection, indirect injection (via retrieved documents or tool
63
+ outputs), jailbreak attempts, system-prompt overrides, multi-turn
64
+ manipulation, and cross-agent injection.
65
+ group: via-content
66
+ - id: tool-poisoning
67
+ title: Manipulation of tool calls and tool output
68
+ description: >-
69
+ Attacks that manipulate the agent's tool-calling behavior — tool output
70
+ injection, unauthorized tool invocation, SSRF via tool calls, tool
71
+ argument tampering, shell-tool unsanitized argv, tool-response piggyback.
72
+ group: via-extension
73
+ - id: skill-compromise
74
+ title: Compromised skill, plugin or server package
75
+ description: >-
76
+ Compromise of skills, plugins, or MCP server packages — supply chain
77
+ attacks, malicious SKILL.md content, package typosquatting, install-time
78
+ daemon installation, silent exfiltration via skill instructions.
79
+ group: via-extension
80
+ - id: context-exfiltration
81
+ title: Context and credential exfiltration
82
+ description: >-
83
+ Attacks that leak the agent's context window, system prompt, memory store,
84
+ retrieved documents, or session state — memory poisoning with exfil
85
+ persistence, system-prompt leakage, credential pattern leakage in agent
86
+ output.
87
+ group: via-authority
88
+ - id: excessive-autonomy
89
+ title: Action beyond declared scope or authorization
90
+ description: >-
91
+ The agent acts beyond its declared scope, permissions, or authorization —
92
+ autonomous goal pursuit, permission-boundary violation, scope creep
93
+ through gradual privilege accumulation.
94
+ group: via-authority
95
+ - id: model-abuse
96
+ title: Model-level evasion of robustness and oversight
97
+ description: >-
98
+ Model-level attacks on the agent's underlying LLM — adversarial inputs
99
+ targeting model robustness, reward-hacking signatures in output,
100
+ deceptive-justification language, monitor-evasion attempts via env-var or
101
+ telemetry mutation.
102
+ group: via-content
103
+ - id: model-security
104
+ title: Attack on the model artifact
105
+ description: >-
106
+ Attacks on the model artifact itself — model weight tampering, unsafe
107
+ deserialization of model files, adversarial model registry uploads.
108
+ group: via-extension
109
+ - id: privilege-escalation
110
+ title: Privilege escalation and delegated authority abuse
111
+ description: >-
112
+ Attacks that escalate the agent's effective privileges — authentication
113
+ bypass on agent control plane (e.g., PraisonAI CVE-2026-44338), sudo /
114
+ chmod patterns in tool calls, scope escalation across agent chain.
115
+ group: via-authority
116
+ - id: agent-manipulation
117
+ title: Forged peer-agent identity and message framing
118
+ description: >-
119
+ Attacks on agent-to-agent (A2A) communication or identity — cross-agent
120
+ attacks, inter-agent message spoofing, agent identity replacement /
121
+ spoofing, fork impersonation, real-person identity commands, skill
122
+ impersonation.
123
+ group: via-content
124
+ - id: data-poisoning
125
+ title: Poisoning of state the agent will read later
126
+ description: >-
127
+ Attacks on the data the agent consumes — RAG retrieved document poisoning,
128
+ knowledge base poisoning, training-data tampering patterns (where
129
+ detectable at runtime).
130
+ group: via-content
@@ -0,0 +1,327 @@
1
+ # GENERATED by scripts/generate-gemara-catalogs.ts. Do not edit by hand.
2
+ # Inputs: spec/category-registry/v1.0.yaml (the category registry) and
3
+ # spec/category-registry/gemara/src/editorial.yaml
4
+ # Regenerate: npx tsx scripts/generate-gemara-catalogs.ts
5
+ # License: MIT
6
+ metadata:
7
+ id: ATR-DETECTION-CONTROL-CATALOG
8
+ type: ControlCatalog
9
+ gemara-version: 1.6.0
10
+ version: 1.0.0
11
+ description: >-
12
+ Detection controls an operator can apply using Agent Threat Rules (ATR),
13
+ organized by where in the lifecycle the inspection happens rather than by
14
+ which rule category is used. Three are written out; the rest are declared
15
+ Draft rather than filled in with the same text, because a control whose
16
+ assessment requirement cannot fail is not a control. The OWASP ASI and MITRE
17
+ ATLAS references on each control are the modal references on the rules in
18
+ the categories it is implemented with, as counted on the rule corpus on
19
+ 2026-08-24; they are not recomputed when rules change.
20
+ author:
21
+ id: atr
22
+ name: Agent Threat Rules
23
+ type: Software Assisted
24
+ contact:
25
+ name: ATR maintainers
26
+ affiliation: Agent Threat Rules
27
+ email: adam@agentthreatrule.org
28
+ mapping-references:
29
+ - id: ATR-AI-AGENT-THREAT-CATALOG
30
+ title: AI Agent Threat Catalog
31
+ version: 1.0.0
32
+ url: file://./atr-threat-catalog.yaml
33
+ description: Threats these controls are intended to detect.
34
+ - id: ATR
35
+ title: Agent Threat Rules category registry
36
+ version: "1.0"
37
+ url: >-
38
+ https://github.com/Agent-Threat-Rule/agent-threat-rules/blob/main/spec/category-registry/v1.0.yaml
39
+ description: >-
40
+ Detection categories of Agent Threat Rules (ATR). Each entry id is a
41
+ category id in this registry and names the directory under rules/ that
42
+ holds that category's rules.
43
+ - id: OWASP-ASI
44
+ title: OWASP Agentic Security Initiative Top 10
45
+ version: "2026"
46
+ url: https://genai.owasp.org/
47
+ description: Guidance each ATR rule already cross-references in its own metadata.
48
+ - id: MITRE-ATLAS
49
+ title: MITRE ATLAS
50
+ version: "2026"
51
+ url: https://atlas.mitre.org/
52
+ description: Adversarial technique taxonomy each ATR rule already cross-references.
53
+ applicability-groups:
54
+ - id: pre-load
55
+ title: Before an artifact is loaded
56
+ description: >-
57
+ Applies where an artifact is inspected before the agent can use it —
58
+ skills, plugins, tool manifests, model files.
59
+ - id: request-path
60
+ title: On the request path
61
+ description: >-
62
+ Applies where content is inspected while the agent is running, before it
63
+ reaches the model or leaves the boundary.
64
+ - id: at-write
65
+ title: When content is committed to durable state
66
+ description: >-
67
+ Applies when content is written to memory, a cache or a retrieval
68
+ corpus, regardless of whether an agent is executing at the time.
69
+ - id: data-pipeline
70
+ title: In the data pipeline
71
+ description: >-
72
+ Applies where training or adaptation data is assembled, ahead of any
73
+ agent execution.
74
+ draft: true
75
+ title: ATR Detection Control Catalog
76
+ imports:
77
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
78
+ entries:
79
+ - reference-id: ATR-THREAT-UNAUTHORIZED-ACTION
80
+ - reference-id: ATR-THREAT-DELAYED-UNAUTHORIZED-ACTION
81
+ - reference-id: ATR-THREAT-CONTEXT-DISCLOSURE
82
+ - reference-id: ATR-THREAT-EXECUTION-ESCAPE
83
+ - reference-id: ATR-THREAT-UNBOUNDED-COMMITMENT
84
+ - reference-id: ATR-THREAT-MODEL-BEHAVIOUR-COMPROMISE
85
+ groups:
86
+ - id: artifact-screening
87
+ title: Artifact screening
88
+ description: Controls that inspect something before the agent is allowed to use it.
89
+ - id: content-screening
90
+ title: Content screening
91
+ description: Controls that inspect content on the request or response path.
92
+ - id: pipeline-screening
93
+ title: Pipeline screening
94
+ description: Controls that inspect data before it shapes a model.
95
+ controls:
96
+ - id: ATR-CTL-EXTENSION-SCREENING
97
+ title: Screening of loadable extensions before use
98
+ objective: >-
99
+ No skill, plugin, tool manifest or model artifact becomes available to the
100
+ agent without having been inspected for hostile content, and the operator
101
+ can tell afterwards which ruleset that inspection was performed under.
102
+ group: artifact-screening
103
+ assessment-requirements:
104
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-1
105
+ text: >-
106
+ Every extension artifact MUST be scanned before it is registered as
107
+ available to the agent, and registration MUST fail closed when the
108
+ scan cannot complete or the ruleset version cannot be resolved.
109
+ applicability:
110
+ - pre-load
111
+ recommendation: >-
112
+ Failing closed is the part that is usually skipped. A scanner that is
113
+ unreachable and treated as a pass converts this control into a
114
+ formality without changing any observable behaviour.
115
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-2
116
+ text: >-
117
+ A serialized model artifact MUST NOT be deserialized before its digest
118
+ has been checked against the digest recorded when it was screened.
119
+ applicability:
120
+ - pre-load
121
+ recommendation: >-
122
+ Deserialization is the execution boundary for this class of artifact,
123
+ so a check performed after loading has already lost.
124
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-3
125
+ text: >-
126
+ The ruleset version in effect MUST be recorded with each screening
127
+ result and retained for as long as the artifact remains registered.
128
+ applicability:
129
+ - pre-load
130
+ recommendation: >-
131
+ A clean result is bounded by the rules that ran. Without the version,
132
+ a later question about coverage has no answer.
133
+ guidelines:
134
+ - reference-id: OWASP-ASI
135
+ entries:
136
+ - reference-id: ASI04:2026
137
+ - reference-id: ASI05:2026
138
+ - reference-id: MITRE-ATLAS
139
+ entries:
140
+ - reference-id: AML.T0010
141
+ - reference-id: ATR
142
+ entries:
143
+ - reference-id: skill-compromise
144
+ - reference-id: model-security
145
+ remarks: >-
146
+ The rule categories this control is implemented with; each id is a
147
+ category in the ATR category registry and a directory under rules/.
148
+ threats:
149
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
150
+ entries:
151
+ - reference-id: ATR-THREAT-EXECUTION-ESCAPE
152
+ - reference-id: ATR-THREAT-UNAUTHORIZED-ACTION
153
+ remarks: >-
154
+ Screening covers both because a hostile extension can either execute
155
+ directly or steer the model into acting; the rules that detect each
156
+ differ, the moment of inspection does not.
157
+ state: Active
158
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING
159
+ title: Screening of untrusted content entering model context
160
+ objective: >-
161
+ Content reaching the model from a source the operator does not control is
162
+ inspected for embedded instructions before the agent acts on it, and a
163
+ detection carries enough provenance for a human to adjudicate it.
164
+ group: content-screening
165
+ assessment-requirements:
166
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-1
167
+ text: >-
168
+ Content retrieved from an external source MUST be inspected before it
169
+ enters the model context, and each detection MUST record the matching
170
+ rule id, the ruleset version, and the location of the match within the
171
+ content.
172
+ applicability:
173
+ - request-path
174
+ recommendation: >-
175
+ Recording the location is what makes a detection adjudicable. A rule
176
+ id alone tells a reviewer that something matched, not what.
177
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-2
178
+ text: >-
179
+ Content written into persistent memory or a retrieval corpus MUST be
180
+ inspected at write time as well as at read time.
181
+ applicability:
182
+ - request-path
183
+ - at-write
184
+ recommendation: >-
185
+ Write-time inspection is the only point at which the originating
186
+ request is still available to attribute a later action to.
187
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-3
188
+ text: >-
189
+ The deployment MUST record which rule maturity lane was in effect for
190
+ each inspection, and MUST NOT block on a lane the operator has not
191
+ accepted for blocking.
192
+ applicability:
193
+ - request-path
194
+ recommendation: >-
195
+ ATR publishes rules at differing maturity. Blocking on a lane intended
196
+ for triage converts a detection surface into an availability incident.
197
+ guidelines:
198
+ - reference-id: OWASP-ASI
199
+ entries:
200
+ - reference-id: ASI01:2026
201
+ - reference-id: ASI06:2026
202
+ - reference-id: MITRE-ATLAS
203
+ entries:
204
+ - reference-id: AML.T0051
205
+ - reference-id: ATR
206
+ entries:
207
+ - reference-id: prompt-injection
208
+ - reference-id: data-poisoning
209
+ remarks: >-
210
+ The rule categories this control is implemented with; each id is a
211
+ category in the ATR category registry and a directory under rules/.
212
+ threats:
213
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
214
+ entries:
215
+ - reference-id: ATR-THREAT-UNAUTHORIZED-ACTION
216
+ - reference-id: ATR-THREAT-DELAYED-UNAUTHORIZED-ACTION
217
+ state: Active
218
+ - id: ATR-CTL-EGRESS-SCREENING
219
+ title: Screening of agent-initiated egress
220
+ objective: >-
221
+ Content the agent sends outside the trust boundary is inspected before it
222
+ leaves, so that a permitted call carrying context or credentials is
223
+ surfaced rather than passing on the strength of its destination.
224
+ group: content-screening
225
+ assessment-requirements:
226
+ - id: ATR-CTL-EGRESS-SCREENING-AR-1
227
+ text: >-
228
+ Outbound request content MUST be inspected before the request is
229
+ issued, not reconstructed from logs afterwards.
230
+ applicability:
231
+ - request-path
232
+ recommendation: >-
233
+ Post-hoc inspection can attribute a disclosure but cannot prevent it,
234
+ and for credentials the distinction is the whole control.
235
+ - id: ATR-CTL-EGRESS-SCREENING-AR-2
236
+ text: >-
237
+ Credential-bearing headers MUST be redacted before content is passed
238
+ to inspection, and a detection MUST NOT reproduce matched credential
239
+ material in its finding.
240
+ applicability:
241
+ - request-path
242
+ recommendation: >-
243
+ A detection surface that stores what it detected becomes a second copy
244
+ of the secret, in a system usually held to a lower standard.
245
+ - id: ATR-CTL-EGRESS-SCREENING-AR-3
246
+ text: >-
247
+ Where inspection cannot evaluate a request shape, the deployment MUST
248
+ record that the request was not evaluated rather than recording it as
249
+ clean.
250
+ applicability:
251
+ - request-path
252
+ recommendation: >-
253
+ Rules are written against an event vocabulary. Where a request does
254
+ not map onto it, "no finding" and "not looked at" are different facts
255
+ and only one of them is safe to aggregate.
256
+ guidelines:
257
+ - reference-id: MITRE-ATLAS
258
+ entries:
259
+ - reference-id: AML.T0057
260
+ - reference-id: AML.T0056
261
+ - reference-id: ATR
262
+ entries:
263
+ - reference-id: context-exfiltration
264
+ remarks: >-
265
+ The rule category this control is implemented with. No OWASP ASI entry
266
+ is cited: the modal reference on these rules is ASI01, which names the
267
+ injection that induces the disclosure rather than the disclosure
268
+ itself, so citing it here would overstate the fit.
269
+ threats:
270
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
271
+ entries:
272
+ - reference-id: ATR-THREAT-CONTEXT-DISCLOSURE
273
+ state: Active
274
+ - id: ATR-CTL-AUTONOMY-BOUNDING
275
+ title: Bounding of unattended commitment
276
+ objective: >-
277
+ Consequential commitments made without a human decision point are detected
278
+ and bounded.
279
+ group: content-screening
280
+ assessment-requirements:
281
+ - id: ATR-CTL-AUTONOMY-BOUNDING-AR-1
282
+ text: >-
283
+ An action that commits funds, capacity or an external obligation MUST
284
+ require a recorded human decision, and the deployment MUST be able to
285
+ show which decision authorized a given commitment.
286
+ applicability:
287
+ - request-path
288
+ state: Draft
289
+ recommendation: >-
290
+ Held Draft because ATR cannot assess it. The rules under
291
+ rules/excessive-autonomy detect the shapes that precede an unbounded
292
+ commitment — loop continuation, scope expansion — but nothing in the
293
+ corpus observes whether an approval was obtained, because approval is
294
+ a property of the deployment's control flow rather than of any event
295
+ ATR inspects. Written out so the gap is visible, and Draft so no
296
+ evaluator treats it as assessable today.
297
+ threats:
298
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
299
+ entries:
300
+ - reference-id: ATR-THREAT-UNBOUNDED-COMMITMENT
301
+ state: Draft
302
+ - id: ATR-CTL-ADAPTATION-DATA-SCREENING
303
+ title: Screening of model adaptation data
304
+ objective: Data used to adapt a model is inspected before it shapes behaviour.
305
+ group: pipeline-screening
306
+ assessment-requirements:
307
+ - id: ATR-CTL-ADAPTATION-DATA-SCREENING-AR-1
308
+ text: >-
309
+ Data used to adapt or fine-tune a model MUST be screened for
310
+ attacker-controlled content before it enters the training set.
311
+ applicability:
312
+ - data-pipeline
313
+ state: Draft
314
+ recommendation: >-
315
+ Held Draft because of a mismatch that is easy to state wrongly. ATR
316
+ does carry a rule for this — ATR-2026-00073, Malicious Fine-tuning
317
+ Data, which cites AML.T0020 Poison Training Data — but it binds a
318
+ runtime event field, user_input over an agent I/O source, rather than
319
+ a corpus at rest. A deployment could satisfy this requirement with a
320
+ pipeline scanner ATR had no part in, and ATR could pass a request
321
+ without the training set having been screened. Draft until rules exist
322
+ that run against a corpus rather than an event.
323
+ threats:
324
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
325
+ entries:
326
+ - reference-id: ATR-THREAT-MODEL-BEHAVIOUR-COMPROMISE
327
+ state: Draft