agent-threat-rules 2.2.1 → 3.0.5
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/README.md +365 -327
- package/dist/engine.d.ts +46 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +242 -1
- package/dist/engine.js.map +1 -1
- package/dist/eval/eval-harness.d.ts.map +1 -1
- package/dist/eval/eval-harness.js +9 -0
- package/dist/eval/eval-harness.js.map +1 -1
- package/dist/eval/run-hackaprompt-benchmark.js +9 -0
- package/dist/eval/run-hackaprompt-benchmark.js.map +1 -1
- package/dist/eval/run-pint-benchmark.js +9 -0
- package/dist/eval/run-pint-benchmark.js.map +1 -1
- package/dist/eval/skill-benchmark.d.ts +11 -0
- package/dist/eval/skill-benchmark.d.ts.map +1 -1
- package/dist/eval/skill-benchmark.js +57 -0
- package/dist/eval/skill-benchmark.js.map +1 -1
- package/dist/measurement/from-eval-harness.d.ts +70 -0
- package/dist/measurement/from-eval-harness.d.ts.map +1 -0
- package/dist/measurement/from-eval-harness.js +49 -0
- package/dist/measurement/from-eval-harness.js.map +1 -0
- package/dist/measurement/schema.d.ts +152 -0
- package/dist/measurement/schema.d.ts.map +1 -0
- package/dist/measurement/schema.js +178 -0
- package/dist/measurement/schema.js.map +1 -0
- package/dist/measurement/write.d.ts +64 -0
- package/dist/measurement/write.d.ts.map +1 -0
- package/dist/measurement/write.js +163 -0
- package/dist/measurement/write.js.map +1 -0
- package/dist/semantic-evaluator.d.ts +48 -0
- package/dist/semantic-evaluator.d.ts.map +1 -0
- package/dist/semantic-evaluator.js +107 -0
- package/dist/semantic-evaluator.js.map +1 -0
- package/dist/trace-evaluator.d.ts +22 -0
- package/dist/trace-evaluator.d.ts.map +1 -0
- package/dist/trace-evaluator.js +249 -0
- package/dist/trace-evaluator.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/rules/agent-manipulation/ATR-2026-00552-goal-drift-after-pressure-injection.yaml +216 -0
- package/rules/context-exfiltration/ATR-2026-00524-claude-code-anthropic-base-url-credential-exfil.yaml +257 -0
- package/rules/context-exfiltration/ATR-2026-00548-cross-agent-session-context-leak.yaml +177 -0
- package/rules/excessive-autonomy/ATR-2026-00553-runaway-tool-loop-behavioral.yaml +174 -0
- package/rules/privilege-escalation/ATR-2026-00528-praisonai-auth-disabled-default.yaml +192 -0
- package/rules/privilege-escalation/ATR-2026-00539-crewai-codeinterpreter-sandbox-escape-rce.yaml +292 -0
- package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +162 -0
- package/rules/privilege-escalation/ATR-2026-00547-crewai-rag-url-ssrf-bypass.yaml +167 -0
- package/rules/privilege-escalation/ATR-2026-00549-destructive-tool-without-human-approval.yaml +193 -0
- package/rules/privilege-escalation/ATR-2026-00551-cross-conversation-memory-write.yaml +198 -0
- package/rules/prompt-injection/ATR-2026-00535-windsurf-ide-zero-click-prompt-injection.yaml +199 -0
- package/rules/prompt-injection/ATR-2026-00550-untrusted-retrieval-to-privileged-tool.yaml +199 -0
- package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +5 -2
- package/rules/skill-compromise/ATR-2026-00523-claude-code-hooks-session-start-pre-trust-rce.yaml +221 -0
- package/rules/skill-compromise/ATR-2026-00525-mini-shai-hulud-gh-token-monitor-persistence.yaml +220 -0
- package/rules/skill-compromise/ATR-2026-00527-skill-silent-git-remote-mirror-exfiltration.yaml +201 -0
- package/rules/tool-poisoning/ATR-2026-00526-claude-code-shell-metachar-in-double-quoted-path.yaml +167 -0
- package/rules/tool-poisoning/ATR-2026-00529-litellm-proxy-sqli-cisa-kev.yaml +158 -0
- package/rules/tool-poisoning/ATR-2026-00530-ms-agent-shell-tool-unsanitized-argv-rce.yaml +184 -0
- package/rules/tool-poisoning/ATR-2026-00531-praisonai-unauthenticated-agent-api.yaml +174 -0
- package/rules/tool-poisoning/ATR-2026-00532-apache-doris-mcp-sql-injection.yaml +155 -0
- package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +151 -0
- package/rules/tool-poisoning/ATR-2026-00534-alibaba-rds-mcp-unauthenticated-metadata-exfil.yaml +155 -0
- package/rules/tool-poisoning/ATR-2026-00536-nginx-ui-mcp-unauthenticated-command-execution.yaml +199 -0
- package/rules/tool-poisoning/ATR-2026-00537-fastmcp-server-name-cmd-injection-windows.yaml +226 -0
- package/rules/tool-poisoning/ATR-2026-00538-langchain-chatchat-mcp-stdio-unauthenticated-rce.yaml +244 -0
- package/rules/tool-poisoning/ATR-2026-00540-praisonai-parse-mcp-command-cli-injection.yaml +186 -0
- package/rules/tool-poisoning/ATR-2026-00541-agent-zero-mcp-config-command-injection.yaml +183 -0
- package/rules/tool-poisoning/ATR-2026-00542-upsonic-mcp-command-allowlist-bypass.yaml +166 -0
- package/rules/tool-poisoning/ATR-2026-00543-litellm-mcp-server-argv-injection.yaml +168 -0
- package/rules/tool-poisoning/ATR-2026-00544-praisonai-pth-file-path-traversal-rce.yaml +172 -0
- package/rules/tool-poisoning/ATR-2026-00545-praisonai-tool-override-unauth-rce.yaml +170 -0
- package/spec/README.md +279 -0
- package/spec/atr-correlation-v1.0.md +281 -0
- package/spec/atr-event-v1.0.md +294 -0
- package/spec/atr-language-detection-v1.0.md +218 -0
- package/spec/atr-method-v1.1.md +557 -0
- package/spec/atr-profile-v1.0.md +307 -0
- package/spec/atr-schema.yaml +279 -8
- package/spec/category-registry/v1.0.yaml +200 -0
- package/spec/conformance/README.md +244 -0
- package/spec/conformance/SIGNING.md +191 -0
- package/spec/conformance/baseline/fixtures/ATR-2026-00001-tp-001/expected.json +36 -0
- package/spec/conformance/baseline/fixtures/ATR-2026-00001-tp-001/input.json +16 -0
- package/spec/conformance/baseline/fixtures/README.md +120 -0
- package/spec/conformance/baseline/manifest.json +56 -0
- package/spec/conformance/expected-results.schema.json +121 -0
- package/spec/external-registries/cccs-yara.md +142 -0
- package/spec/internet-drafts/draft-lin-atr-core-00.html +1925 -0
- package/spec/internet-drafts/draft-lin-atr-core-00.md +288 -0
- package/spec/internet-drafts/draft-lin-atr-core-00.txt +560 -0
- package/spec/internet-drafts/draft-lin-atr-core-00.xml +424 -0
- package/spec/mappings/README.md +43 -0
- package/spec/mappings/atr-to-nist-csf-2.0.md +234 -0
- package/spec/schema/correlation.schema.json +144 -0
- package/spec/schema/event.schema.json +233 -0
- package/spec/schema/profile.schema.json +196 -0
- package/spec/schema/rule.schema.json +224 -0
- package/spec/stix-extension/README.md +76 -13
- package/spec/stix-extension/examples/atr-rule-trace-method-example.json +85 -0
- package/spec/stix-extension/extension-definition.json +23 -3
- package/spec/stix-extension/x-atr-rule-schema.json +107 -11
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://spec.agentthreatrule.org/profile/v1.0/schema.json",
|
|
4
|
+
"title": "ATR Profile v1.0",
|
|
5
|
+
"description": "Machine-readable schema for ATR profile (rule-set composition). Normative spec at spec/atr-profile-v1.0.md. License: CC BY 4.0.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["profile", "inclusions"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"profile": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"required": [
|
|
13
|
+
"schema_version",
|
|
14
|
+
"id",
|
|
15
|
+
"title",
|
|
16
|
+
"version",
|
|
17
|
+
"description",
|
|
18
|
+
"author",
|
|
19
|
+
"date",
|
|
20
|
+
"license",
|
|
21
|
+
"status",
|
|
22
|
+
"conformance_bound"
|
|
23
|
+
],
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"properties": {
|
|
26
|
+
"schema_version": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"const": "1.0"
|
|
29
|
+
},
|
|
30
|
+
"id": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"pattern": "^[a-z0-9][a-z0-9-]{2,63}$",
|
|
33
|
+
"description": "Globally unique profile identifier (kebab-case)."
|
|
34
|
+
},
|
|
35
|
+
"title": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"minLength": 3
|
|
38
|
+
},
|
|
39
|
+
"version": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$",
|
|
42
|
+
"description": "SemVer 2.0 profile version."
|
|
43
|
+
},
|
|
44
|
+
"description": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"minLength": 20
|
|
47
|
+
},
|
|
48
|
+
"author": {
|
|
49
|
+
"type": "string"
|
|
50
|
+
},
|
|
51
|
+
"date": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"format": "date"
|
|
54
|
+
},
|
|
55
|
+
"license": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"description": "SPDX license identifier or full license URL.",
|
|
58
|
+
"examples": ["CC-BY-4.0", "MIT", "Apache-2.0"]
|
|
59
|
+
},
|
|
60
|
+
"status": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"enum": ["draft", "stable", "deprecated"]
|
|
63
|
+
},
|
|
64
|
+
"conformance_bound": {
|
|
65
|
+
"type": "object",
|
|
66
|
+
"required": [
|
|
67
|
+
"spec_version_min",
|
|
68
|
+
"minimum_rule_coverage",
|
|
69
|
+
"minimum_engine_passing"
|
|
70
|
+
],
|
|
71
|
+
"additionalProperties": false,
|
|
72
|
+
"properties": {
|
|
73
|
+
"spec_version_min": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"pattern": "^\\d+\\.\\d+$"
|
|
76
|
+
},
|
|
77
|
+
"spec_version_max": {
|
|
78
|
+
"type": ["string", "null"],
|
|
79
|
+
"pattern": "^\\d+\\.\\d+$"
|
|
80
|
+
},
|
|
81
|
+
"minimum_rule_coverage": {
|
|
82
|
+
"type": "number",
|
|
83
|
+
"minimum": 0.0,
|
|
84
|
+
"maximum": 1.0
|
|
85
|
+
},
|
|
86
|
+
"minimum_engine_passing": {
|
|
87
|
+
"type": "number",
|
|
88
|
+
"minimum": 0.0,
|
|
89
|
+
"maximum": 1.0
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"inclusions": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"minItems": 1,
|
|
98
|
+
"items": {
|
|
99
|
+
"$ref": "#/$defs/selector"
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"exclusions": {
|
|
103
|
+
"type": "array",
|
|
104
|
+
"items": {
|
|
105
|
+
"$ref": "#/$defs/selector"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"resolved_rules_summary": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"description": "Optional informational summary populated at profile-resolution time.",
|
|
111
|
+
"additionalProperties": true,
|
|
112
|
+
"properties": {
|
|
113
|
+
"total": {"type": "integer", "minimum": 0},
|
|
114
|
+
"by_category": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"patternProperties": {
|
|
117
|
+
"^[a-z][a-z0-9-]+$": {"type": "integer", "minimum": 0}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"$defs": {
|
|
124
|
+
"selector": {
|
|
125
|
+
"type": "object",
|
|
126
|
+
"oneOf": [
|
|
127
|
+
{
|
|
128
|
+
"required": ["rule_id"],
|
|
129
|
+
"properties": {
|
|
130
|
+
"rule_id": {
|
|
131
|
+
"type": "string",
|
|
132
|
+
"pattern": "^ATR-(?:[A-Z]{2}-)?[0-9]{4}-[0-9]{5}$"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"additionalProperties": false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"required": ["rule_id_pattern"],
|
|
139
|
+
"properties": {
|
|
140
|
+
"rule_id_pattern": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"description": "Glob pattern matching ATR rule IDs."
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"additionalProperties": false
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"required": ["category"],
|
|
149
|
+
"properties": {
|
|
150
|
+
"category": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"description": "Top-level category from spec/category-registry/v1.0.yaml or a reserved namespace prefix."
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"additionalProperties": false
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"required": ["tag_match"],
|
|
159
|
+
"properties": {
|
|
160
|
+
"tag_match": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"additionalProperties": {
|
|
163
|
+
"oneOf": [
|
|
164
|
+
{"type": "string"},
|
|
165
|
+
{"type": "array", "items": {"type": "string"}}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"additionalProperties": false
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"required": ["profile"],
|
|
174
|
+
"properties": {
|
|
175
|
+
"profile": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"pattern": "^[a-z0-9][a-z0-9-]{2,63}@\\d+\\.\\d+\\.\\d+$",
|
|
178
|
+
"description": "Profile inclusion in form <profile-id>@<version> for composition."
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"additionalProperties": false
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"required": ["rule_status"],
|
|
185
|
+
"properties": {
|
|
186
|
+
"rule_status": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"enum": ["draft", "experimental", "stable", "deprecated"]
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"additionalProperties": false
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://spec.agentthreatrule.org/rule/v1.0/schema.json",
|
|
4
|
+
"title": "ATR Rule v1.0",
|
|
5
|
+
"description": "Machine-readable schema for ATR detection rule format. Normative prose spec at ATR-SPEC-v1.md. Existing YAML schema at spec/atr-schema.yaml. This JSON Schema adds v2.0 provenance + lifecycle fields per governance/CHARTER.md and is backward-compatible with v1.0 rules (new fields optional). License: CC BY 4.0.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version",
|
|
9
|
+
"id",
|
|
10
|
+
"title",
|
|
11
|
+
"status",
|
|
12
|
+
"description",
|
|
13
|
+
"author",
|
|
14
|
+
"date",
|
|
15
|
+
"severity",
|
|
16
|
+
"detection_tier",
|
|
17
|
+
"maturity",
|
|
18
|
+
"tags",
|
|
19
|
+
"agent_source",
|
|
20
|
+
"detection",
|
|
21
|
+
"response"
|
|
22
|
+
],
|
|
23
|
+
"additionalProperties": true,
|
|
24
|
+
"properties": {
|
|
25
|
+
"schema_version": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^\\d+\\.\\d+$"
|
|
28
|
+
},
|
|
29
|
+
"id": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"pattern": "^ATR-(?:[A-Z]{2}-)?[0-9]{4}-[0-9]{5}$",
|
|
32
|
+
"description": "Canonical: ATR-YYYY-NNNNN. Sovereign-prefixed: ATR-XX-YYYY-NNNNN per CHARTER § 8.2."
|
|
33
|
+
},
|
|
34
|
+
"rule_version": {
|
|
35
|
+
"type": "integer",
|
|
36
|
+
"minimum": 1,
|
|
37
|
+
"default": 1
|
|
38
|
+
},
|
|
39
|
+
"title": {"type": "string", "minLength": 5},
|
|
40
|
+
"status": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"enum": ["draft", "experimental", "stable", "deprecated"]
|
|
43
|
+
},
|
|
44
|
+
"description": {"type": "string", "minLength": 20},
|
|
45
|
+
"author": {"type": "string", "minLength": 1},
|
|
46
|
+
"date": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"anyOf": [
|
|
49
|
+
{"format": "date"},
|
|
50
|
+
{"pattern": "^[0-9]{4}/[0-9]{2}/[0-9]{2}$"}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"modified": {"type": "string"},
|
|
54
|
+
"severity": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"enum": ["critical", "high", "medium", "low", "informational"]
|
|
57
|
+
},
|
|
58
|
+
"detection_tier": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"enum": ["pattern", "behavioral", "protocol", "classifier"]
|
|
61
|
+
},
|
|
62
|
+
"maturity": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"enum": ["draft", "experimental", "test", "stable", "deprecated"]
|
|
65
|
+
},
|
|
66
|
+
"confidence": {
|
|
67
|
+
"type": "integer",
|
|
68
|
+
"minimum": 0,
|
|
69
|
+
"maximum": 100,
|
|
70
|
+
"description": "Engine confidence percentage 0-100."
|
|
71
|
+
},
|
|
72
|
+
"tags": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"required": ["category"],
|
|
75
|
+
"properties": {
|
|
76
|
+
"category": {"type": "string"},
|
|
77
|
+
"subcategory": {"type": "string"},
|
|
78
|
+
"confidence": {"type": "string", "enum": ["high", "medium", "low"]},
|
|
79
|
+
"scan_target": {"type": "string", "enum": ["mcp", "skill", "skill_md", "llm_io", "runtime", "user_input", "tool_response", "both", "llm"]},
|
|
80
|
+
"source": {"type": "string"},
|
|
81
|
+
"vendor_sources": {"oneOf": [{"type": "string"}, {"type": "array"}]},
|
|
82
|
+
"suppress_in_code_blocks": {"type": "boolean"}
|
|
83
|
+
},
|
|
84
|
+
"additionalProperties": true
|
|
85
|
+
},
|
|
86
|
+
"agent_source": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"required": ["type"],
|
|
89
|
+
"properties": {
|
|
90
|
+
"type": {"type": "string"},
|
|
91
|
+
"framework": {"type": "array", "items": {"type": "string"}},
|
|
92
|
+
"provider": {"type": "array", "items": {"type": "string"}}
|
|
93
|
+
},
|
|
94
|
+
"additionalProperties": true
|
|
95
|
+
},
|
|
96
|
+
"detection": {
|
|
97
|
+
"type": "object",
|
|
98
|
+
"required": ["conditions"],
|
|
99
|
+
"properties": {
|
|
100
|
+
"conditions": {
|
|
101
|
+
"type": "array",
|
|
102
|
+
"minItems": 1,
|
|
103
|
+
"items": {
|
|
104
|
+
"type": "object",
|
|
105
|
+
"anyOf": [
|
|
106
|
+
{
|
|
107
|
+
"required": ["field", "operator", "value"],
|
|
108
|
+
"properties": {
|
|
109
|
+
"field": {"type": "string"},
|
|
110
|
+
"operator": {"type": "string", "enum": ["regex", "equals", "contains", "matches", "ml_classifier", "ast", "bytecode"]},
|
|
111
|
+
"value": {"type": ["string", "array", "object"]},
|
|
112
|
+
"language": {"type": "string", "description": "ISO 639-1 code per spec/atr-language-detection-v1.0.md"},
|
|
113
|
+
"description": {"type": "string"}
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"required": ["metric", "operator", "threshold"],
|
|
118
|
+
"properties": {
|
|
119
|
+
"metric": {"type": "string"},
|
|
120
|
+
"operator": {"type": "string"},
|
|
121
|
+
"threshold": {"type": ["number", "string"]}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"condition": {"type": "string", "description": "Boolean expression over condition aliases. Default: 'any' (OR)."},
|
|
128
|
+
"false_positives": {"type": "array", "items": {"type": "string"}}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"response": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"required": ["actions"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"actions": {
|
|
136
|
+
"type": "array",
|
|
137
|
+
"items": {"type": "string", "enum": ["block_input", "block_output", "redact", "alert", "snapshot", "quarantine", "terminate_session"]},
|
|
138
|
+
"minItems": 1
|
|
139
|
+
},
|
|
140
|
+
"auto_response_threshold": {"type": "string"},
|
|
141
|
+
"message_template": {"type": "string"}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"references": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"additionalProperties": true,
|
|
147
|
+
"properties": {
|
|
148
|
+
"owasp_llm": {"type": "array", "items": {"type": "string"}},
|
|
149
|
+
"owasp_agentic": {"type": "array", "items": {"type": "string"}},
|
|
150
|
+
"mitre_atlas": {"type": "array", "items": {"type": "string"}},
|
|
151
|
+
"cve": {"type": "array", "items": {"type": "string"}},
|
|
152
|
+
"ghsa": {"type": "array", "items": {"type": "string"}}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"compliance": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"additionalProperties": true,
|
|
158
|
+
"description": "Mappings to compliance frameworks (OWASP, EU AI Act, NIST AI RMF, ISO 42001, etc.). Each is an array of objects with id/article/clause + context + strength fields."
|
|
159
|
+
},
|
|
160
|
+
"test_cases": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"properties": {
|
|
163
|
+
"true_positives": {
|
|
164
|
+
"type": "array",
|
|
165
|
+
"minItems": 1,
|
|
166
|
+
"items": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"required": ["input", "expected"],
|
|
169
|
+
"properties": {
|
|
170
|
+
"input": {"type": "string"},
|
|
171
|
+
"expected": {"type": "string", "enum": ["triggered", "not_triggered"]},
|
|
172
|
+
"description": {"type": "string"}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
"true_negatives": {
|
|
177
|
+
"type": "array",
|
|
178
|
+
"minItems": 1,
|
|
179
|
+
"items": {
|
|
180
|
+
"type": "object",
|
|
181
|
+
"required": ["input", "expected"],
|
|
182
|
+
"properties": {
|
|
183
|
+
"input": {"type": "string"},
|
|
184
|
+
"expected": {"type": "string", "enum": ["triggered", "not_triggered"]},
|
|
185
|
+
"description": {"type": "string"}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"provenance": {
|
|
192
|
+
"type": "object",
|
|
193
|
+
"description": "v2.0 — producer attribution per CHARTER § 5 multi-producer architecture. Optional in v1.0 rules for backward compatibility.",
|
|
194
|
+
"properties": {
|
|
195
|
+
"producer": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"enum": ["red_team", "tc_flywheel", "cve_pipeline", "research_paper", "community", "sovereign"]
|
|
198
|
+
},
|
|
199
|
+
"contributor": {"type": "string"},
|
|
200
|
+
"contributor_org": {"type": "string"},
|
|
201
|
+
"attestation_signature": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"description": "ed25519 sig for sovereign-issued rules per CHARTER § 8.2."
|
|
204
|
+
},
|
|
205
|
+
"origin_event_id": {
|
|
206
|
+
"type": "string",
|
|
207
|
+
"description": "Link to source CVE / TC event / research paper."
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"lifecycle": {
|
|
212
|
+
"type": "object",
|
|
213
|
+
"description": "v2.0 — explicit lifecycle metadata per CHARTER § 5.",
|
|
214
|
+
"properties": {
|
|
215
|
+
"review_status": {
|
|
216
|
+
"type": "string",
|
|
217
|
+
"enum": ["unreviewed", "community_reviewed", "tsc_approved"]
|
|
218
|
+
},
|
|
219
|
+
"created": {"type": "string", "format": "date"},
|
|
220
|
+
"last_validated": {"type": "string", "format": "date"}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -4,19 +4,23 @@ This directory defines a STIX 2.1 extension that introduces the
|
|
|
4
4
|
`x-atr-rule` custom Domain Object so ATR rules can be represented
|
|
5
5
|
natively in STIX/TAXII threat-intelligence pipelines.
|
|
6
6
|
|
|
7
|
+
**Current version: 1.1.0** (2026-05-28). See [Changelog](#changelog) below.
|
|
8
|
+
|
|
7
9
|
## Why a STIX extension
|
|
8
10
|
|
|
9
11
|
ATR rules are an open detection vocabulary for AI agent threats —
|
|
10
|
-
prompt injection, tool poisoning, MCP server attacks, skill compromise
|
|
12
|
+
prompt injection, tool poisoning, MCP server attacks, skill compromise,
|
|
13
|
+
plus the v1.1 trace-method rules for silent failures and scope drift.
|
|
11
14
|
They were adopted as a MISP taxonomy in [MISP/misp-taxonomies#323][misp-tax]
|
|
12
15
|
on 2026-05-10 and a MISP galaxy in [MISP/misp-galaxy#1207][misp-gal].
|
|
13
16
|
|
|
14
17
|
Several CTI consumers use STIX/TAXII rather than MISP. Mapping ATR to a
|
|
15
18
|
generic STIX `indicator` or `attack-pattern` object is lossy: the
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
ten-category attack class, regex detection patterns, severity, the
|
|
20
|
+
five-plane detection method (v1.1), and the compliance-framework references
|
|
21
|
+
(EU AI Act, NIST AI RMF, NIST CSF 2.0, ISO 42001, ETSI TS 104 223, OSCAL)
|
|
22
|
+
all get flattened. This extension preserves them as first-class fields on
|
|
23
|
+
a new `x-atr-rule` SDO.
|
|
20
24
|
|
|
21
25
|
## Files
|
|
22
26
|
|
|
@@ -24,24 +28,42 @@ new `x-atr-rule` SDO.
|
|
|
24
28
|
STIX 2.1 Extension Definition object. Stable id
|
|
25
29
|
`extension-definition--93370194-c964-570f-9802-9d1154e5525d`. Consumers
|
|
26
30
|
reference this id in the `extensions` map of every `x-atr-rule`
|
|
27
|
-
instance.
|
|
31
|
+
instance. v1.1.0 as of 2026-05-28.
|
|
28
32
|
- [`x-atr-rule-schema.json`](./x-atr-rule-schema.json) — JSON Schema
|
|
29
33
|
(Draft 7) for the new SDO. Defines required fields, enum values for
|
|
30
|
-
`atr_category` / `
|
|
31
|
-
and structural constraints
|
|
32
|
-
`
|
|
34
|
+
`atr_category` / `atr_method` / `atr_runtime_profile` / `severity` /
|
|
35
|
+
`agent_source_type` / `response_actions`, and structural constraints
|
|
36
|
+
on `detection_patterns`, `signature_indicators`, `semantic_judge`,
|
|
37
|
+
`trace_detection`, and `compliance_refs`.
|
|
33
38
|
- [`examples/atr-rule-prompt-injection-example.json`](./examples/atr-rule-prompt-injection-example.json)
|
|
34
|
-
—
|
|
35
|
-
|
|
39
|
+
— pattern-method instance for `ATR-2026-00001`.
|
|
40
|
+
- [`examples/atr-rule-trace-method-example.json`](./examples/atr-rule-trace-method-example.json)
|
|
41
|
+
— v1.1 trace-method instance for `ATR-2026-00548`. Shows the
|
|
42
|
+
`trace_detection` payload with the `invariant` primitive.
|
|
36
43
|
|
|
37
44
|
## Identifier convention
|
|
38
45
|
|
|
39
46
|
`x-atr-rule.id` is recommended to be a deterministic UUIDv5 derived
|
|
40
|
-
from the canonical ATR rule id (e.g. `ATR-2026-
|
|
47
|
+
from the canonical ATR rule id (e.g. `ATR-2026-00548`) under the
|
|
41
48
|
namespace UUID `6f7a8b9c-1d2e-4f5a-9b8c-7e6d5f4a3b2c`. The same rule id
|
|
42
49
|
therefore always produces the same STIX id across consumers, which lets
|
|
43
50
|
multiple feeds align without conflict resolution.
|
|
44
51
|
|
|
52
|
+
## Method-specific payload mapping (v1.1)
|
|
53
|
+
|
|
54
|
+
The `atr_method` field selects which optional payload field is populated:
|
|
55
|
+
|
|
56
|
+
| `atr_method` | Required companion field | Maps to ATR YAML |
|
|
57
|
+
|--------------|--------------------------|------------------|
|
|
58
|
+
| `pattern` | `detection_patterns` | `detection.conditions` |
|
|
59
|
+
| `signature` | `signature_indicators` | `detection.signature.indicators` |
|
|
60
|
+
| `semantic` | `semantic_judge` | `detection.semantic` |
|
|
61
|
+
| `behavioral` | (placeholder; spec §7) | — |
|
|
62
|
+
| `trace` | `trace_detection` | `detection.trace` |
|
|
63
|
+
|
|
64
|
+
For multi-method rules (e.g., rule 00552 uses both invariant AND forbid
|
|
65
|
+
inside one trace block), all primitives ship under `trace_detection.primitives`.
|
|
66
|
+
|
|
45
67
|
## Extension type
|
|
46
68
|
|
|
47
69
|
`extension_types: ["new-sdo"]` per STIX 2.1 §7.3, which is the correct
|
|
@@ -50,6 +72,23 @@ The schema field on the Extension Definition points at the JSON Schema
|
|
|
50
72
|
in this directory via raw GitHub URL so the schema is dereferenceable
|
|
51
73
|
for validating consumers.
|
|
52
74
|
|
|
75
|
+
## MISP export hint
|
|
76
|
+
|
|
77
|
+
Consumers that bridge STIX → MISP can map `x-atr-rule` to MISP objects:
|
|
78
|
+
|
|
79
|
+
| `x-atr-rule` field | MISP object / attribute |
|
|
80
|
+
|--------------------|-------------------------|
|
|
81
|
+
| `atr_id` | `external-references[type=external_analysis]` or first `atr` attribute |
|
|
82
|
+
| `atr_category` | MISP taxonomy `atr:category="<value>"` (via misp-taxonomies#323) |
|
|
83
|
+
| `severity` | MISP `threat-level` |
|
|
84
|
+
| `detection_patterns[].pattern` | `pattern-in-file` attribute (one per regex) |
|
|
85
|
+
| `signature_indicators[].value` | MISP `sha256` / `filename` / `url` attribute by `type` |
|
|
86
|
+
| `cve_refs` | MISP `vulnerability` attribute |
|
|
87
|
+
| `mitre_atlas_refs` | MISP galaxy `mitre-atlas-techniques` |
|
|
88
|
+
| `compliance_refs.*` | MISP free-form tag, namespace per framework |
|
|
89
|
+
|
|
90
|
+
A reference STIX→MISP transpiler is planned at `scripts/export-stix-to-misp.ts`.
|
|
91
|
+
|
|
53
92
|
## Validation
|
|
54
93
|
|
|
55
94
|
```bash
|
|
@@ -58,12 +97,34 @@ python3 -c "import json, jsonschema; \
|
|
|
58
97
|
schema = json.load(open('spec/stix-extension/x-atr-rule-schema.json')); \
|
|
59
98
|
example = json.load(open('spec/stix-extension/examples/atr-rule-prompt-injection-example.json')); \
|
|
60
99
|
jsonschema.validate(example, schema); \
|
|
100
|
+
trace_example = json.load(open('spec/stix-extension/examples/atr-rule-trace-method-example.json')); \
|
|
101
|
+
jsonschema.validate(trace_example, schema); \
|
|
61
102
|
print('OK')"
|
|
62
103
|
```
|
|
63
104
|
|
|
105
|
+
## Changelog
|
|
106
|
+
|
|
107
|
+
### v1.1.0 — 2026-05-28
|
|
108
|
+
- Added `atr_method` enum field (pattern / signature / semantic / behavioral / trace).
|
|
109
|
+
- Added `atr_runtime_profile` enum field (deterministic / assisted).
|
|
110
|
+
- Added 10th category `model-security` to `atr_category` enum.
|
|
111
|
+
- Added `agent_trace` to `agent_source_type` enum.
|
|
112
|
+
- Added method-specific payload objects: `signature_indicators`,
|
|
113
|
+
`semantic_judge`, `trace_detection`.
|
|
114
|
+
- Added `probe_id_refs` for adversarial probe binding (PyRIT / garak / etc).
|
|
115
|
+
- Added compliance fields: `nist_csf`, `etsi_ts_104223`, `oscal_assessment_objective`.
|
|
116
|
+
- Added `owasp_ast_refs`, `safe_mcp_refs`.
|
|
117
|
+
- Extended `response_actions` enum with SPEC.md Appendix A canonical
|
|
118
|
+
vocabulary (`block_request`, `log_alert`, `redact_match`, etc).
|
|
119
|
+
- Added `draft` to `maturity` enum to match on-disk rule status vocabulary.
|
|
120
|
+
- New example: `examples/atr-rule-trace-method-example.json`.
|
|
121
|
+
|
|
122
|
+
### v1.0.0 — 2026-05-11
|
|
123
|
+
- Initial release. Nine categories. Pattern-method only.
|
|
124
|
+
|
|
64
125
|
## Status
|
|
65
126
|
|
|
66
|
-
Draft v1.
|
|
127
|
+
Draft v1.1.0. Not yet submitted to the OASIS CTI Technical Committee.
|
|
67
128
|
The extension is usable today by any consumer that processes STIX
|
|
68
129
|
extensions per the spec; OASIS submission becomes relevant if a
|
|
69
130
|
subset of fields ends up wanting promotion into core STIX.
|
|
@@ -72,6 +133,8 @@ subset of fields ends up wanting promotion into core STIX.
|
|
|
72
133
|
|
|
73
134
|
- Canonical ATR repo: <https://github.com/Agent-Threat-Rule/agent-threat-rules>
|
|
74
135
|
- ATR YAML schema: [`../atr-schema.yaml`](../atr-schema.yaml)
|
|
136
|
+
- ATR Core Specification: [`../../SPEC.md`](../../SPEC.md)
|
|
137
|
+
- ATR Method Extensions: [`../atr-method-v1.1.md`](../atr-method-v1.1.md)
|
|
75
138
|
- npm: <https://www.npmjs.com/package/agent-threat-rules>
|
|
76
139
|
- DOI: 10.5281/zenodo.19178002
|
|
77
140
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "x-atr-rule",
|
|
3
|
+
"id": "x-atr-rule--c2e83f15-44b7-5e8a-b9c3-aae5d2348816",
|
|
4
|
+
"spec_version": "2.1",
|
|
5
|
+
"created_by_ref": "identity--4ee77ba4-f956-5d27-aeb1-cbfeb4c8f8d5",
|
|
6
|
+
"created": "2026-05-28T00:00:00.000Z",
|
|
7
|
+
"modified": "2026-05-28T00:00:00.000Z",
|
|
8
|
+
"atr_id": "ATR-2026-00548",
|
|
9
|
+
"atr_category": "context-exfiltration",
|
|
10
|
+
"atr_subcategory": "cross-agent-context-drift",
|
|
11
|
+
"atr_method": "trace",
|
|
12
|
+
"atr_runtime_profile": "assisted",
|
|
13
|
+
"name": "Cross-agent session context leak across delegation chain",
|
|
14
|
+
"description": "Detects cross-agent context leakage in multi-agent systems where a privileged context attribute (typically session.id, user.id, or conversation.id) fails to remain constant across a single agent delegation chain. Trace-method rule operating on agent execution traces in OpenInference format.",
|
|
15
|
+
"severity": "high",
|
|
16
|
+
"maturity": "draft",
|
|
17
|
+
"agent_source_type": "agent_trace",
|
|
18
|
+
"trace_detection": {
|
|
19
|
+
"ingest_format": "openinference",
|
|
20
|
+
"primitives": {
|
|
21
|
+
"invariant": [
|
|
22
|
+
{
|
|
23
|
+
"attribute": "session.id",
|
|
24
|
+
"across": "agent.delegation_chain",
|
|
25
|
+
"description": "session.id MUST remain constant across every span in one delegation chain."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"attribute": "user.id",
|
|
29
|
+
"across": "agent.delegation_chain",
|
|
30
|
+
"description": "user.id MUST remain constant across the delegation chain."
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"response_actions": [
|
|
36
|
+
"alert",
|
|
37
|
+
"quarantine_session"
|
|
38
|
+
],
|
|
39
|
+
"owasp_agentic_refs": [
|
|
40
|
+
"ASI03:2026 - Data Exfiltration",
|
|
41
|
+
"ASI06:2026 - Identity Spoofing & Impersonation"
|
|
42
|
+
],
|
|
43
|
+
"mitre_atlas_refs": [
|
|
44
|
+
"AML.T0024 - Exfiltration via Cyber Means"
|
|
45
|
+
],
|
|
46
|
+
"compliance_refs": {
|
|
47
|
+
"nist_csf": [
|
|
48
|
+
"DE.CM-09"
|
|
49
|
+
],
|
|
50
|
+
"etsi_ts_104223": [
|
|
51
|
+
"P4.3"
|
|
52
|
+
],
|
|
53
|
+
"eu_ai_act": [
|
|
54
|
+
{
|
|
55
|
+
"article": "10",
|
|
56
|
+
"context": "Data governance — multi-agent systems must preserve session-scope boundaries.",
|
|
57
|
+
"strength": "primary"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"nist_ai_rmf": [
|
|
61
|
+
{
|
|
62
|
+
"subcategory": "MS.2.6",
|
|
63
|
+
"context": "Information security — agent delegation chains must preserve session and user scope.",
|
|
64
|
+
"strength": "primary"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"external_references": [
|
|
69
|
+
{
|
|
70
|
+
"source_name": "agent-threat-rules",
|
|
71
|
+
"external_id": "ATR-2026-00548",
|
|
72
|
+
"url": "https://github.com/Agent-Threat-Rule/agent-threat-rules/blob/main/rules/context-exfiltration/ATR-2026-00548-cross-agent-session-context-leak.yaml"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"source_name": "Argus paper",
|
|
76
|
+
"description": "Hierarchical Reference-Relationship Graph for Multi-Agent Information Leakage",
|
|
77
|
+
"url": "https://arxiv.org/abs/2512.08326"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"extensions": {
|
|
81
|
+
"extension-definition--93370194-c964-570f-9802-9d1154e5525d": {
|
|
82
|
+
"extension_type": "new-sdo"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|