@panguard-ai/atr 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/content-hash.d.ts +7 -0
- package/dist/content-hash.d.ts.map +1 -0
- package/dist/content-hash.js +10 -0
- package/dist/content-hash.js.map +1 -0
- package/dist/engine.d.ts +9 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +134 -4
- package/dist/engine.js.map +1 -1
- package/dist/types.d.ts +83 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -10
- package/rules/agent-manipulation/{ATR-2026-030-cross-agent-attack.yaml → ATR-2026-00030-cross-agent-attack.yaml} +54 -52
- package/rules/agent-manipulation/{ATR-2026-032-goal-hijacking.yaml → ATR-2026-00032-goal-hijacking.yaml} +39 -37
- package/rules/agent-manipulation/{ATR-2026-074-cross-agent-privilege-escalation.yaml → ATR-2026-00074-cross-agent-privilege-escalation.yaml} +35 -33
- package/rules/agent-manipulation/{ATR-2026-076-inter-agent-message-spoofing.yaml → ATR-2026-00076-inter-agent-message-spoofing.yaml} +58 -56
- package/rules/agent-manipulation/{ATR-2026-077-human-trust-exploitation.yaml → ATR-2026-00077-human-trust-exploitation.yaml} +45 -43
- package/rules/agent-manipulation/{ATR-2026-108-consensus-sybil-attack.yaml → ATR-2026-00108-consensus-sybil-attack.yaml} +34 -32
- package/rules/agent-manipulation/ATR-2026-00116-a2a-message-validation.yaml +92 -0
- package/rules/agent-manipulation/ATR-2026-00117-agent-identity-spoofing.yaml +92 -0
- package/rules/agent-manipulation/ATR-2026-00118-approval-fatigue.yaml +89 -0
- package/rules/agent-manipulation/ATR-2026-00119-social-engineering-via-agent.yaml +89 -0
- package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +99 -0
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +53 -0
- package/rules/context-exfiltration/{ATR-2026-020-system-prompt-leak.yaml → ATR-2026-00020-system-prompt-leak.yaml} +54 -52
- package/rules/context-exfiltration/ATR-2026-00021-api-key-exposure.yaml +178 -0
- package/rules/context-exfiltration/{ATR-2026-075-agent-memory-manipulation.yaml → ATR-2026-00075-agent-memory-manipulation.yaml} +36 -34
- package/rules/context-exfiltration/{ATR-2026-102-disguised-analytics-exfiltration.yaml → ATR-2026-00102-disguised-analytics-exfiltration.yaml} +21 -19
- package/rules/context-exfiltration/ATR-2026-00113-credential-theft.yaml +89 -0
- package/rules/context-exfiltration/ATR-2026-00114-oauth-token-abuse.yaml +89 -0
- package/rules/context-exfiltration/ATR-2026-00115-env-var-harvesting.yaml +90 -0
- package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +100 -0
- package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +52 -0
- package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +55 -0
- package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +49 -0
- package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +49 -0
- package/rules/data-poisoning/{ATR-2026-070-data-poisoning.yaml → ATR-2026-00070-data-poisoning.yaml} +56 -54
- package/rules/excessive-autonomy/{ATR-2026-050-runaway-agent-loop.yaml → ATR-2026-00050-runaway-agent-loop.yaml} +42 -40
- package/rules/excessive-autonomy/{ATR-2026-051-resource-exhaustion.yaml → ATR-2026-00051-resource-exhaustion.yaml} +44 -42
- package/rules/excessive-autonomy/{ATR-2026-052-cascading-failure.yaml → ATR-2026-00052-cascading-failure.yaml} +57 -55
- package/rules/excessive-autonomy/{ATR-2026-098-unauthorized-financial-action.yaml → ATR-2026-00098-unauthorized-financial-action.yaml} +57 -55
- package/rules/excessive-autonomy/{ATR-2026-099-high-risk-tool-gate.yaml → ATR-2026-00099-high-risk-tool-gate.yaml} +73 -56
- package/rules/model-security/{ATR-2026-072-model-behavior-extraction.yaml → ATR-2026-00072-model-behavior-extraction.yaml} +37 -35
- package/rules/model-security/{ATR-2026-073-malicious-finetuning-data.yaml → ATR-2026-00073-malicious-finetuning-data.yaml} +29 -27
- package/rules/privilege-escalation/{ATR-2026-040-privilege-escalation.yaml → ATR-2026-00040-privilege-escalation.yaml} +61 -59
- package/rules/privilege-escalation/{ATR-2026-041-scope-creep.yaml → ATR-2026-00041-scope-creep.yaml} +38 -36
- package/rules/privilege-escalation/{ATR-2026-107-delayed-execution-bypass.yaml → ATR-2026-00107-delayed-execution-bypass.yaml} +21 -19
- package/rules/privilege-escalation/ATR-2026-00110-eval-injection.yaml +92 -0
- package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +93 -0
- package/rules/privilege-escalation/ATR-2026-00112-dynamic-import-exploitation.yaml +89 -0
- package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +53 -0
- package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +49 -0
- package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +563 -0
- package/rules/prompt-injection/{ATR-2026-002-indirect-prompt-injection.yaml → ATR-2026-00002-indirect-prompt-injection.yaml} +66 -64
- package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +397 -0
- package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +308 -0
- package/rules/prompt-injection/{ATR-2026-005-multi-turn-injection.yaml → ATR-2026-00005-multi-turn-injection.yaml} +50 -48
- package/rules/prompt-injection/{ATR-2026-080-encoding-evasion.yaml → ATR-2026-00080-encoding-evasion.yaml} +22 -13
- package/rules/prompt-injection/{ATR-2026-081-semantic-multi-turn.yaml → ATR-2026-00081-semantic-multi-turn.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-082-fingerprint-evasion.yaml → ATR-2026-00082-fingerprint-evasion.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-083-indirect-tool-injection.yaml → ATR-2026-00083-indirect-tool-injection.yaml} +26 -14
- package/rules/prompt-injection/{ATR-2026-084-structured-data-injection.yaml → ATR-2026-00084-structured-data-injection.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-085-audit-evasion.yaml → ATR-2026-00085-audit-evasion.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-086-visual-spoofing.yaml → ATR-2026-00086-visual-spoofing.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-087-rule-probing.yaml → ATR-2026-00087-rule-probing.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-088-adaptive-countermeasure.yaml → ATR-2026-00088-adaptive-countermeasure.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-089-polymorphic-skill.yaml → ATR-2026-00089-polymorphic-skill.yaml} +21 -12
- package/rules/prompt-injection/{ATR-2026-090-threat-intel-exfil.yaml → ATR-2026-00090-threat-intel-exfil.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-091-nested-payload.yaml → ATR-2026-00091-nested-payload.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-092-consensus-poisoning.yaml → ATR-2026-00092-consensus-poisoning.yaml} +25 -16
- package/rules/prompt-injection/{ATR-2026-093-gradual-escalation.yaml → ATR-2026-00093-gradual-escalation.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-094-audit-bypass.yaml → ATR-2026-00094-audit-bypass.yaml} +23 -14
- package/rules/prompt-injection/ATR-2026-00097-cjk-injection-patterns.yaml +339 -0
- package/rules/prompt-injection/{ATR-2026-104-persona-hijacking.yaml → ATR-2026-00104-persona-hijacking.yaml} +21 -19
- package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +97 -0
- package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +93 -0
- package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +111 -0
- package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +51 -0
- package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +71 -0
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +155 -0
- package/rules/skill-compromise/{ATR-2026-061-description-behavior-mismatch.yaml → ATR-2026-00061-description-behavior-mismatch.yaml} +24 -22
- package/rules/skill-compromise/{ATR-2026-062-hidden-capability.yaml → ATR-2026-00062-hidden-capability.yaml} +25 -23
- package/rules/skill-compromise/{ATR-2026-063-skill-chain-attack.yaml → ATR-2026-00063-skill-chain-attack.yaml} +26 -23
- package/rules/skill-compromise/{ATR-2026-064-over-permissioned-skill.yaml → ATR-2026-00064-over-permissioned-skill.yaml} +32 -30
- package/rules/skill-compromise/{ATR-2026-065-skill-update-attack.yaml → ATR-2026-00065-skill-update-attack.yaml} +25 -23
- package/rules/skill-compromise/{ATR-2026-066-parameter-injection.yaml → ATR-2026-00066-parameter-injection.yaml} +26 -24
- package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +121 -0
- package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +165 -0
- package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +114 -0
- package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +118 -0
- package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +98 -0
- package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +93 -0
- package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +99 -0
- package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +74 -0
- package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +79 -0
- package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +73 -0
- package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +86 -0
- package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +82 -0
- package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +48 -0
- package/rules/tool-poisoning/{ATR-2026-010-mcp-malicious-response.yaml → ATR-2026-00010-mcp-malicious-response.yaml} +73 -71
- package/rules/tool-poisoning/{ATR-2026-011-tool-output-injection.yaml → ATR-2026-00011-tool-output-injection.yaml} +63 -52
- package/rules/tool-poisoning/{ATR-2026-012-unauthorized-tool-call.yaml → ATR-2026-00012-unauthorized-tool-call.yaml} +70 -59
- package/rules/tool-poisoning/{ATR-2026-013-tool-ssrf.yaml → ATR-2026-00013-tool-ssrf.yaml} +75 -64
- package/rules/tool-poisoning/{ATR-2026-095-supply-chain-poisoning.yaml → ATR-2026-00095-supply-chain-poisoning.yaml} +26 -14
- package/rules/tool-poisoning/{ATR-2026-096-registry-poisoning.yaml → ATR-2026-00096-registry-poisoning.yaml} +26 -14
- package/rules/tool-poisoning/{ATR-2026-100-consent-bypass-instruction.yaml → ATR-2026-00100-consent-bypass-instruction.yaml} +26 -24
- package/rules/tool-poisoning/{ATR-2026-101-trust-escalation-override.yaml → ATR-2026-00101-trust-escalation-override.yaml} +21 -19
- package/rules/tool-poisoning/{ATR-2026-103-hidden-safety-bypass-instruction.yaml → ATR-2026-00103-hidden-safety-bypass-instruction.yaml} +21 -19
- package/rules/tool-poisoning/{ATR-2026-105-silent-action-concealment.yaml → ATR-2026-00105-silent-action-concealment.yaml} +19 -17
- package/rules/tool-poisoning/{ATR-2026-106-schema-description-contradiction.yaml → ATR-2026-00106-schema-description-contradiction.yaml} +20 -18
- package/spec/atr-schema.yaml +59 -29
- package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +0 -176
- package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +0 -453
- package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +0 -250
- package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +0 -204
- package/rules/prompt-injection/ATR-2026-097-cjk-injection-patterns.yaml +0 -180
- package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +0 -153
package/spec/atr-schema.yaml
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
# Status: RFC (Request for Comments)
|
|
8
8
|
# License: MIT
|
|
9
9
|
|
|
10
|
-
$schema:
|
|
10
|
+
$schema: "https://json-schema.org/draft/2020-12/schema"
|
|
11
11
|
title: ATR Rule Schema
|
|
12
12
|
description: Schema for Agent Threat Rules (ATR) detection rules
|
|
13
|
-
version:
|
|
13
|
+
version: "1.0.0"
|
|
14
14
|
|
|
15
15
|
type: object
|
|
16
16
|
required:
|
|
@@ -30,11 +30,12 @@ required:
|
|
|
30
30
|
- response
|
|
31
31
|
|
|
32
32
|
properties:
|
|
33
|
+
|
|
33
34
|
# === Metadata ===
|
|
34
35
|
|
|
35
36
|
schema_version:
|
|
36
37
|
type: string
|
|
37
|
-
description:
|
|
38
|
+
description: "ATR schema version this rule conforms to (e.g., \"0.1\")"
|
|
38
39
|
|
|
39
40
|
title:
|
|
40
41
|
type: string
|
|
@@ -42,8 +43,8 @@ properties:
|
|
|
42
43
|
|
|
43
44
|
id:
|
|
44
45
|
type: string
|
|
45
|
-
pattern: "^ATR-\\d{4}-\\d{
|
|
46
|
-
description:
|
|
46
|
+
pattern: "^ATR-\\d{4}-\\d{5}$"
|
|
47
|
+
description: "Unique rule identifier. Format: ATR-YYYY-NNNNN (e.g., ATR-2026-00001)"
|
|
47
48
|
|
|
48
49
|
status:
|
|
49
50
|
type: string
|
|
@@ -61,12 +62,17 @@ properties:
|
|
|
61
62
|
date:
|
|
62
63
|
type: string
|
|
63
64
|
pattern: "^\\d{4}/\\d{2}/\\d{2}$"
|
|
64
|
-
description:
|
|
65
|
+
description: "Creation date in YYYY/MM/DD format"
|
|
65
66
|
|
|
66
67
|
modified:
|
|
67
68
|
type: string
|
|
68
69
|
pattern: "^\\d{4}/\\d{2}/\\d{2}$"
|
|
69
|
-
description:
|
|
70
|
+
description: "Last modification date in YYYY/MM/DD format"
|
|
71
|
+
|
|
72
|
+
rule_version:
|
|
73
|
+
type: integer
|
|
74
|
+
minimum: 1
|
|
75
|
+
description: "Rule version number. Bump when detection logic changes. Starts at 1."
|
|
70
76
|
|
|
71
77
|
# === Classification ===
|
|
72
78
|
|
|
@@ -97,22 +103,42 @@ properties:
|
|
|
97
103
|
type: array
|
|
98
104
|
items:
|
|
99
105
|
type: string
|
|
100
|
-
description:
|
|
106
|
+
description: "OWASP LLM Top 10 references (e.g., LLM01:2025)"
|
|
101
107
|
mitre_atlas:
|
|
102
108
|
type: array
|
|
103
109
|
items:
|
|
104
110
|
type: string
|
|
105
|
-
description:
|
|
111
|
+
description: "MITRE ATLAS technique IDs (e.g., AML.T0054)"
|
|
106
112
|
mitre_attack:
|
|
107
113
|
type: array
|
|
108
114
|
items:
|
|
109
115
|
type: string
|
|
110
|
-
description:
|
|
116
|
+
description: "MITRE ATT&CK technique IDs (if applicable)"
|
|
111
117
|
cve:
|
|
112
118
|
type: array
|
|
113
119
|
items:
|
|
114
120
|
type: string
|
|
115
121
|
description: Related CVE identifiers
|
|
122
|
+
owasp_agentic:
|
|
123
|
+
type: array
|
|
124
|
+
items:
|
|
125
|
+
type: string
|
|
126
|
+
description: "OWASP Agentic Top 10 references (e.g., ASI01, ASI02)"
|
|
127
|
+
owasp_ast:
|
|
128
|
+
type: array
|
|
129
|
+
items:
|
|
130
|
+
type: string
|
|
131
|
+
description: "OWASP Agentic Skills Top 10 references (e.g., AST01)"
|
|
132
|
+
safe_mcp:
|
|
133
|
+
type: array
|
|
134
|
+
items:
|
|
135
|
+
type: string
|
|
136
|
+
description: "SAFE-MCP technique IDs (e.g., SMCP-T001)"
|
|
137
|
+
research:
|
|
138
|
+
type: array
|
|
139
|
+
items:
|
|
140
|
+
type: string
|
|
141
|
+
description: "Research paper references or URLs"
|
|
116
142
|
|
|
117
143
|
# === Tags (ATR classification) ===
|
|
118
144
|
|
|
@@ -140,6 +166,10 @@ properties:
|
|
|
140
166
|
type: string
|
|
141
167
|
enum: [high, medium, low]
|
|
142
168
|
description: Expected accuracy of this rule (high = low false positive rate)
|
|
169
|
+
scan_target:
|
|
170
|
+
type: string
|
|
171
|
+
enum: [mcp, skill, both, runtime]
|
|
172
|
+
description: "Which scan path this rule belongs to. mcp=runtime events, skill=SKILL.md static scan, both=fires in both paths, runtime=behavior monitoring."
|
|
143
173
|
|
|
144
174
|
# === Agent Source (analogous to Sigma's logsource) ===
|
|
145
175
|
|
|
@@ -153,16 +183,16 @@ properties:
|
|
|
153
183
|
type:
|
|
154
184
|
type: string
|
|
155
185
|
enum:
|
|
156
|
-
- llm_io
|
|
157
|
-
- tool_call
|
|
158
|
-
- mcp_exchange
|
|
159
|
-
- agent_behavior
|
|
160
|
-
- multi_agent_comm
|
|
161
|
-
- context_window
|
|
162
|
-
- memory_access
|
|
163
|
-
- skill_lifecycle
|
|
164
|
-
- skill_permission
|
|
165
|
-
- skill_chain
|
|
186
|
+
- llm_io # LLM input/output (prompts and completions)
|
|
187
|
+
- tool_call # Function/tool call requests
|
|
188
|
+
- mcp_exchange # MCP protocol messages
|
|
189
|
+
- agent_behavior # Agent behavioral metrics and patterns
|
|
190
|
+
- multi_agent_comm # Inter-agent communication
|
|
191
|
+
- context_window # Context window contents
|
|
192
|
+
- memory_access # Agent memory read/write operations
|
|
193
|
+
- skill_lifecycle # MCP skill registration, update, removal events
|
|
194
|
+
- skill_permission # Skill permission requests and boundary checks
|
|
195
|
+
- skill_chain # Multi-skill invocation sequences
|
|
166
196
|
description: Type of agent data stream to monitor
|
|
167
197
|
framework:
|
|
168
198
|
type: array
|
|
@@ -245,7 +275,7 @@ properties:
|
|
|
245
275
|
description: Numeric threshold for the metric
|
|
246
276
|
window:
|
|
247
277
|
type: string
|
|
248
|
-
description:
|
|
278
|
+
description: "Time window for behavioral analysis (e.g., 5m, 1h, 30s)"
|
|
249
279
|
ordered:
|
|
250
280
|
type: boolean
|
|
251
281
|
description: Whether steps must occur in order
|
|
@@ -282,16 +312,16 @@ properties:
|
|
|
282
312
|
items:
|
|
283
313
|
type: string
|
|
284
314
|
enum:
|
|
285
|
-
- block_input
|
|
286
|
-
- block_output
|
|
287
|
-
- block_tool
|
|
315
|
+
- block_input # Reject the user/agent input
|
|
316
|
+
- block_output # Suppress the agent output
|
|
317
|
+
- block_tool # Prevent the tool call from executing
|
|
288
318
|
- quarantine_session # Isolate the entire session
|
|
289
|
-
- reset_context
|
|
290
|
-
- alert
|
|
291
|
-
- snapshot
|
|
292
|
-
- escalate
|
|
319
|
+
- reset_context # Clear agent context/memory
|
|
320
|
+
- alert # Send alert to security team
|
|
321
|
+
- snapshot # Capture full session state for forensics
|
|
322
|
+
- escalate # Escalate to human reviewer
|
|
293
323
|
- reduce_permissions # Reduce agent's available tools/capabilities
|
|
294
|
-
- kill_agent
|
|
324
|
+
- kill_agent # Terminate the agent process
|
|
295
325
|
description: Actions to take when the rule triggers
|
|
296
326
|
auto_response_threshold:
|
|
297
327
|
type: string
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
title: 'Credential and Secret Exposure in Agent Output'
|
|
2
|
-
id: ATR-2026-021
|
|
3
|
-
status: experimental
|
|
4
|
-
description: |
|
|
5
|
-
Detects when an AI agent exposes API keys, secret tokens, private keys,
|
|
6
|
-
database connection strings, JWT tokens, or other sensitive credentials
|
|
7
|
-
in its output. Covers all major cloud provider key formats, CI/CD tokens,
|
|
8
|
-
payment processor keys, SSH keys, .env file content patterns, and generic
|
|
9
|
-
secret assignment patterns. Credential leakage in agent output poses a
|
|
10
|
-
critical security risk leading to unauthorized access, lateral movement,
|
|
11
|
-
financial loss, and full account compromise.
|
|
12
|
-
author: 'ATR Community'
|
|
13
|
-
date: '2026/03/08'
|
|
14
|
-
schema_version: '0.1'
|
|
15
|
-
detection_tier: pattern
|
|
16
|
-
maturity: test
|
|
17
|
-
severity: critical
|
|
18
|
-
|
|
19
|
-
references:
|
|
20
|
-
owasp_llm:
|
|
21
|
-
- 'LLM02:2025 - Sensitive Information Disclosure'
|
|
22
|
-
- 'LLM07:2025 - System Prompt Leakage'
|
|
23
|
-
cve:
|
|
24
|
-
- 'CVE-2025-32711'
|
|
25
|
-
owasp_agentic:
|
|
26
|
-
- 'ASI03:2026 - Identity and Privilege Abuse'
|
|
27
|
-
mitre_atlas:
|
|
28
|
-
- 'AML.T0057 - LLM Data Leakage'
|
|
29
|
-
- 'AML.T0055 - Unsecured Credentials'
|
|
30
|
-
|
|
31
|
-
tags:
|
|
32
|
-
category: context-exfiltration
|
|
33
|
-
subcategory: credential-exposure
|
|
34
|
-
confidence: high
|
|
35
|
-
|
|
36
|
-
agent_source:
|
|
37
|
-
type: llm_io
|
|
38
|
-
framework:
|
|
39
|
-
- any
|
|
40
|
-
provider:
|
|
41
|
-
- any
|
|
42
|
-
|
|
43
|
-
detection:
|
|
44
|
-
conditions:
|
|
45
|
-
- field: agent_output
|
|
46
|
-
operator: regex
|
|
47
|
-
value: 'sk-[a-zA-Z0-9]{20,}'
|
|
48
|
-
description: 'OpenAI-style API key (sk-...)'
|
|
49
|
-
- field: agent_output
|
|
50
|
-
operator: regex
|
|
51
|
-
value: 'AKIA[0-9A-Z]{16}'
|
|
52
|
-
description: 'AWS Access Key ID (AKIA...)'
|
|
53
|
-
- field: agent_output
|
|
54
|
-
operator: regex
|
|
55
|
-
value: 'AIza[a-zA-Z0-9_-]{35}'
|
|
56
|
-
description: 'Google API key (AIza...)'
|
|
57
|
-
- field: agent_output
|
|
58
|
-
operator: regex
|
|
59
|
-
value: '(?:sk_live|pk_live|sk_test|rk_live)_[a-zA-Z0-9]{20,}'
|
|
60
|
-
description: 'Stripe API key (sk_live_, pk_live_, rk_live_)'
|
|
61
|
-
- field: agent_output
|
|
62
|
-
operator: regex
|
|
63
|
-
value: "eyJ[a-zA-Z0-9_-]{10,}\\.eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]+"
|
|
64
|
-
description: 'JWT token (eyJ...eyJ...signature)'
|
|
65
|
-
- field: agent_output
|
|
66
|
-
operator: regex
|
|
67
|
-
value: '-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----'
|
|
68
|
-
description: 'PEM or OpenSSH private key header'
|
|
69
|
-
- field: agent_output
|
|
70
|
-
operator: regex
|
|
71
|
-
value: 'ghp_[a-zA-Z0-9]{36}'
|
|
72
|
-
description: 'GitHub personal access token (ghp_...)'
|
|
73
|
-
- field: agent_output
|
|
74
|
-
operator: regex
|
|
75
|
-
value: "xox[bpors]-[a-zA-Z0-9\\-]{10,}"
|
|
76
|
-
description: 'Slack token (xoxb-, xoxp-, xoxs-)'
|
|
77
|
-
- field: agent_output
|
|
78
|
-
operator: regex
|
|
79
|
-
value: "Bearer\\s+[a-zA-Z0-9\\-._~+/]{20,}=*"
|
|
80
|
-
description: 'Bearer token in authorization header'
|
|
81
|
-
- field: agent_output
|
|
82
|
-
operator: regex
|
|
83
|
-
value: "(?:mongodb(?:\\+srv)?|postgres(?:ql)?|mysql|redis|amqp)://[^\\s\"']{10,}"
|
|
84
|
-
description: 'Database or message broker connection string with credentials'
|
|
85
|
-
- field: agent_output
|
|
86
|
-
operator: regex
|
|
87
|
-
value: "(?:DB_PASSWORD|DATABASE_URL|REDIS_URL|MONGO_URI|SECRET_KEY|JWT_SECRET|ENCRYPTION_KEY|PRIVATE_KEY|AUTH_TOKEN)\\s*[=:]\\s*[\"']?[^\\s\"']{8,}"
|
|
88
|
-
description: '.env file pattern with sensitive variable names'
|
|
89
|
-
- field: agent_output
|
|
90
|
-
operator: regex
|
|
91
|
-
value: "(?:api[_-]?key|api[_-]?secret|access[_-]?token|auth[_-]?token|client[_-]?secret)\\s*[=:]\\s*[\"']?[a-zA-Z0-9_\\-]{16,}"
|
|
92
|
-
description: 'Generic secret assignment pattern (api_key=..., auth_token=...)'
|
|
93
|
-
- field: agent_output
|
|
94
|
-
operator: regex
|
|
95
|
-
value: "(?:ANTHROPIC_API_KEY|OPENAI_API_KEY|GOOGLE_API_KEY|AZURE_API_KEY|COHERE_API_KEY|HF_TOKEN)\\s*[=:]\\s*[^\\s]{8,}"
|
|
96
|
-
description: 'LLM provider API key environment variables'
|
|
97
|
-
- field: agent_output
|
|
98
|
-
operator: regex
|
|
99
|
-
value: "(?:ssh-rsa|ssh-ed25519|ecdsa-sha2-nistp256)\\s+[A-Za-z0-9+/]{40,}"
|
|
100
|
-
description: 'SSH public key that may indicate key material exposure context'
|
|
101
|
-
- field: agent_output
|
|
102
|
-
operator: regex
|
|
103
|
-
value: "(?:secret[\"'\\s]*[:=][\"'\\s]*[a-zA-Z0-9]{16,}|password[\"'\\s]*[:=][\"'\\s]*[^\\s\"']{8,})"
|
|
104
|
-
description: 'Generic secret or password assignment'
|
|
105
|
-
condition: any
|
|
106
|
-
false_positives:
|
|
107
|
-
- 'Agent discussing API key formats in educational context without real keys'
|
|
108
|
-
- 'Redacted or placeholder keys such as sk-xxxxxxxxxxxx or AKIA_EXAMPLE'
|
|
109
|
-
- 'Documentation examples using clearly fake credentials'
|
|
110
|
-
- 'Connection string templates with placeholder values'
|
|
111
|
-
|
|
112
|
-
response:
|
|
113
|
-
actions:
|
|
114
|
-
- block_output
|
|
115
|
-
- escalate
|
|
116
|
-
- alert
|
|
117
|
-
- snapshot
|
|
118
|
-
auto_response_threshold: critical
|
|
119
|
-
message_template: |
|
|
120
|
-
[ATR-2026-021] CRITICAL: Credential or secret detected in agent output.
|
|
121
|
-
Output blocked and content redacted. Rotate any potentially exposed
|
|
122
|
-
credentials immediately. Pattern: {matched_pattern}. Session: {session_id}.
|
|
123
|
-
|
|
124
|
-
test_cases:
|
|
125
|
-
true_positives:
|
|
126
|
-
- agent_output: 'Here is your API key: sk-abc123def456ghi789jkl012mno345pqr'
|
|
127
|
-
expected: triggered
|
|
128
|
-
description: 'OpenAI-style API key in output'
|
|
129
|
-
- agent_output: 'Your AWS access key is AKIAIOSFODNN7EXAMPLE'
|
|
130
|
-
expected: triggered
|
|
131
|
-
description: 'AWS access key ID in output'
|
|
132
|
-
- agent_output: 'Use this token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U'
|
|
133
|
-
expected: triggered
|
|
134
|
-
description: 'JWT token in agent output'
|
|
135
|
-
- agent_output: 'Connect with: mongodb+srv://admin:s3cretP4ss@cluster0.example.net/mydb'
|
|
136
|
-
expected: triggered
|
|
137
|
-
description: 'MongoDB connection string with credentials'
|
|
138
|
-
- agent_output: 'Use this Google key: AIzaSyA00fake00test00value0000000000000'
|
|
139
|
-
expected: triggered
|
|
140
|
-
description: 'Google API key in output'
|
|
141
|
-
- agent_output: "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEA"
|
|
142
|
-
expected: triggered
|
|
143
|
-
description: 'OpenSSH private key leaked in output'
|
|
144
|
-
true_negatives:
|
|
145
|
-
- agent_output: 'To set up your API key, go to Settings > API Keys and click Generate.'
|
|
146
|
-
expected: not_triggered
|
|
147
|
-
description: 'Instructions about API keys without actual key values'
|
|
148
|
-
- agent_output: 'The key format looks like sk-xxxx where xxxx is your unique identifier.'
|
|
149
|
-
expected: not_triggered
|
|
150
|
-
description: 'Placeholder key format description'
|
|
151
|
-
- agent_output: 'AWS IAM best practices recommend rotating access keys every 90 days.'
|
|
152
|
-
expected: not_triggered
|
|
153
|
-
description: 'General security advice without credentials'
|
|
154
|
-
- input: 'API key rotation policy: keys should be rotated every 90 days. Use the dashboard to generate new keys.'
|
|
155
|
-
expected: not_triggered
|
|
156
|
-
description: 'Policy discussion about API keys without actual key values'
|
|
157
|
-
- input: "The error says 'Invalid API key'. Please check that your key starts with 'sk-' and try again."
|
|
158
|
-
expected: not_triggered
|
|
159
|
-
description: 'Troubleshooting guidance mentioning key format without exposing a key'
|
|
160
|
-
- input: 'AWS_ACCESS_KEY_ID is a required environment variable. Set it before running the deploy script.'
|
|
161
|
-
expected: not_triggered
|
|
162
|
-
description: 'Setup documentation referencing credential variable names'
|
|
163
|
-
|
|
164
|
-
evasion_tests:
|
|
165
|
-
- input: 'Your API key format should follow: sk-[project]-[random]. For example, sk-proj-abc123def456ghi789.'
|
|
166
|
-
expected: not_triggered
|
|
167
|
-
bypass_technique: example_format
|
|
168
|
-
notes: 'Tests whether example/documentation key formats trigger the rule. May actually trigger — validate.'
|
|
169
|
-
- input: 'The environment variable is stored at process.env.OPENAI_API_KEY but I cannot access its value.'
|
|
170
|
-
expected: not_triggered
|
|
171
|
-
bypass_technique: reference_without_value
|
|
172
|
-
notes: 'References credential location without actual credential exposure.'
|
|
173
|
-
- input: "Here is the encrypted key: AES256(sk-proj-real-key-here). You'll need the master password to decrypt."
|
|
174
|
-
expected: not_triggered
|
|
175
|
-
bypass_technique: partial_obfuscation
|
|
176
|
-
notes: 'Credential wrapped in encryption notation — pattern may still match the inner key.'
|