HexBrain

AWS VDP · Report #3775702

Non-Production API Endpoints for the Amazon Cloudwatch Fails to Log to CloudTrail Resulting in Silent Permission Enumeration

Validstatus
mediumseverity
21upvotes
27 Jul 2026disclosed

How it was found

Summary: Typically, when an adversary gains access to stolen AWS IAM credentials they will frequently test those credentials to see what access they have. They do this by performing API calls and seeing which succeed and which fail. There are even automated tools to make this process easier. For defenders and security professionals, this behavior serves as a golden opportunity for detection as it likely involves generating a large number of failed API call attempts. If an adversary could enumerate permissions without logging to CloudTrail, they could perform this activity invisibly.

There are many categories of CloudTrail bypass. The specific variant we will be focused on in this report has been referred to as "non-production endpoint permission enumeration CloudTrail bypass". If you would like to learn more about it, you can find more details here.

We have found 4 non-production endpoints for the cloudwatch service which could be used with standard IAM credentials, and do not log the tested cloudwatch operation to CloudTrail. While it is good that these results do not prove access to customer partition data, the endpoints can still be used for permission enumeration without logging to CloudTrail.

AWS has previously stated that this type of vulnerability should be reported. Specifically, "For isolated non-production endpoints that do not log to CloudTrail but are otherwise callable with normal credentials and exhibit normal IAM permission behavior, AWS considers the CloudTrail logging bypass of such endpoints also to be a security issue. If you find an API or APIs on an endpoint with these characteristics, please contact the AWS Security Team at ████████".

Description:

Automated validation tested the candidate endpoint with two principals:

  • admin: privileged role used to observe authorized candidate endpoint behavior.
  • noperm: no-permission role used to confirm the candidate endpoint exhibits useful IAM authorization behavior.

For each endpoint in this report, the candidate endpoint call did not generate a matching CloudTrail event for either principal, and the candidate endpoint responses differed between the privileged and no-permission principals.

Steps To Reproduce:

Using a sufficiently privileged IAM user or role, perform the following AWS CLI operation against one of the affected candidate endpoints:

aws cloudwatch list-dashboards --region us-east-1 --cli-connect-timeout 10 --cli-read-timeout 10 --endpoint-url ████████ --no-verify-ssl

Wait 10-15 minutes and confirm that the request does not generate a matching CloudTrail event. Next, perform the same candidate endpoint call with a principal that does not have permission for the target action:

aws cloudwatch list-dashboards --region us-east-1 --cli-connect-timeout 10 --cli-read-timeout 10 --endpoint-url ████████ --no-verify-ssl

The second request also does not generate a matching CloudTrail event. An adversary can perform these calls and, depending on the response of the API, determine if an identity they have compromised does or does not have permission to perform the operation.

Additionally, depending on if a principal does or does not have permission to perform the action, the response from the affected endpoint will be different. Example evidence from the validation run is below.

Example: list-dashboards against ████████

CloudTrail lookup for the admin candidate endpoint call:

  • region us-east-1: matched_any=False, matched_marker=False, events=0, sources=none

CloudTrail lookup for the noperm candidate endpoint call:

  • region us-east-1: matched_any=False, matched_marker=False, events=0, sources=none

admin candidate response:

{
    "DashboardEntries": []
}

noperm candidate response:

An error occurred (AccessDenied) when calling the ListDashboards operation: User: arn:aws:sts::████████:assumed-role/noperm/vm-noperm-20260601T181312Z is not authorized to perform: cloudwatch:ListDashboards on resource: arn:aws:cloudwatch::████████:dashboard/* because no identity-based policy allows the cloudwatch:ListDashboards action

Supporting Material/References:

  • Indicate the Amazon service or product that this vulnerability occurs on:

cloudwatch

  • What type of Amazon AWS account(s) is needed to verify or reproduce this vulnerability?:

Standard commercial partition account

  • Estimated CVSS score and vector string:

4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N/CR:H/IR:H/AR:H

  • Estimated CWEs (comma separated):

CWE-778: Insufficient Logging

  • Have you already publicly disclosed any information on this issue? If so, when and where?:

This specific example? No. This general technique? Yes, a lot actually. I have blogged about it here and spoke about it at Black Hat USA 2023 (hxxps://www.youtube.com/watch?v=YP2XNAbB_Nw) and fwd:cloudsec 2023 (hxxps://www.youtube.com/watch?v=61C_lEQ5qNM) [I have broken these links because HackerOne appeared to complain about them?]

Additionally, we have reported similar findings for different services:

The following operation exhibited this behavior:

  • list-dashboards: 4 endpoint(s)

The following is a list of endpoints we found that exhibited this behavior:

EndpointRegionOperationAdmin responseNoperm responseCandidate CloudTrail result
████████us-east-1list-dashboardsnon-IAM-denyIAM denynone observed for admin or noperm
████████us-east-1list-dashboardsnon-IAM-denyIAM denynone observed for admin or noperm
████████us-east-1list-dashboardsnon-IAM-denyIAM denynone observed for admin or noperm
████████us-east-1list-dashboardsnon-IAM-denyIAM denynone observed for admin or noperm

Please note: We follow an industry standard 90-day vulnerability disclosure policy. You can read more about our policy here.

Impact

Summary:

An adversary can enumerate permissions of compromised credentials for the cloudwatch service without logging to CloudTrail.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original