Anthropic Excessive Chat Access Failures

Detects a single authenticated user generating an unusually high number of denied Claude chat access attempts in a 24-hour window. That pattern fits automated chat enumeration or attempts to reach conversations outside the actor's permissions. Unauthenticated shared-link actors lack user.id and are excluded.

Elastic rule (View on GitHub)

  1[metadata]
  2creation_date = "2026/09/12"
  3integration = ["anthropic"]
  4maturity = "production"
  5updated_date = "2026/09/25"
  6
  7[rule]
  8author = ["Elastic"]
  9description = """
 10Detects a single authenticated user generating an unusually high number of denied Claude chat access attempts in a
 1124-hour window. That pattern fits automated chat enumeration or attempts to reach conversations outside the actor's
 12permissions. Unauthenticated shared-link actors lack user.id and are excluded.
 13"""
 14false_positives = [
 15    """
 16    Users browsing many stale or revoked shared chat links during incident response or legal review can produce bursts
 17    of access failures. Confirm whether the activity matches an approved investigation before escalating.
 18    """,
 19]
 20from = "now-24h"
 21interval = "1h"
 22language = "esql"
 23license = "Elastic License v2"
 24name = "Anthropic Excessive Chat Access Failures"
 25note = """## Triage and analysis
 26
 27### Investigating Anthropic Excessive Chat Access Failures
 28
 29Alert keys: `user.id`, `organization.id`, and `source.ip` (plus `user.email` when present). The rule aggregates ≥20
 30`claude_chat_access_failed` events for one authenticated user in that org/IP over 24 hours. Unauthenticated
 31shared-link failures lack `user.id` and are out of scope.
 32
 33True positive: high failure-to-`claude_chat_viewed` ratio, sequential/patterned chat IDs, scripting UA. False
 34positive: legal/IR link review or broken bookmarks with scattered IDs and many successful views nearby.
 35
 36#### Possible investigation steps
 37
 38- Start from the alert keys (`user.id` / `organization.id` / `source.ip`) and the time window; pivot raw
 39  `claude_chat_access_failed` events.
 40- Review chat ID lists: sequential or patterned IDs suggest enumeration; scattered IDs fit shared-link browsing.
 41- Compare failure volume to `claude_chat_viewed` from the same actor. High failure-to-success ratio → enumeration.
 42- Check UA/automation signals and whether any failed chat IDs later succeed. Correlate with IAM/SSO/compliance key
 43  changes in the same period.
 44
 45### False positive analysis
 46
 47- Large revoked-link reviews and retrying expired URLs are FP when IDs are scattered and many `claude_chat_viewed`
 48  successes sit nearby (legal/IR ticket optional corroboration).
 49
 50### Response and remediation
 51
 52- On confirmed enumeration: revoke sessions, review recently accessed chats, rotate exposed shared links if needed,
 53  and check for data export or artifact sharing by the same user.
 54"""
 55references = ["https://platform.claude.com/docs/en/api/compliance/activities/list"]
 56risk_score = 47
 57rule_id = "a304c107-e0f0-4042-aa6c-5332ce6ca967"
 58severity = "medium"
 59tags = [
 60    "Domain: GenAI",
 61    "Platform: Anthropic",
 62    "Data Source: Anthropic Audit Logs",
 63    "Use Case: Threat Detection",
 64    "Use Case: UEBA",
 65    "Resources: Investigation Guide",
 66    "Rule Type: ES|QL",
 67    "Tactic: Discovery",
 68    "Mitre Atlas: AML.T0075",
 69]
 70timestamp_override = "event.ingested"
 71type = "esql"
 72
 73query = '''
 74from logs-anthropic.audit-*
 75| where
 76    data_stream.dataset == "anthropic.audit" and
 77    event.action == "claude_chat_access_failed" and
 78    user.id is not null
 79| stats
 80    Esql.event_count = count(*),
 81    Esql.event_id_values = values(event.id),
 82    Esql.anthropic_audit_claude_chat_id_values = values(anthropic.audit.claude_chat_id),
 83    Esql.anthropic_audit_claude_project_id_values = values(anthropic.audit.claude_project_id),
 84    Esql.source_ip_values = values(source.ip),
 85    Esql.user_agent_original_values = values(user_agent.original),
 86    Esql.anthropic_audit_actor_type_values = values(anthropic.audit.actor.type),
 87    Esql.user_email_values = values(user.email),
 88    Esql.timestamp_first_seen = min(@timestamp),
 89    Esql.timestamp_last_seen = max(@timestamp)
 90  by user.id, organization.id, source.ip
 91| where Esql.event_count >= 20
 92| keep user.id, organization.id, source.ip, Esql.*
 93'''
 94
 95
 96[[rule.threat]]
 97framework = "MITRE ATT&CK"
 98[[rule.threat.technique]]
 99id = "T1526"
