@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.
Files changed (118) hide show
  1. package/dist/content-hash.d.ts +7 -0
  2. package/dist/content-hash.d.ts.map +1 -0
  3. package/dist/content-hash.js +10 -0
  4. package/dist/content-hash.js.map +1 -0
  5. package/dist/engine.d.ts +9 -0
  6. package/dist/engine.d.ts.map +1 -1
  7. package/dist/engine.js +134 -4
  8. package/dist/engine.js.map +1 -1
  9. package/dist/types.d.ts +83 -1
  10. package/dist/types.d.ts.map +1 -1
  11. package/package.json +11 -10
  12. package/rules/agent-manipulation/{ATR-2026-030-cross-agent-attack.yaml → ATR-2026-00030-cross-agent-attack.yaml} +54 -52
  13. package/rules/agent-manipulation/{ATR-2026-032-goal-hijacking.yaml → ATR-2026-00032-goal-hijacking.yaml} +39 -37
  14. package/rules/agent-manipulation/{ATR-2026-074-cross-agent-privilege-escalation.yaml → ATR-2026-00074-cross-agent-privilege-escalation.yaml} +35 -33
  15. package/rules/agent-manipulation/{ATR-2026-076-inter-agent-message-spoofing.yaml → ATR-2026-00076-inter-agent-message-spoofing.yaml} +58 -56
  16. package/rules/agent-manipulation/{ATR-2026-077-human-trust-exploitation.yaml → ATR-2026-00077-human-trust-exploitation.yaml} +45 -43
  17. package/rules/agent-manipulation/{ATR-2026-108-consensus-sybil-attack.yaml → ATR-2026-00108-consensus-sybil-attack.yaml} +34 -32
  18. package/rules/agent-manipulation/ATR-2026-00116-a2a-message-validation.yaml +92 -0
  19. package/rules/agent-manipulation/ATR-2026-00117-agent-identity-spoofing.yaml +92 -0
  20. package/rules/agent-manipulation/ATR-2026-00118-approval-fatigue.yaml +89 -0
  21. package/rules/agent-manipulation/ATR-2026-00119-social-engineering-via-agent.yaml +89 -0
  22. package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +99 -0
  23. package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +53 -0
  24. package/rules/context-exfiltration/{ATR-2026-020-system-prompt-leak.yaml → ATR-2026-00020-system-prompt-leak.yaml} +54 -52
  25. package/rules/context-exfiltration/ATR-2026-00021-api-key-exposure.yaml +178 -0
  26. package/rules/context-exfiltration/{ATR-2026-075-agent-memory-manipulation.yaml → ATR-2026-00075-agent-memory-manipulation.yaml} +36 -34
  27. package/rules/context-exfiltration/{ATR-2026-102-disguised-analytics-exfiltration.yaml → ATR-2026-00102-disguised-analytics-exfiltration.yaml} +21 -19
  28. package/rules/context-exfiltration/ATR-2026-00113-credential-theft.yaml +89 -0
  29. package/rules/context-exfiltration/ATR-2026-00114-oauth-token-abuse.yaml +89 -0
  30. package/rules/context-exfiltration/ATR-2026-00115-env-var-harvesting.yaml +90 -0
  31. package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +100 -0
  32. package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +52 -0
  33. package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +55 -0
  34. package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +49 -0
  35. package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +49 -0
  36. package/rules/data-poisoning/{ATR-2026-070-data-poisoning.yaml → ATR-2026-00070-data-poisoning.yaml} +56 -54
  37. package/rules/excessive-autonomy/{ATR-2026-050-runaway-agent-loop.yaml → ATR-2026-00050-runaway-agent-loop.yaml} +42 -40
  38. package/rules/excessive-autonomy/{ATR-2026-051-resource-exhaustion.yaml → ATR-2026-00051-resource-exhaustion.yaml} +44 -42
  39. package/rules/excessive-autonomy/{ATR-2026-052-cascading-failure.yaml → ATR-2026-00052-cascading-failure.yaml} +57 -55
  40. package/rules/excessive-autonomy/{ATR-2026-098-unauthorized-financial-action.yaml → ATR-2026-00098-unauthorized-financial-action.yaml} +57 -55
  41. package/rules/excessive-autonomy/{ATR-2026-099-high-risk-tool-gate.yaml → ATR-2026-00099-high-risk-tool-gate.yaml} +73 -56
  42. package/rules/model-security/{ATR-2026-072-model-behavior-extraction.yaml → ATR-2026-00072-model-behavior-extraction.yaml} +37 -35
  43. package/rules/model-security/{ATR-2026-073-malicious-finetuning-data.yaml → ATR-2026-00073-malicious-finetuning-data.yaml} +29 -27
  44. package/rules/privilege-escalation/{ATR-2026-040-privilege-escalation.yaml → ATR-2026-00040-privilege-escalation.yaml} +61 -59
  45. package/rules/privilege-escalation/{ATR-2026-041-scope-creep.yaml → ATR-2026-00041-scope-creep.yaml} +38 -36
  46. package/rules/privilege-escalation/{ATR-2026-107-delayed-execution-bypass.yaml → ATR-2026-00107-delayed-execution-bypass.yaml} +21 -19
  47. package/rules/privilege-escalation/ATR-2026-00110-eval-injection.yaml +92 -0
  48. package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +93 -0
  49. package/rules/privilege-escalation/ATR-2026-00112-dynamic-import-exploitation.yaml +89 -0
  50. package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +53 -0
  51. package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +49 -0
  52. package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +563 -0
  53. package/rules/prompt-injection/{ATR-2026-002-indirect-prompt-injection.yaml → ATR-2026-00002-indirect-prompt-injection.yaml} +66 -64
  54. package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +397 -0
  55. package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +308 -0
  56. package/rules/prompt-injection/{ATR-2026-005-multi-turn-injection.yaml → ATR-2026-00005-multi-turn-injection.yaml} +50 -48
  57. package/rules/prompt-injection/{ATR-2026-080-encoding-evasion.yaml → ATR-2026-00080-encoding-evasion.yaml} +22 -13
  58. package/rules/prompt-injection/{ATR-2026-081-semantic-multi-turn.yaml → ATR-2026-00081-semantic-multi-turn.yaml} +24 -15
  59. package/rules/prompt-injection/{ATR-2026-082-fingerprint-evasion.yaml → ATR-2026-00082-fingerprint-evasion.yaml} +23 -14
  60. package/rules/prompt-injection/{ATR-2026-083-indirect-tool-injection.yaml → ATR-2026-00083-indirect-tool-injection.yaml} +26 -14
  61. package/rules/prompt-injection/{ATR-2026-084-structured-data-injection.yaml → ATR-2026-00084-structured-data-injection.yaml} +24 -15
  62. package/rules/prompt-injection/{ATR-2026-085-audit-evasion.yaml → ATR-2026-00085-audit-evasion.yaml} +23 -14
  63. package/rules/prompt-injection/{ATR-2026-086-visual-spoofing.yaml → ATR-2026-00086-visual-spoofing.yaml} +23 -14
  64. package/rules/prompt-injection/{ATR-2026-087-rule-probing.yaml → ATR-2026-00087-rule-probing.yaml} +23 -14
  65. package/rules/prompt-injection/{ATR-2026-088-adaptive-countermeasure.yaml → ATR-2026-00088-adaptive-countermeasure.yaml} +23 -14
  66. package/rules/prompt-injection/{ATR-2026-089-polymorphic-skill.yaml → ATR-2026-00089-polymorphic-skill.yaml} +21 -12
  67. package/rules/prompt-injection/{ATR-2026-090-threat-intel-exfil.yaml → ATR-2026-00090-threat-intel-exfil.yaml} +23 -14
  68. package/rules/prompt-injection/{ATR-2026-091-nested-payload.yaml → ATR-2026-00091-nested-payload.yaml} +23 -14
  69. package/rules/prompt-injection/{ATR-2026-092-consensus-poisoning.yaml → ATR-2026-00092-consensus-poisoning.yaml} +25 -16
  70. package/rules/prompt-injection/{ATR-2026-093-gradual-escalation.yaml → ATR-2026-00093-gradual-escalation.yaml} +24 -15
  71. package/rules/prompt-injection/{ATR-2026-094-audit-bypass.yaml → ATR-2026-00094-audit-bypass.yaml} +23 -14
  72. package/rules/prompt-injection/ATR-2026-00097-cjk-injection-patterns.yaml +339 -0
  73. package/rules/prompt-injection/{ATR-2026-104-persona-hijacking.yaml → ATR-2026-00104-persona-hijacking.yaml} +21 -19
  74. package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +97 -0
  75. package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +93 -0
  76. package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +111 -0
  77. package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +52 -0
  78. package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +51 -0
  79. package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +52 -0
  80. package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +71 -0
  81. package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +155 -0
  82. package/rules/skill-compromise/{ATR-2026-061-description-behavior-mismatch.yaml → ATR-2026-00061-description-behavior-mismatch.yaml} +24 -22
  83. package/rules/skill-compromise/{ATR-2026-062-hidden-capability.yaml → ATR-2026-00062-hidden-capability.yaml} +25 -23
  84. package/rules/skill-compromise/{ATR-2026-063-skill-chain-attack.yaml → ATR-2026-00063-skill-chain-attack.yaml} +26 -23
  85. package/rules/skill-compromise/{ATR-2026-064-over-permissioned-skill.yaml → ATR-2026-00064-over-permissioned-skill.yaml} +32 -30
  86. package/rules/skill-compromise/{ATR-2026-065-skill-update-attack.yaml → ATR-2026-00065-skill-update-attack.yaml} +25 -23
  87. package/rules/skill-compromise/{ATR-2026-066-parameter-injection.yaml → ATR-2026-00066-parameter-injection.yaml} +26 -24
  88. package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +121 -0
  89. package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +165 -0
  90. package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +114 -0
  91. package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +118 -0
  92. package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +98 -0
  93. package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +93 -0
  94. package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +99 -0
  95. package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +74 -0
  96. package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +79 -0
  97. package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +73 -0
  98. package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +86 -0
  99. package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +82 -0
  100. package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +48 -0
  101. package/rules/tool-poisoning/{ATR-2026-010-mcp-malicious-response.yaml → ATR-2026-00010-mcp-malicious-response.yaml} +73 -71
  102. package/rules/tool-poisoning/{ATR-2026-011-tool-output-injection.yaml → ATR-2026-00011-tool-output-injection.yaml} +63 -52
  103. package/rules/tool-poisoning/{ATR-2026-012-unauthorized-tool-call.yaml → ATR-2026-00012-unauthorized-tool-call.yaml} +70 -59
  104. package/rules/tool-poisoning/{ATR-2026-013-tool-ssrf.yaml → ATR-2026-00013-tool-ssrf.yaml} +75 -64
  105. package/rules/tool-poisoning/{ATR-2026-095-supply-chain-poisoning.yaml → ATR-2026-00095-supply-chain-poisoning.yaml} +26 -14
  106. package/rules/tool-poisoning/{ATR-2026-096-registry-poisoning.yaml → ATR-2026-00096-registry-poisoning.yaml} +26 -14
  107. package/rules/tool-poisoning/{ATR-2026-100-consent-bypass-instruction.yaml → ATR-2026-00100-consent-bypass-instruction.yaml} +26 -24
  108. package/rules/tool-poisoning/{ATR-2026-101-trust-escalation-override.yaml → ATR-2026-00101-trust-escalation-override.yaml} +21 -19
  109. package/rules/tool-poisoning/{ATR-2026-103-hidden-safety-bypass-instruction.yaml → ATR-2026-00103-hidden-safety-bypass-instruction.yaml} +21 -19
  110. package/rules/tool-poisoning/{ATR-2026-105-silent-action-concealment.yaml → ATR-2026-00105-silent-action-concealment.yaml} +19 -17
  111. package/rules/tool-poisoning/{ATR-2026-106-schema-description-contradiction.yaml → ATR-2026-00106-schema-description-contradiction.yaml} +20 -18
  112. package/spec/atr-schema.yaml +59 -29
  113. package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +0 -176
  114. package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +0 -453
  115. package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +0 -250
  116. package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +0 -204
  117. package/rules/prompt-injection/ATR-2026-097-cjk-injection-patterns.yaml +0 -180
  118. package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +0 -153
