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.
- package/CHANGELOG.md +688 -1
- package/README.md +355 -125
- package/dist/adapters/openshell-filter.d.ts +10 -3
- package/dist/adapters/openshell-filter.d.ts.map +1 -1
- package/dist/adapters/openshell-filter.js +10 -3
- package/dist/adapters/openshell-filter.js.map +1 -1
- package/dist/adapters/stdio-adapter.js +3 -3
- package/dist/adapters/stdio-adapter.js.map +1 -1
- package/dist/cli/mcp-tools-document.d.ts +40 -0
- package/dist/cli/mcp-tools-document.d.ts.map +1 -0
- package/dist/cli/mcp-tools-document.js +95 -0
- package/dist/cli/mcp-tools-document.js.map +1 -0
- package/dist/cli/scan-handler.d.ts +8 -0
- package/dist/cli/scan-handler.d.ts.map +1 -1
- package/dist/cli/scan-handler.js +126 -34
- package/dist/cli/scan-handler.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +80 -43
- package/dist/cli.js.map +1 -1
- package/dist/converters/sarif.d.ts +14 -2
- package/dist/converters/sarif.d.ts.map +1 -1
- package/dist/converters/sarif.js +7 -9
- package/dist/converters/sarif.js.map +1 -1
- package/dist/corpus-event.d.ts +47 -5
- package/dist/corpus-event.d.ts.map +1 -1
- package/dist/corpus-event.js +68 -29
- package/dist/corpus-event.js.map +1 -1
- package/dist/embedding/model-loader.d.ts +2 -0
- package/dist/embedding/model-loader.d.ts.map +1 -1
- package/dist/embedding/model-loader.js +3 -1
- package/dist/embedding/model-loader.js.map +1 -1
- package/dist/enforcement.d.ts +8 -0
- package/dist/enforcement.d.ts.map +1 -1
- package/dist/enforcement.js +10 -0
- package/dist/enforcement.js.map +1 -1
- package/dist/engine.d.ts +150 -6
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +337 -76
- package/dist/engine.js.map +1 -1
- package/dist/eval/embedding-provenance.d.ts +40 -0
- package/dist/eval/embedding-provenance.d.ts.map +1 -0
- package/dist/eval/embedding-provenance.js +71 -0
- package/dist/eval/embedding-provenance.js.map +1 -0
- package/dist/eval/eval-harness.d.ts +34 -0
- package/dist/eval/eval-harness.d.ts.map +1 -1
- package/dist/eval/eval-harness.js +49 -2
- package/dist/eval/eval-harness.js.map +1 -1
- package/dist/eval/hackaprompt-corpus.d.ts +12 -0
- package/dist/eval/hackaprompt-corpus.d.ts.map +1 -1
- package/dist/eval/hackaprompt-corpus.js +15 -1
- package/dist/eval/hackaprompt-corpus.js.map +1 -1
- package/dist/eval/hackaprompt-provenance.d.ts +52 -0
- package/dist/eval/hackaprompt-provenance.d.ts.map +1 -0
- package/dist/eval/hackaprompt-provenance.js +108 -0
- package/dist/eval/hackaprompt-provenance.js.map +1 -0
- package/dist/eval/run-hackaprompt-benchmark.d.ts +18 -8
- package/dist/eval/run-hackaprompt-benchmark.d.ts.map +1 -1
- package/dist/eval/run-hackaprompt-benchmark.js +154 -64
- package/dist/eval/run-hackaprompt-benchmark.js.map +1 -1
- package/dist/eval/run-pint-benchmark.js +11 -1
- package/dist/eval/run-pint-benchmark.js.map +1 -1
- package/dist/eval/skill-benchmark.d.ts +26 -6
- package/dist/eval/skill-benchmark.d.ts.map +1 -1
- package/dist/eval/skill-benchmark.js +49 -16
- package/dist/eval/skill-benchmark.js.map +1 -1
- package/dist/flywheel.d.ts +4 -0
- package/dist/flywheel.d.ts.map +1 -1
- package/dist/flywheel.js +12 -4
- package/dist/flywheel.js.map +1 -1
- package/dist/hook-handler.d.ts +11 -1
- package/dist/hook-handler.d.ts.map +1 -1
- package/dist/hook-handler.js +84 -16
- package/dist/hook-handler.js.map +1 -1
- package/dist/hook-tool-output.d.ts +47 -0
- package/dist/hook-tool-output.d.ts.map +1 -0
- package/dist/hook-tool-output.js +110 -0
- package/dist/hook-tool-output.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/layer-integration.d.ts +4 -2
- package/dist/layer-integration.d.ts.map +1 -1
- package/dist/layer-integration.js +6 -2
- package/dist/layer-integration.js.map +1 -1
- package/dist/mcp-server.d.ts +8 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/scan.d.ts.map +1 -1
- package/dist/mcp-tools/scan.js +9 -1
- package/dist/mcp-tools/scan.js.map +1 -1
- package/dist/measurement/enforce-lane.d.ts +66 -0
- package/dist/measurement/enforce-lane.d.ts.map +1 -0
- package/dist/measurement/enforce-lane.js +89 -0
- package/dist/measurement/enforce-lane.js.map +1 -0
- package/dist/measurement/from-eval-harness.d.ts +16 -3
- package/dist/measurement/from-eval-harness.d.ts.map +1 -1
- package/dist/measurement/from-eval-harness.js +15 -5
- package/dist/measurement/from-eval-harness.js.map +1 -1
- package/dist/measurement/in-sample-ablation.d.ts +29 -0
- package/dist/measurement/in-sample-ablation.d.ts.map +1 -0
- package/dist/measurement/in-sample-ablation.js +45 -0
- package/dist/measurement/in-sample-ablation.js.map +1 -0
- package/dist/measurement/schema.d.ts +38 -1
- package/dist/measurement/schema.d.ts.map +1 -1
- package/dist/measurement/schema.js +43 -1
- package/dist/measurement/schema.js.map +1 -1
- package/dist/quality/action-eligibility.d.ts +4 -2
- package/dist/quality/action-eligibility.d.ts.map +1 -1
- package/dist/quality/action-eligibility.js.map +1 -1
- package/dist/rule-confidence.d.ts +31 -0
- package/dist/rule-confidence.d.ts.map +1 -0
- package/dist/rule-confidence.js +49 -0
- package/dist/rule-confidence.js.map +1 -0
- package/dist/rule-scaffolder.d.ts.map +1 -1
- package/dist/rule-scaffolder.js +43 -4
- package/dist/rule-scaffolder.js.map +1 -1
- package/dist/semantic-evaluator.d.ts.map +1 -1
- package/dist/semantic-evaluator.js +15 -13
- package/dist/semantic-evaluator.js.map +1 -1
- package/dist/shadow-evaluator.d.ts +7 -2
- package/dist/shadow-evaluator.d.ts.map +1 -1
- package/dist/shadow-evaluator.js +29 -25
- package/dist/shadow-evaluator.js.map +1 -1
- package/dist/testcase-event.d.ts +82 -1
- package/dist/testcase-event.d.ts.map +1 -1
- package/dist/testcase-event.js +135 -16
- package/dist/testcase-event.js.map +1 -1
- package/dist/tier0-invariant.d.ts.map +1 -1
- package/dist/tier0-invariant.js +1 -0
- package/dist/tier0-invariant.js.map +1 -1
- package/dist/tier1-blacklist.d.ts.map +1 -1
- package/dist/tier1-blacklist.js +1 -0
- package/dist/tier1-blacklist.js.map +1 -1
- package/dist/tool-definition-scope.d.ts +45 -0
- package/dist/tool-definition-scope.d.ts.map +1 -0
- package/dist/tool-definition-scope.js +68 -0
- package/dist/tool-definition-scope.js.map +1 -0
- package/dist/types.d.ts +42 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/verdict.d.ts +46 -2
- package/dist/verdict.d.ts.map +1 -1
- package/dist/verdict.js +99 -14
- package/dist/verdict.js.map +1 -1
- package/package.json +2 -1
- package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +2 -2
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00328-named-mode-persona-override.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00330-yoja-allcaps-settings-block-persona.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00418-weknora-mcp-config-rce.yaml +5 -5
- package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +3 -3
- package/rules/context-exfiltration/ATR-2026-00426-nl-output-injection-credential-leak.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00851-indirect-pi-financial-payment-exfil.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01457-sysprompt-completion-clone-attack.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01463-imend-imsystem-prompt-injection-format.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02855-cross-email-exfil-relay.yaml +79 -0
- package/rules/context-exfiltration/ATR-2026-02861-exfil-send-email-with-body-directive.yaml +83 -0
- package/rules/context-exfiltration/ATR-2026-02866-idna-label-separator-in-fetch-url-host.yaml +104 -0
- package/rules/excessive-autonomy/ATR-2026-00710-ipi-physical-access-grant.yaml +1 -1
- package/rules/model-abuse/ATR-2026-01897-host-sabotage.yaml +2 -2
- package/rules/model-security/ATR-2026-00433-modelcache-torch-load-deserialization-rce.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00436-enclave-vm-sandbox-escape-rce.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +2 -2
- package/rules/privilege-escalation/ATR-2026-01612-debug-mode-privilege-escalation.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-02867-identifier-typed-tool-argument-dot-dot-path-segment.yaml +106 -0
- package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00080-encoding-evasion.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00086-visual-spoofing.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00228-structured-jailbreak.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00233-structured-jailbreak.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00256-base-n-encoding-jailbreak.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00264-latent-injection-translation.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00265-latent-injection-rag-document.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00282-perez-prompt-injection-hijack.yaml +4 -4
- package/rules/prompt-injection/ATR-2026-00321-hyphenated-system-instruction-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00394-backspace-deletion-character-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00446-variable-assignment-payload-injection.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01005-many-shot-repetition-override.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01006-payload-split-string-concat-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01015-evasion-refusal-suppression.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01016-evasion-response-priming-forced-opener.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01026-evasion-unicode-glitch-token-anomaly.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01304-indirect-injection-carrier-important-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01759-dos-new-important-instructions-injection-in-document.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-02815-injected-halt-order-canned-reply-dos.yaml +80 -0
- package/rules/prompt-injection/ATR-2026-02820-tool-result-orders-agent-to-hide-its-own-action.yaml +106 -0
- package/rules/prompt-injection/ATR-2026-02858-context-suppression-directive.yaml +73 -0
- package/rules/prompt-injection/ATR-2026-02859-tool-output-agent-role-reassignment.yaml +71 -0
- package/rules/prompt-injection/ATR-2026-02860-forged-instruction-boundary-marker.yaml +70 -0
- package/rules/prompt-injection/ATR-2026-02862-fake-chat-template-turn-injection.yaml +79 -0
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-00063-skill-chain-attack.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-00149-skill-exfil-compound.yaml +6 -6
- package/rules/skill-compromise/ATR-2026-00223-reverse-shell-dropper.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-02261-code-credential-exfil-chain.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +23 -23
- package/rules/tool-poisoning/ATR-2026-00013-tool-ssrf.yaml +16 -5
- package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +2 -2
- package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +4 -4
- package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +2 -2
- package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-02025-mcp-full-schema-poisoning-nondescription-field.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-02817-untrusted-content-dictates-tool-arguments.yaml +83 -0
- package/rules/tool-poisoning/ATR-2026-02864-non-canonical-ipv4-host-in-url-tool-argument.yaml +102 -0
- package/rules/tool-poisoning/ATR-2026-02865-read-only-utility-write-flag-in-command-argument.yaml +157 -0
- package/rules/tool-poisoning/ATR-2026-02868-ssrf-ipv6-transition-address-embedded-private-ipv4.yaml +107 -0
- package/spec/README.md +6 -3
- package/spec/atr-event-v1.0.md +13 -8
- package/spec/atr-method-v1.1.md +2 -2
- package/spec/category-registry/gemara/README.md +102 -0
- package/spec/category-registry/gemara/ai-agent-capability-catalog.yaml +157 -0
- package/spec/category-registry/gemara/atr-attack-vector-catalog.yaml +130 -0
- package/spec/category-registry/gemara/atr-detection-control-catalog.yaml +327 -0
- package/spec/category-registry/gemara/atr-threat-catalog.yaml +246 -0
- package/spec/category-registry/gemara/src/editorial.yaml +743 -0
- package/spec/mappings/README.md +1 -1
- package/spec/mappings/atr-to-nist-csf-2.0.md +5 -4
- 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
|