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,743 @@
1
+ # Editorial source for the Gemara catalogs in spec/category-registry/gemara/.
2
+ #
3
+ # The four catalogs one directory up are GENERATED. Do not edit them by hand.
4
+ # They are built by scripts/generate-gemara-catalogs.ts from two inputs:
5
+ #
6
+ # spec/category-registry/v1.0.yaml the category registry. It decides which
7
+ # categories exist, their ids, and their
8
+ # descriptions. Every registry category
9
+ # becomes one vector, with the registry's
10
+ # id and the registry's description.
11
+ # this file everything the registry does not say:
12
+ # vector titles and grouping, and the
13
+ # capability, threat and control catalogs
14
+ # that are written against those vectors.
15
+ #
16
+ # The generator refuses to run when the two disagree: a registry category with
17
+ # no entry here, an entry here for a category the registry does not have, a
18
+ # vector no threat reaches, or a reference to an id that does not exist.
19
+ #
20
+ # After editing this file or the registry:
21
+ # npx tsx scripts/generate-gemara-catalogs.ts
22
+ # CI fails when the committed catalogs differ from the generator output
23
+ # (tests/gemara-catalogs.test.ts).
24
+ #
25
+ # License: MIT
26
+
27
+ bundle:
28
+ # Stamped as metadata.version on all four catalogs and used as the OCI tag
29
+ # (ghcr.io/<owner>/<repo>/gemara:<version>). MAJOR.MINOR must equal the
30
+ # registry version. Bump PATCH with any change here that alters a generated
31
+ # catalog: the publish workflow refuses to push different content under a
32
+ # version that is already published.
33
+ version: "1.0.0"
34
+ # The Gemara release whose CUE schemas these catalogs are validated against.
35
+ gemara-version: "1.6.0"
36
+ author:
37
+ id: atr
38
+ name: Agent Threat Rules
39
+ type: Software Assisted
40
+ contact:
41
+ name: ATR maintainers
42
+ affiliation: Agent Threat Rules
43
+ email: adam@agentthreatrule.org
44
+
45
+ # References to documents outside this repository. A reference is written into
46
+ # a catalog's metadata only when that catalog uses it. The reference to the
47
+ # category registry itself ("ATR") is generated, not declared here.
48
+ external-references:
49
+ - id: OWASP-ASI
50
+ title: OWASP Agentic Security Initiative Top 10
51
+ version: "2026"
52
+ url: "https://genai.owasp.org/"
53
+ description: >
54
+ Guidance each ATR rule already cross-references in its own metadata.
55
+ - id: MITRE-ATLAS
56
+ title: MITRE ATLAS
57
+ version: "2026"
58
+ url: "https://atlas.mitre.org/"
59
+ description: >
60
+ Adversarial technique taxonomy each ATR rule already cross-references.
61
+
62
+ vector-catalog:
63
+ file: atr-attack-vector-catalog.yaml
64
+ id: ATR-AI-AGENT-VECTOR-CATALOG
65
+ title: AI Agent Attack Vector Catalog (ATR)
66
+ description: >
67
+ Attack vectors against AI agent systems, one per detection category in the
68
+ Agent Threat Rules (ATR) category registry. A category is a method by which
69
+ a threat is realized rather than the threat itself, which is why it lives
70
+ here and is referenced from the threat catalog rather than restated in it.
71
+ Generated from the registry: each vector id is a registry category id and
72
+ each description is the registry's description of that category.
73
+
74
+ Validated against Gemara's #VectorCatalog, which is marked experimental in
75
+ vectorcatalog.cue; this artifact may need to change with the schema.
76
+ groups:
77
+ - id: via-content
78
+ title: Through content the agent reads
79
+ description: >
80
+ Vectors that arrive inside data the agent ingests and are acted on as
81
+ though they were operator instructions.
82
+ - id: via-extension
83
+ title: Through an artifact the agent loads
84
+ description: >
85
+ Vectors carried by tools, skills, plugins or model artifacts, which
86
+ arrive through the supply chain rather than the conversation.
87
+ - id: via-authority
88
+ title: Through the authority the agent holds
89
+ description: >
90
+ Vectors that exploit what the agent is permitted to do rather than what
91
+ it is told.
92
+ # Keyed by registry category id. Title and group only: the description is
93
+ # taken from the registry.
94
+ vectors:
95
+ prompt-injection:
96
+ title: Instruction injection into model context
97
+ group: via-content
98
+ model-abuse:
99
+ title: Model-level evasion of robustness and oversight
100
+ group: via-content
101
+ data-poisoning:
102
+ title: Poisoning of state the agent will read later
103
+ group: via-content
104
+ agent-manipulation:
105
+ title: Forged peer-agent identity and message framing
106
+ group: via-content
107
+ tool-poisoning:
108
+ title: Manipulation of tool calls and tool output
109
+ group: via-extension
110
+ skill-compromise:
111
+ title: Compromised skill, plugin or server package
112
+ group: via-extension
113
+ model-security:
114
+ title: Attack on the model artifact
115
+ group: via-extension
116
+ context-exfiltration:
117
+ title: Context and credential exfiltration
118
+ group: via-authority
119
+ privilege-escalation:
120
+ title: Privilege escalation and delegated authority abuse
121
+ group: via-authority
122
+ excessive-autonomy:
123
+ title: Action beyond declared scope or authorization
124
+ group: via-authority
125
+
126
+ capability-catalog:
127
+ file: ai-agent-capability-catalog.yaml
128
+ id: ATR-AI-AGENT-CAPABILITY-CATALOG
129
+ title: AI Agent Capability Catalog
130
+ description: >
131
+ Capabilities of AI agent systems that create the opportunity for the
132
+ threats catalogued by Agent Threat Rules (ATR). Each capability describes
133
+ a feature or function an agent can perform, not a threat. Threats in the
134
+ companion threat catalog reference these capabilities. Authored by the ATR
135
+ project and validated against the Gemara schemas; ATR hosts the content,
136
+ Gemara defines the schema.
137
+ groups:
138
+ - id: model-interaction
139
+ title: Model Interaction
140
+ description: >
141
+ Capabilities by which an agent receives instructions and untrusted
142
+ content into a language model and acts on the model's output.
143
+ - id: tool-and-protocol
144
+ title: Tool and Protocol Access
145
+ description: >
146
+ Capabilities by which an agent invokes external tools and connects to
147
+ tool servers over protocols such as the Model Context Protocol (MCP).
148
+ - id: extensibility
149
+ title: Extensibility
150
+ description: >
151
+ Capabilities by which an agent loads and runs third-party extensions
152
+ such as skills, plugins, and packaged capability bundles.
153
+ - id: state-and-memory
154
+ title: State and Memory
155
+ description: >
156
+ Capabilities by which an agent reads and writes persistent state,
157
+ conversation context, and long-term memory across turns and sessions.
158
+ - id: autonomy-and-coordination
159
+ title: Autonomy and Coordination
160
+ description: >
161
+ Capabilities by which an agent acts without per-step human approval and
162
+ coordinates with other agents.
163
+ - id: model-supply-chain
164
+ title: Model supply chain
165
+ description: >
166
+ Capabilities by which the model an agent depends on is built, packaged
167
+ and loaded. These sit outside agent runtime: they shape behaviour before
168
+ any request is served.
169
+ capabilities:
170
+ - id: CAP-MODEL-INFERENCE
171
+ title: Model Inference on Untrusted Input
172
+ description: >
173
+ The agent passes user instructions and content drawn from external
174
+ sources into a language model and treats the resulting output as
175
+ actionable. Mixing trusted instructions with untrusted content in a
176
+ single context window is the feature that makes prompt injection and
177
+ jailbreak attempts possible.
178
+ group: model-interaction
179
+ - id: CAP-OUTPUT-ACTION
180
+ title: Acting on Model Output
181
+ description: >
182
+ The agent converts model output into actions, tool calls, or content
183
+ returned to downstream systems. Because output is consumed without an
184
+ independent trust boundary, manipulated output can redirect behaviour
185
+ or carry exfiltrated data.
186
+ group: model-interaction
187
+ - id: CAP-TOOL-INVOCATION
188
+ title: Tool Invocation
189
+ description: >
190
+ The agent calls external tools and functions, passing arguments and
191
+ receiving results that re-enter the model context. Tool arguments and
192
+ tool results are an attack surface for injection, command execution,
193
+ and over-broad actions.
194
+ group: tool-and-protocol
195
+ - id: CAP-MCP-CONNECTION
196
+ title: MCP and Tool-Server Connection
197
+ description: >
198
+ The agent connects to tool servers over the Model Context Protocol or
199
+ similar transports, consuming server-provided tool manifests, schemas,
200
+ and descriptions. Server-controlled metadata is trusted at connection
201
+ time, which creates the opportunity for tool poisoning and tool
202
+ redefinition (rug-pull) after initial approval.
203
+ group: tool-and-protocol
204
+ - id: CAP-CROSS-AGENT-MESSAGING
205
+ title: Cross-Agent Message Passing
206
+ description: >
207
+ The agent sends and receives messages to and from other agents in a
208
+ multi-agent workflow. Messages from peer agents are treated as
209
+ trusted input, which lets a compromised or manipulated agent influence
210
+ others.
211
+ group: tool-and-protocol
212
+ - id: CAP-SKILL-LOADING
213
+ title: Skill and Plugin Loading
214
+ description: >
215
+ The agent loads third-party skills, plugins, or capability bundles and
216
+ executes the instructions and code they contain. Loaded extensions run
217
+ with the agent's privileges, which creates the opportunity for supply
218
+ chain compromise and backdoored or over-privileged skills.
219
+ group: extensibility
220
+ - id: CAP-MEMORY-WRITE
221
+ title: Memory and State Write
222
+ description: >
223
+ The agent writes facts, instructions, or artifacts into persistent
224
+ memory or shared state that influences later turns and sessions.
225
+ Writable memory is the feature that lets poisoned content persist and
226
+ take effect after the originating input is gone.
227
+ group: state-and-memory
228
+ - id: CAP-MEMORY-READ
229
+ title: Context and Memory Read
230
+ description: >
231
+ The agent reads conversation history, retrieved documents, and
232
+ long-term memory back into the active context. Reading attacker-
233
+ influenced state re-introduces untrusted content and is a channel for
234
+ indirect injection and staged data exfiltration.
235
+ group: state-and-memory
236
+ - id: CAP-AUTONOMOUS-ACTION
237
+ title: Autonomous Action Without Per-Step Approval
238
+ description: >
239
+ The agent executes multi-step plans, loops, and side-effecting actions
240
+ without human approval at each step. Unbounded autonomy is the feature
241
+ that turns a single manipulated decision into runaway loops, resource
242
+ abuse, or unauthorized real-world actions.
243
+ group: autonomy-and-coordination
244
+ - id: CAP-PRIVILEGED-EXECUTION
245
+ title: Privileged and Delegated Execution
246
+ description: >
247
+ The agent runs with delegated credentials and access to systems,
248
+ databases, files, and networks. Holding standing privilege creates the
249
+ opportunity for privilege escalation, sandbox escape, and use of the
250
+ agent's access beyond its intended scope.
251
+ group: autonomy-and-coordination
252
+ - id: CAP-MODEL-ARTIFACT-LOADING
253
+ title: Model Artifact Loading
254
+ description: >
255
+ The agent depends on a serialized model artifact that is fetched from a
256
+ registry or filesystem and deserialized into an executable object before
257
+ any behavioural check runs. The artifact is trusted at the moment it is
258
+ least verified.
259
+ group: model-supply-chain
260
+ - id: CAP-TRAINING-DATA-INGESTION
261
+ title: Training and Fine-Tuning Data Ingestion
262
+ description: >
263
+ The model the agent depends on is adapted using data drawn from sources
264
+ the operator does not fully control. Ingested data shapes behaviour after
265
+ the originating input is gone, and every deployment of the resulting model
266
+ carries that shaping.
267
+ group: model-supply-chain
268
+
269
+ threat-catalog:
270
+ file: atr-threat-catalog.yaml
271
+ id: ATR-AI-AGENT-THREAT-CATALOG
272
+ title: AI Agent Threat Catalog
273
+ description: >
274
+ Threats to an organization operating AI agents, written at the level of
275
+ what goes wrong and why it matters. Each threat names the capabilities that
276
+ create the opportunity for it and the attack vectors through which it is
277
+ realized. The counts deliberately do not line up: several vectors reach the
278
+ same impact, and one vector reaches more than one.
279
+ # Description written on each mapping-reference this catalog carries to
280
+ # another catalog in the bundle.
281
+ reference-descriptions:
282
+ ATR-AI-AGENT-CAPABILITY-CATALOG: >
283
+ Capabilities of AI agent systems that create the opportunity for these
284
+ threats.
285
+ ATR-AI-AGENT-VECTOR-CATALOG: >
286
+ Methods by which these threats are realized, corresponding to ATR's
287
+ detection categories.
288
+ groups:
289
+ - id: unauthorized-action
290
+ title: Action the operator did not authorize
291
+ description: Impacts arising from the agent doing something on the operator's behalf.
292
+ - id: loss-of-confidentiality
293
+ title: Loss of confidentiality
294
+ description: Impacts arising from data leaving the boundary the operator set.
295
+ - id: loss-of-containment
296
+ title: Loss of containment
297
+ description: Impacts arising from execution or authority escaping its intended bound.
298
+ threats:
299
+ - id: ATR-THREAT-UNAUTHORIZED-ACTION
300
+ title: Unauthorized action executed with the operator's standing authority
301
+ description: >
302
+ The agent takes a consequential action the operator never requested — a
303
+ tool call, a write, a message to a third party — because instructions
304
+ reached the model from a source the operator does not control. The action
305
+ carries the operator's own credentials and audit identity, so it is
306
+ indistinguishable from legitimate use after the fact, and remediation
307
+ means unwinding real effects rather than revoking a session.
308
+ group: unauthorized-action
309
+ capabilities:
310
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
311
+ entries:
312
+ - reference-id: CAP-OUTPUT-ACTION
313
+ - reference-id: CAP-TOOL-INVOCATION
314
+ - reference-id: CAP-MODEL-INFERENCE
315
+ - reference-id: CAP-MCP-CONNECTION
316
+ - reference-id: CAP-CROSS-AGENT-MESSAGING
317
+ vectors:
318
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
319
+ entries:
320
+ - reference-id: prompt-injection
321
+ - reference-id: tool-poisoning
322
+ - reference-id: agent-manipulation
323
+ - reference-id: model-abuse
324
+ remarks: >
325
+ Four vectors reach this one impact. Which of them a deployment is
326
+ exposed to depends on whether it ingests untrusted content, connects
327
+ to third-party tool servers, or runs more than one agent.
328
+ actors:
329
+ - id: external-content-author
330
+ name: Author of content the agent ingests
331
+ type: Human
332
+
333
+ - id: ATR-THREAT-DELAYED-UNAUTHORIZED-ACTION
334
+ title: Unauthorized action triggered long after the input that caused it
335
+ description: >
336
+ Attacker-controlled content is written into memory, cache or a retrieved
337
+ corpus and shapes a decision in a later session. The organization loses
338
+ the ability to reason about an incident from its inputs, because the
339
+ request that produced the harmful action is clean and the poisoned state
340
+ is not attributable to it without retained provenance.
341
+ group: unauthorized-action
342
+ capabilities:
343
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
344
+ entries:
345
+ - reference-id: CAP-MEMORY-WRITE
346
+ - reference-id: CAP-MEMORY-READ
347
+ vectors:
348
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
349
+ entries:
350
+ - reference-id: data-poisoning
351
+ - reference-id: prompt-injection
352
+ remarks: >
353
+ Separated from the immediate case because the detection opportunity is
354
+ at write time, not at the time of the harmful action.
355
+ actors:
356
+ - id: external-content-author
357
+ name: Author of content the agent ingests
358
+ type: Human
359
+
360
+ - id: ATR-THREAT-CONTEXT-DISCLOSURE
361
+ title: Disclosure of conversation context, credentials and retrieved data
362
+ description: >
363
+ Credentials, prior conversation content or documents the agent was able
364
+ to retrieve leave the trust boundary through an outbound call the agent
365
+ is permitted to make. The organization loses control of secrets and of
366
+ whatever customer data the agent could read, and because the call is
367
+ permitted, network controls do not register it as an incident.
368
+ group: loss-of-confidentiality
369
+ capabilities:
370
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
371
+ entries:
372
+ - reference-id: CAP-OUTPUT-ACTION
373
+ - reference-id: CAP-TOOL-INVOCATION
374
+ - reference-id: CAP-MEMORY-READ
375
+ vectors:
376
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
377
+ entries:
378
+ - reference-id: context-exfiltration
379
+ - reference-id: prompt-injection
380
+ - reference-id: model-security
381
+ remarks: >
382
+ Model-security appears here for behaviour extraction: systematic
383
+ probing recovers the system prompt, which is context disclosure by a
384
+ different route than an outbound call.
385
+ actors:
386
+ - id: external-content-author
387
+ name: Author of content the agent ingests
388
+ type: Human
389
+
390
+ - id: ATR-THREAT-EXECUTION-ESCAPE
391
+ title: Code execution or privilege beyond the agent's intended bound
392
+ description: >
393
+ Execution or authority escapes the scope the deployment intended, whether
394
+ through a delegation chain, a reused credential, a hostile extension, or
395
+ deserialization of an untrusted artifact at load time. This is the impact
396
+ where the blast radius is not bounded by the agent: the host, adjacent
397
+ workloads and any credential reachable from them are in scope.
398
+ group: loss-of-containment
399
+ capabilities:
400
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
401
+ entries:
402
+ - reference-id: CAP-PRIVILEGED-EXECUTION
403
+ - reference-id: CAP-SKILL-LOADING
404
+ - reference-id: CAP-MODEL-ARTIFACT-LOADING
405
+ vectors:
406
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
407
+ entries:
408
+ - reference-id: privilege-escalation
409
+ - reference-id: skill-compromise
410
+ - reference-id: model-security
411
+ remarks: >
412
+ Three vectors, one blast radius. What these share is that execution or
413
+ authority leaves the agent's bound, not how it got there, so the
414
+ containment question is the same in all three cases. Which one a
415
+ deployment is exposed to follows from whether it loads third-party
416
+ extensions, deserializes model artifacts, or delegates credentials.
417
+ actors:
418
+ - id: extension-publisher
419
+ name: Publisher of a third-party skill, plugin or tool server
420
+ type: Human
421
+ - id: tenant-user
422
+ name: A user with legitimate access to the agent
423
+ type: Human
424
+
425
+ - id: ATR-THREAT-UNBOUNDED-COMMITMENT
426
+ title: Commitment of resources without a human decision
427
+ description: >
428
+ The agent commits money, capacity or an external obligation where a human
429
+ approval was intended, or continues acting past its objective. The cost is
430
+ incurred rather than risked, and the organization discovers it from the
431
+ effect rather than from a security signal.
432
+ group: unauthorized-action
433
+ capabilities:
434
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
435
+ entries:
436
+ - reference-id: CAP-AUTONOMOUS-ACTION
437
+ - reference-id: CAP-OUTPUT-ACTION
438
+ vectors:
439
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
440
+ entries:
441
+ - reference-id: excessive-autonomy
442
+ actors:
443
+ - id: tenant-user
444
+ name: A user with legitimate access to the agent
445
+ type: Human
446
+
447
+ - id: ATR-THREAT-MODEL-BEHAVIOUR-COMPROMISE
448
+ title: Compromise of the model's behaviour through its supply chain
449
+ description: >
450
+ The behaviour of the deployed model is shaped by an attacker before the
451
+ agent ever runs, through poisoned adaptation data. Nothing in the request
452
+ path is anomalous, so runtime inspection cannot see it, and the defect is
453
+ carried by every deployment of that model until it is retrained.
454
+ group: loss-of-containment
455
+ capabilities:
456
+ - reference-id: ATR-AI-AGENT-CAPABILITY-CATALOG
457
+ entries:
458
+ - reference-id: CAP-TRAINING-DATA-INGESTION
459
+ vectors:
460
+ - reference-id: ATR-AI-AGENT-VECTOR-CATALOG
461
+ entries:
462
+ - reference-id: model-security
463
+ remarks: >
464
+ The detection opportunity here is in the data pipeline, not on the
465
+ request path, which is why it is a distinct threat from the execution
466
+ escape that shares the same vector.
467
+ actors:
468
+ - id: upstream-model-supplier
469
+ name: Producer of the model or of its adaptation data
470
+ type: Human
471
+
472
+ control-catalog:
473
+ file: atr-detection-control-catalog.yaml
474
+ id: ATR-DETECTION-CONTROL-CATALOG
475
+ title: ATR Detection Control Catalog
476
+ description: >
477
+ Detection controls an operator can apply using Agent Threat Rules (ATR),
478
+ organized by where in the lifecycle the inspection happens rather than by
479
+ which rule category is used. Three are written out; the rest are declared
480
+ Draft rather than filled in with the same text, because a control whose
481
+ assessment requirement cannot fail is not a control. The OWASP ASI and
482
+ MITRE ATLAS references on each control are the modal references on the
483
+ rules in the categories it is implemented with, as counted on the rule
484
+ corpus on 2026-08-24; they are not recomputed when rules change.
485
+ reference-descriptions:
486
+ ATR-AI-AGENT-THREAT-CATALOG: Threats these controls are intended to detect.
487
+ applicability-groups:
488
+ - id: pre-load
489
+ title: Before an artifact is loaded
490
+ description: >
491
+ Applies where an artifact is inspected before the agent can use it —
492
+ skills, plugins, tool manifests, model files.
493
+ - id: request-path
494
+ title: On the request path
495
+ description: >
496
+ Applies where content is inspected while the agent is running, before
497
+ it reaches the model or leaves the boundary.
498
+ - id: at-write
499
+ title: When content is committed to durable state
500
+ description: >
501
+ Applies when content is written to memory, a cache or a retrieval
502
+ corpus, regardless of whether an agent is executing at the time.
503
+ - id: data-pipeline
504
+ title: In the data pipeline
505
+ description: >
506
+ Applies where training or adaptation data is assembled, ahead of any
507
+ agent execution.
508
+ groups:
509
+ - id: artifact-screening
510
+ title: Artifact screening
511
+ description: Controls that inspect something before the agent is allowed to use it.
512
+ - id: content-screening
513
+ title: Content screening
514
+ description: Controls that inspect content on the request or response path.
515
+ - id: pipeline-screening
516
+ title: Pipeline screening
517
+ description: Controls that inspect data before it shapes a model.
518
+ controls:
519
+ - id: ATR-CTL-EXTENSION-SCREENING
520
+ title: Screening of loadable extensions before use
521
+ objective: >
522
+ No skill, plugin, tool manifest or model artifact becomes available to the
523
+ agent without having been inspected for hostile content, and the operator
524
+ can tell afterwards which ruleset that inspection was performed under.
525
+ group: artifact-screening
526
+ assessment-requirements:
527
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-1
528
+ text: >
529
+ Every extension artifact MUST be scanned before it is registered as
530
+ available to the agent, and registration MUST fail closed when the
531
+ scan cannot complete or the ruleset version cannot be resolved.
532
+ applicability: [pre-load]
533
+ recommendation: >
534
+ Failing closed is the part that is usually skipped. A scanner that is
535
+ unreachable and treated as a pass converts this control into a
536
+ formality without changing any observable behaviour.
537
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-2
538
+ text: >
539
+ A serialized model artifact MUST NOT be deserialized before its digest
540
+ has been checked against the digest recorded when it was screened.
541
+ applicability: [pre-load]
542
+ recommendation: >
543
+ Deserialization is the execution boundary for this class of artifact,
544
+ so a check performed after loading has already lost.
545
+ - id: ATR-CTL-EXTENSION-SCREENING-AR-3
546
+ text: >
547
+ The ruleset version in effect MUST be recorded with each screening
548
+ result and retained for as long as the artifact remains registered.
549
+ applicability: [pre-load]
550
+ recommendation: >
551
+ A clean result is bounded by the rules that ran. Without the version,
552
+ a later question about coverage has no answer.
553
+ guidelines:
554
+ - reference-id: OWASP-ASI
555
+ entries:
556
+ - reference-id: "ASI04:2026"
557
+ - reference-id: "ASI05:2026"
558
+ - reference-id: MITRE-ATLAS
559
+ entries:
560
+ - reference-id: AML.T0010
561
+ - reference-id: ATR
562
+ entries:
563
+ - reference-id: skill-compromise
564
+ - reference-id: model-security
565
+ remarks: >
566
+ The rule categories this control is implemented with; each id is a
567
+ category in the ATR category registry and a directory under rules/.
568
+ threats:
569
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
570
+ entries:
571
+ - reference-id: ATR-THREAT-EXECUTION-ESCAPE
572
+ - reference-id: ATR-THREAT-UNAUTHORIZED-ACTION
573
+ remarks: >
574
+ Screening covers both because a hostile extension can either execute
575
+ directly or steer the model into acting; the rules that detect each
576
+ differ, the moment of inspection does not.
577
+ state: Active
578
+
579
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING
580
+ title: Screening of untrusted content entering model context
581
+ objective: >
582
+ Content reaching the model from a source the operator does not control is
583
+ inspected for embedded instructions before the agent acts on it, and a
584
+ detection carries enough provenance for a human to adjudicate it.
585
+ group: content-screening
586
+ assessment-requirements:
587
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-1
588
+ text: >
589
+ Content retrieved from an external source MUST be inspected before it
590
+ enters the model context, and each detection MUST record the matching
591
+ rule id, the ruleset version, and the location of the match within the
592
+ content.
593
+ applicability: [request-path]
594
+ recommendation: >
595
+ Recording the location is what makes a detection adjudicable. A rule
596
+ id alone tells a reviewer that something matched, not what.
597
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-2
598
+ text: >
599
+ Content written into persistent memory or a retrieval corpus MUST be
600
+ inspected at write time as well as at read time.
601
+ applicability: [request-path, at-write]
602
+ recommendation: >
603
+ Write-time inspection is the only point at which the originating
604
+ request is still available to attribute a later action to.
605
+ - id: ATR-CTL-INBOUND-CONTENT-SCREENING-AR-3
606
+ text: >
607
+ The deployment MUST record which rule maturity lane was in effect for
608
+ each inspection, and MUST NOT block on a lane the operator has not
609
+ accepted for blocking.
610
+ applicability: [request-path]
611
+ recommendation: >
612
+ ATR publishes rules at differing maturity. Blocking on a lane intended
613
+ for triage converts a detection surface into an availability incident.
614
+ guidelines:
615
+ - reference-id: OWASP-ASI
616
+ entries:
617
+ - reference-id: "ASI01:2026"
618
+ - reference-id: "ASI06:2026"
619
+ - reference-id: MITRE-ATLAS
620
+ entries:
621
+ - reference-id: AML.T0051
622
+ - reference-id: ATR
623
+ entries:
624
+ - reference-id: prompt-injection
625
+ - reference-id: data-poisoning
626
+ remarks: >
627
+ The rule categories this control is implemented with; each id is a
628
+ category in the ATR category registry and a directory under rules/.
629
+ threats:
630
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
631
+ entries:
632
+ - reference-id: ATR-THREAT-UNAUTHORIZED-ACTION
633
+ - reference-id: ATR-THREAT-DELAYED-UNAUTHORIZED-ACTION
634
+ state: Active
635
+
636
+ - id: ATR-CTL-EGRESS-SCREENING
637
+ title: Screening of agent-initiated egress
638
+ objective: >
639
+ Content the agent sends outside the trust boundary is inspected before it
640
+ leaves, so that a permitted call carrying context or credentials is
641
+ surfaced rather than passing on the strength of its destination.
642
+ group: content-screening
643
+ assessment-requirements:
644
+ - id: ATR-CTL-EGRESS-SCREENING-AR-1
645
+ text: >
646
+ Outbound request content MUST be inspected before the request is
647
+ issued, not reconstructed from logs afterwards.
648
+ applicability: [request-path]
649
+ recommendation: >
650
+ Post-hoc inspection can attribute a disclosure but cannot prevent it,
651
+ and for credentials the distinction is the whole control.
652
+ - id: ATR-CTL-EGRESS-SCREENING-AR-2
653
+ text: >
654
+ Credential-bearing headers MUST be redacted before content is passed
655
+ to inspection, and a detection MUST NOT reproduce matched credential
656
+ material in its finding.
657
+ applicability: [request-path]
658
+ recommendation: >
659
+ A detection surface that stores what it detected becomes a second
660
+ copy of the secret, in a system usually held to a lower standard.
661
+ - id: ATR-CTL-EGRESS-SCREENING-AR-3
662
+ text: >
663
+ Where inspection cannot evaluate a request shape, the deployment MUST
664
+ record that the request was not evaluated rather than recording it as
665
+ clean.
666
+ applicability: [request-path]
667
+ recommendation: >
668
+ Rules are written against an event vocabulary. Where a request does
669
+ not map onto it, "no finding" and "not looked at" are different facts
670
+ and only one of them is safe to aggregate.
671
+ guidelines:
672
+ - reference-id: MITRE-ATLAS
673
+ entries:
674
+ - reference-id: AML.T0057
675
+ - reference-id: AML.T0056
676
+ - reference-id: ATR
677
+ entries:
678
+ - reference-id: context-exfiltration
679
+ remarks: >
680
+ The rule category this control is implemented with. No OWASP ASI
681
+ entry is cited: the modal reference on these rules is ASI01, which
682
+ names the injection that induces the disclosure rather than the
683
+ disclosure itself, so citing it here would overstate the fit.
684
+ threats:
685
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
686
+ entries:
687
+ - reference-id: ATR-THREAT-CONTEXT-DISCLOSURE
688
+ state: Active
689
+
690
+ - id: ATR-CTL-AUTONOMY-BOUNDING
691
+ title: Bounding of unattended commitment
692
+ objective: >
693
+ Consequential commitments made without a human decision point are
694
+ detected and bounded.
695
+ group: content-screening
696
+ assessment-requirements:
697
+ - id: ATR-CTL-AUTONOMY-BOUNDING-AR-1
698
+ text: >
699
+ An action that commits funds, capacity or an external obligation MUST
700
+ require a recorded human decision, and the deployment MUST be able to
701
+ show which decision authorized a given commitment.
702
+ applicability: [request-path]
703
+ state: Draft
704
+ recommendation: >
705
+ Held Draft because ATR cannot assess it. The rules under
706
+ rules/excessive-autonomy detect the shapes that precede an unbounded
707
+ commitment — loop continuation, scope expansion — but nothing in the
708
+ corpus observes whether an approval was obtained, because approval is
709
+ a property of the deployment's control flow rather than of any event
710
+ ATR inspects. Written out so the gap is visible, and Draft so no
711
+ evaluator treats it as assessable today.
712
+ threats:
713
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
714
+ entries:
715
+ - reference-id: ATR-THREAT-UNBOUNDED-COMMITMENT
716
+ state: Draft
717
+
718
+ - id: ATR-CTL-ADAPTATION-DATA-SCREENING
719
+ title: Screening of model adaptation data
720
+ objective: >
721
+ Data used to adapt a model is inspected before it shapes behaviour.
722
+ group: pipeline-screening
723
+ assessment-requirements:
724
+ - id: ATR-CTL-ADAPTATION-DATA-SCREENING-AR-1
725
+ text: >
726
+ Data used to adapt or fine-tune a model MUST be screened for
727
+ attacker-controlled content before it enters the training set.
728
+ applicability: [data-pipeline]
729
+ state: Draft
730
+ recommendation: >
731
+ Held Draft because of a mismatch that is easy to state wrongly. ATR
732
+ does carry a rule for this — ATR-2026-00073, Malicious Fine-tuning
733
+ Data, which cites AML.T0020 Poison Training Data — but it binds a
734
+ runtime event field, user_input over an agent I/O source, rather than
735
+ a corpus at rest. A deployment could satisfy this requirement with a
736
+ pipeline scanner ATR had no part in, and ATR could pass a request
737
+ without the training set having been screened. Draft until rules
738
+ exist that run against a corpus rather than an event.
739
+ threats:
740
+ - reference-id: ATR-AI-AGENT-THREAT-CATALOG
741
+ entries:
742
+ - reference-id: ATR-THREAT-MODEL-BEHAVIOUR-COMPROMISE
743
+ state: Draft