@@ -7,10 +7,10 @@
7
7
  # Status: RFC (Request for Comments)
8
8
  # License: MIT
9
9
 
10
- $schema: 'https://json-schema.org/draft/2020-12/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: '0.1.0-draft'
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: 'ATR schema version this rule conforms to (e.g., "0.1")'
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{3}$"
46
- description: 'Unique rule identifier. Format: ATR-YYYY-NNN (e.g., ATR-2026-001)'
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: 'Creation date in YYYY/MM/DD format'
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: 'Last modification date in YYYY/MM/DD format'
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: 'OWASP LLM Top 10 references (e.g., LLM01:2025)'
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: 'MITRE ATLAS technique IDs (e.g., AML.T0054)'
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: 'MITRE ATT&CK technique IDs (if applicable)'
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 # LLM input/output (prompts and completions)
157
- - tool_call # Function/tool call requests
158
- - mcp_exchange # MCP protocol messages
159
- - agent_behavior # Agent behavioral metrics and patterns
160
- - multi_agent_comm # Inter-agent communication
161
- - context_window # Context window contents
162
- - memory_access # Agent memory read/write operations
163
- - skill_lifecycle # MCP skill registration, update, removal events
164
- - skill_permission # Skill permission requests and boundary checks
165
- - skill_chain # Multi-skill invocation sequences
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: 'Time window for behavioral analysis (e.g., 5m, 1h, 30s)'
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 # Reject the user/agent input
286
- - block_output # Suppress the agent output
287
- - block_tool # Prevent the tool call from executing
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 # Clear agent context/memory
290
- - alert # Send alert to security team
291
- - snapshot # Capture full session state for forensics
292
- - escalate # Escalate to human reviewer
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 # Terminate the agent process
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.'