100name = "Cloud Service Discovery"
101reference = "https://attack.mitre.org/techniques/T1526/"
102
103
104[rule.threat.tactic]
105id = "TA0007"
106name = "Discovery"
107reference = "https://attack.mitre.org/tactics/TA0007/"
108[[rule.threat_mappings]]
109framework = "MITRE ATLAS"
110version = "2026.08"
111[[rule.threat_mappings.threat]]
112framework = "MITRE ATLAS"
113[[rule.threat_mappings.threat.technique]]
114id = "AML.T0075"
115name = "Enterprise Resource Discovery"
116reference = "https://atlas.mitre.org/techniques/AML.T0075/"
117
118
119[rule.threat_mappings.threat.tactic]
120id = "AML.TA0008"
121name = "Discovery"
122reference = "https://atlas.mitre.org/tactics/AML.TA0008/"
123
124[rule.alert_suppression]
125group_by = ["user.id", "organization.id", "source.ip"]
126missing_fields_strategy = "suppress"
127
128[rule.investigation_fields]
129field_names = [
130    "user.id",
131    "organization.id",
132    "source.ip",
133    "Esql.event_count",
134    "Esql.event_id_values",
135    "Esql.user_email_values",
136    "Esql.anthropic_audit_claude_chat_id_values",
137    "Esql.anthropic_audit_claude_project_id_values",
138    "Esql.source_ip_values",
139    "Esql.user_agent_original_values",
140    "Esql.anthropic_audit_actor_type_values",
141    "Esql.timestamp_first_seen",
142    "Esql.timestamp_last_seen",
143]
144
145[rule.alert_suppression.duration]
146unit = "h"
147value = 24

Triage and analysis

Investigating Anthropic Excessive Chat Access Failures

Alert keys: user.id, organization.id, and source.ip (plus user.email when present). The rule aggregates ≥20 claude_chat_access_failed events for one authenticated user in that org/IP over 24 hours. Unauthenticated shared-link failures lack user.id and are out of scope.

True positive: high failure-to-claude_chat_viewed ratio, sequential/patterned chat IDs, scripting UA. False positive: legal/IR link review or broken bookmarks with scattered IDs and many successful views nearby.

Possible investigation steps

  • Start from the alert keys (user.id / organization.id / source.ip) and the time window; pivot raw claude_chat_access_failed events.
  • Review chat ID lists: sequential or patterned IDs suggest enumeration; scattered IDs fit shared-link browsing.
  • Compare failure volume to claude_chat_viewed from the same actor. High failure-to-success ratio → enumeration.
  • Check UA/automation signals and whether any failed chat IDs later succeed. Correlate with IAM/SSO/compliance key changes in the same period.

False positive analysis

  • Large revoked-link reviews and retrying expired URLs are FP when IDs are scattered and many claude_chat_viewed successes sit nearby (legal/IR ticket optional corroboration).

Response and remediation

  • On confirmed enumeration: revoke sessions, review recently accessed chats, rotate exposed shared links if needed, and check for data export or artifact sharing by the same user.

References

Related rules

to-top