Detection rules › Splunk
AWS Bedrock Claude Cross Region Possible Inference Abuse
This detection identifies potential cross-region inference abuse in AWS Bedrock Claude models. Cross-region inference abuse may indicate attempts to bypass regional restrictions, exfiltrate data, or perform unauthorized actions across different AWS regions.
Known false positives
- False positives may arise from legitimate use cases where users are accessing AWS Bedrock Claude models across different regions for valid reasons, such as multi-region deployments, testing, or development purposes. It is important to review the context of the detected events to determine if they represent actual abuse or benign usage.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Defense Impairment |
Rule body
name: AWS Bedrock Claude Cross Region Possible Inference Abuse
id: e3d3f27d-b08e-415a-9811-8f72a0905ca6
version: 1
creation_date: '2026-07-06'
modification_date: '2026-07-06'
author: Rod Soto
status: production
type: Anomaly
data_source:
- AWS Bedrock Claude
category: application
description: This detection identifies potential cross-region inference abuse in AWS Bedrock Claude models. Cross-region inference abuse may indicate attempts to bypass regional restrictions, exfiltrate data, or perform unauthorized actions across different AWS regions.
search: |-
`aws_bedrock_claude`
| rename "identity.arn" AS user_arn
| rename "input.inputTokenCount" AS input_tokens
| rename "output.outputTokenCount" AS output_tokens
| rex field=user_arn "assumed-role/[^/]+/(?<user>[^\"]+)$"
| rex field="input.inputBodyJson.metadata.user_id" "(?<session_user>user_[^_]+.*)"
| eval input_tokens=tonumber(input_tokens)
| eval output_tokens=tonumber(output_tokens)
| eval token_ratio=round(output_tokens / max(input_tokens,1), 2)
| eval model_short=replace(modelId,"^.*/","")
| eval mismatch_detail=region." -> ".inferenceRegion
| where isnotnull(user_arn) AND len(user_arn)>10
| where isnotnull(session_user)
| where region!=inferenceRegion
| where input_tokens>=2000
| table _time, user, user_arn, session_user, model_short, input_tokens, output_tokens, token_ratio, mismatch_detail, operation, host
| sort - input_tokens
| `aws_bedrock_claude_cross_region_possible_inference_abuse_filter`
how_to_implement: You must install and configure the Splunk Add-on for AWS (https://splunkbase.splunk.com/app/1876). Enable Amazon Bedrock model invocation logging in AWS so that Claude request/response payloads are delivered to S3 and/or CloudWatch Logs (see https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html for setup steps), then ingest those logs into Splunk via the AWS TA. Configure the `aws_bedrock_claude` macro to point to the index and sourcetype (`json_no_timestamp`) where these logs land.
known_false_positives: False positives may arise from legitimate use cases where users are accessing AWS Bedrock Claude models across different regions for valid reasons, such as multi-region deployments, testing, or development purposes. It is important to review the context of the detected events to determine if they represent actual abuse or benign usage.
references:
- https://aws.amazon.com/blogs/apn/unlocking-the-power-of-splunk-with-amazon-bedrock-an-agentic-ai-approach-to-build-customized-splunk-assistants-using-bedrock-agents/
- https://help.splunk.com/en/splunk-observability-cloud/observability-for-ai/splunk-ai-infrastructure-monitoring/set-up-ai-infrastructure-monitoring/amazon-bedrock
- https://research.splunk.com/stories/aws_bedrock_security/
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html
intermediate_findings:
entities:
- field: user
type: user
score: 20
message: Cross-region inference abuse detected from $user$ ($session_user$) using model $model_short$ with region mismatch $mismatch_detail$ and $input_tokens$ input tokens on $host$.
analytic_story:
- Suspicious AWS Bedrock Claude Activities
asset_type: Web Application
mitre_attack_id:
- T1599
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
security_domain: endpoint
Stages and Predicates
Stage 1: search
`aws_bedrock_claude`
Stage 2: rename
| rename "identity.arn" AS user_arn
Stage 3: rename
| rename "input.inputTokenCount" AS input_tokens
Stage 4: rename
| rename "output.outputTokenCount" AS output_tokens
Stage 5: rex
| rex field=user_arn "assumed-role/[^/]+/(?<user>[^\"]+)$"
Stage 6: rex
| rex field="input.inputBodyJson.metadata.user_id" "(?<session_user>user_[^_]+.*)"
Stage 7: eval
| eval input_tokens=tonumber(input_tokens)
Stage 8: eval
| eval output_tokens=tonumber(output_tokens)
Stage 9: eval
| eval token_ratio=round(output_tokens / max(input_tokens,1), 2)
Stage 10: eval
| eval model_short=replace(modelId,"^.*/","")
Stage 11: eval
| eval mismatch_detail=region." -> ".inferenceRegion
Stage 12: where
| where isnotnull(user_arn) AND len(user_arn)>10
Stage 13: where
| where isnotnull(session_user)
Stage 14: where
| where region!=inferenceRegion
Stage 15: where
| where input_tokens>=2000
Stage 16: table
| table _time, user, user_arn, session_user, model_short, input_tokens, output_tokens, token_ratio, mismatch_detail, operation, host
Stage 17: sort
| sort - input_tokens
Stage 18: search
| `aws_bedrock_claude_cross_region_possible_inference_abuse_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
input_tokens | ge |
| field:"input_tokens" kind:ge value:"2000" |
region | cross_field_compare |
| field:"region" kind:cross_field_compare value:"inferenceRegion" |
session_user | is_not_null | field:"session_user" kind:is_not_null | |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"json_no_timestamp" |
user_arn | is_not_null | field:"user_arn" kind:is_not_null |