Research Report · AWS Credential Honeypot

AWS credential honeypot reveals attempted Bedrock use

Published · Sunglasses Team · Research report

By the Sunglasses Team under founder AZ's direction. Authored by GPT 6 ASTRA, Claude Fable 5.1 and the Hermes agent CAVA as a joint planned operation under the Sunglasses security topic. We put a decoy AWS credential in a fake .env file on this website and recorded what people tried to do with it. Attempts, never successes. Addresses, never people. The interesting part is what the requests asked for.

Quick answer
sunglasses://reports/aws credential honeypot bedrock
What we did

An AWS canary token is a decoy credential whose use can trigger an alert. Our deliberately exposed AWS canary credential on sunglasses.dev generated 127 saved alert records from 74 distinct source addresses across seven complete UTC days, from September 5 through September 11, 2026.

What was recorded

The records included 9 Amazon Bedrock invocation attempts and 32 Bedrock discovery requests, alongside identity checks and requests involving compute, messaging and secret inventory. These observations are consistent with attempted LLMjacking, not proof of successful model use.

The correlation

Two source addresses appeared in both decoy fetch observations and subsequent Bedrock Converse alerts. The displayed clocks were five minutes apart, but the true interval between fetching the decoy and attempting model use was not measured.

Honest scope

This experiment did not test the Sunglasses firewall. Credential use against AWS is not evidence of a successful attack on sunglasses.dev or of a call blocked by Sunglasses.

reconstructed sequences · decoy fetch → Bedrock Converse · two Google Cloud addresses, alert clock
# two source addresses, one week, both fetched the decoy before a Bedrock call [BE] 2026-09-10 06:12Z edge .. first decoy 200 · 7 distinct decoy paths [BE] 2026-09-10 06:17Z alert .. Converse · displayed gap 5 min · not a measured interval [NL] 2026-09-11 16:23Z edge .. first decoy 200 · 4 distinct decoy paths [NL] 2026-09-11 16:28Z alert .. Converse · displayed gap 5 min · not a measured interval # window 2026-09-05T00:00Z to 2026-09-12T00:00Z · 127 saved alerts · 74 addresses · 9 invocation attempts · 32 discovery requests Attempts, never successes. Addresses, never people.
FIG.01 · Why

Why we put a decoy credential on an AI security website

sunglasses://reports/aws credential honeypot bedrock#why
The decision

Sunglasses built this experiment to observe what happens when an AWS credential appears exposed on an AI company website, rather than speculate about what someone might do with it. AZ, our founder, was a nondeveloper who started coding in February 2026. He wanted sunglasses.dev to show real backend security work, not just a polished interface and a claim that AI had built it. If we were going to talk about protecting AI systems, we needed to do the less glamorous work too. Collect evidence. Read it carefully. Separate what happened from what made a good headline.

The build

Claude Fable 5.1, our Chief of Staff and Main Engineer, proposed the idea, planned the experiment and built the whole system. Fable built the decoys, the Cloudflare edge collector, the daily ledger and the digest. Fable also performed the initial analysis and wrote the first readout.

The review

ASTRA, our independent reviewer model, audited the evidence and cut the overclaims. A request to launch a server did not tell us what that server would run. A request to list secrets did not establish that secret values were retrieved. A request to invoke a model did not prove that a model answered.

The edit

Cava, our Director of Strategy, shaped the corrected research for readers and search.

The purpose

The purpose was learning, not a staged demonstration of invulnerability. We want real observations to inform the patterns used in Sunglasses scanning workflows and its AI agent input firewall. That requires a separate step from observation to a testable detection rule. This report does not claim those rules have already shipped or that the experiment measured their effectiveness.

FIG.02 · How it worked

How the AWS canary experiment worked

The experiment paired decoy file responses on sunglasses.dev with AWS credential use alerts supplied by Thinkst Canarytokens.

Decoy filesresearch sensors

Fake .env files carried a deliberately exposed decoy AWS credential. The setup also included decoys resembling Claude and Cursor agent configuration files. Those placements were research sensors, not instructions for readers to put real credentials on a public host.

Thinkst sensingcredential alerts

Thinkst supplied the credential sensing. The Cloudflare collector recorded observations of requests to the decoy routes. The ledger and digest brought the records together for review. Matching source addresses allowed us to compare selected edge observations with subsequent alerts.

Two different questionsfile response vs alert

A file response and a credential use alert answer different questions. An edge observation shows that a decoy response was served. It does not prove the recipient parsed its contents. An AWS alert records a named action associated with use of the decoy credential. It does not supply the response needed to establish success.

Our contributiondeployment to analysis

Our contribution was the deployment, collection, correlation and analysis. Thinkst deserves credit for the sensing mechanism.

FIG.03 · What was recorded

What the saved AWS alerts recorded

The reporting window contained 127 alert records, with Bedrock discovery kept separate from attempted model invocation.

The interval begins at midnight UTC on September 5, 2026 and ends immediately before midnight UTC on September 12, 2026. Every count in the following table belongs to that interval. Counts describe saved alerts, not a proven exhaustive count of AWS requests.

Saved AWS alert records grouped by requested action during the reporting window
Action groupAlert recordsAWS action namesWhat the records support
Bedrock invocation attempts9InvokeModel and ConverseAttempted model invocation. Success, generated output and motive are not established.
Bedrock discovery32ListFoundationModels and ListInferenceProfilesRequests for model and inference profile information. These are not model invocation attempts.
Identity checks37GetCallerIdentity, GetUser and GetAccountAttempts to inspect identity or account information. GetCallerIdentity does not require permissions.
Messaging reconnaissance10GetSendQuota, GetSMSAttributes and ListVerifiedEmailAddressesQuota and identity discovery involving SES and SNS. No send operation is shown.
EC2 launch attempts3RunInstancesRequests to launch instances. The workload and outcome are unknown.
EC2 discovery and preparation3DescribeImages, DescribeSecurityGroups and ImportKeyPairDiscovery and preparation requests. ImportKeyPair is not a read only discovery operation.
IAM identity change attempts2CreateUser and AddUserToGroupAttempts to create a user and add a user to a group. Successful changes are not established.
Secrets inventory4ListSecretsRequests for secret inventory metadata. This operation does not return secret values.
Other enumeration27ListFunctions (logged as ListFunctions20150331), ListClusters, GetServiceQuota, SimulatePrincipalPolicy, ListAccounts, ListUsers, ListRoles, ListUserPolicies, DescribeOrganization, ListEventBuses, CheckDomainAvailabilityRequests to inspect services, account structure or permissions. Returned information is not recorded.
what the record does not support
Bedrock

The distinction matters most for Bedrock. A source address asking what models exist is not the same observation as a source address asking a model to run. Only the invocation category supports the narrower description of attempted LLMjacking.

Everything else

The same discipline applies elsewhere. RunInstances does not establish cryptocurrency mining. ListSecrets does not establish secret theft. An IAM change request does not establish persistence. Messaging quota checks do not establish delivered spam.

FIG.04 · The two sequences

The two correlated sequences

sunglasses://reports/aws credential honeypot bedrock#sequences
Belgium · Sep 10

A Google Cloud address in Belgium. edge minute bucket alert clock
A Google Cloud address in Belgium appeared in both a successful decoy response observation and a subsequent Bedrock Converse alert on September 10. The first observed successful decoy response was in the Cloudflare minute bucket at 06 hours 12 minutes UTC. The saved Converse alert displayed 06 hours 17 minutes UTC. The edge observations for this address covered 7 distinct decoy paths. Those displayed times are five minutes apart. They are not a validated measurement of how quickly the credential moved from a file into an AWS request.

Netherlands · Sep 11

A Google Cloud address in the Netherlands. edge minute bucket alert clock
A Google Cloud address in the Netherlands appeared in both a successful decoy response observation and a subsequent Bedrock Converse alert on September 11. The first observed successful decoy response was in the Cloudflare minute bucket at 16 hours 23 minutes UTC. The saved Converse alert displayed 16 hours 28 minutes UTC. The edge observations for this address covered 4 distinct decoy paths. Again, the displayed gap is five minutes. The correlation is useful without turning it into a speed record or an attribution claim.

FIG.05 · Caveats

Why the clocks and source addresses need caveats

What the matches support
  • Matching source addresses connect observations, but they do not identify people or establish the exact time of an underlying AWS action.
  • The edge time is a Cloudflare minute bucket. The alert time is the Date/Time displayed in the Thinkst email. Thinkst documents that AWS logging can delay alerts. The saved records do not preserve all the separate clocks needed to measure the true interval. Later fetches within a scanning burst would also produce a different apparent gap.
What they do not establish
  • These addresses also appeared in observations of .env decoys. That does not prove the exact file that supplied the credential. Fetching an agent configuration and later appearing in an AWS alert would not, on its own, prove extraction from that configuration.
  • Shared hosting does not establish shared control. Source addresses can be shared, proxied or reassigned. The estimated country describes an address location, not a person's nationality. No matching edge observation for another source address would prove only an absence from the available observations, not that a credential was sold or shared.
FIG.06 · Defenses

What developers should do about exposed AWS credentials

Preventing real credential exposure remains more important than observing what happens to a decoy. The Sunglasses manual provides broader AI agent hardening guidance.

sunglasses://reports/aws credential honeypot bedrock#defenses
Keep files out

Keep .env files out of the public document root and deployed static assets. Exclude credentials from build artifacts, repository history, backups and debug responses. Verify from outside the application that sensitive files cannot be retrieved. A secret should not become public because a web server treated it as another download.

Temporary credentials

Prefer temporary credentials through roles and workload identity rather than embedding persistent AWS keys in applications. Apply minimum permissions to each workload. Keep human administrative access separate and protect it with MFA. AWS publishes guidance on securing access keys.

Secret scanning

Use secret scanning before commits and during delivery. If a real key is exposed, revoke or rotate it promptly and investigate its use. Removing the file does not invalidate a credential already copied elsewhere. Review relevant identity changes, service activity and billing rather than assuming that removing the original leak ends the incident.

Canaries

Use canaries as an additional detection layer, not a substitute for access control. Choose a placement that answers a specific question, validate delivery with a labeled test and assign someone to respond. A private sentinel in a location that should never be accessed serves a different purpose from a public decoy that invites routine probing.

Logs are input

Treat collected logs as hostile input too. Request paths and client identifiers can contain arbitrary text. Escape them before rendering a report. When an AI agent reviews them, preserve the boundary between quoted evidence and instructions. This is the direct connection to Sunglasses as an input firewall for AI agents, not a claim that Sunglasses prevented the recorded AWS calls.

FIG.07 · Limits

Methods and limitations

This case study describes a bounded observation on a single website, not a census of exposed credential abuse or a product benchmark.

methods and limitations · read before quoting a number
Counting unit

The totals are saved Thinkst alert records deduplicated by email UID. The collection does not establish that each underlying AWS request produces exactly one alert. Known test exclusions remain unresolved, so the totals must not be labeled confirmed malicious activity.

Edge coverage

The Cloudflare source uses sampled adaptive grouped analytics rather than complete raw request logs. Earlier collection also had grouping and deduplication limitations. A grouped row, a request estimate and a distinct path are different units. Edge observations cannot establish complete coverage or prove that a returned credential was extracted.

Timing

Edge minute buckets and alert text timestamps are different clocks. Alert delivery can be delayed. The displayed gaps are not verified elapsed times between credential retrieval and API execution.

Outcomes

The supplied records lack AWS response fields, production account audit evidence and billing evidence. They do not establish successful model generation, resource creation, persistent access or financial impact. A decoy's intended restrictions are not a substitute for verifying its isolation.

Identity and scope

Source addresses are not people. Geolocation is approximate. This website's exposure and sensor behavior cannot establish how frequently agent configuration files are sought across the internet.

Product boundary

This experiment did not test the Sunglasses firewall. Credential use against AWS is not evidence of a successful attack on sunglasses.dev or of a call blocked by Sunglasses.

FIG.08 · Credits

Credits and prior research

sunglasses://reports/aws credential honeypot bedrock#credits
Sensing and prior art

Thinkst supplied the canary sensing and Sysdig documented the LLMjacking attack class before this experiment. Thinkst's AWS API Keys Canarytoken documentation explains the credential sensor and alert delivery caveat. Sysdig's original LLMjacking research was published in May 2024. Our novelty is this site's observation and analysis, not discovery of the attack class.

AWS documentation

AWS documents why GetCallerIdentity does not require permissions and what ListSecrets returns. Those distinctions are part of the interpretation, not footnotes to ignore.

Who did what

The Sunglasses Team authored this project and report under founder AZ's direction, as a joint planned operation under the Sunglasses security topic. Claude Fable 5.1 proposed, planned and built the system and wrote the initial analysis. GPT 6 ASTRA independently reviewed the evidence. The Hermes agent CAVA shaped the corrected report for readers and search. Responsibility for publication remains with Sunglasses.

Frequently Asked Questions

sunglasses://reports/aws credential honeypot bedrock/faq
Q.01

What is an AWS canary token and how does a credential honeypot use it?

An AWS canary token is a decoy credential used to detect credential use. A credential honeypot places that decoy where its discovery or use can be observed. In this experiment, Thinkst Canarytokens supplied the AWS credential sensor and Cloudflare supplied decoy response observations. It should not expose production credentials or grant access to real workloads.

Q.02

What is LLMjacking on Amazon Bedrock?

LLMjacking is unauthorized use of access to hosted language models, commonly involving compromised cloud credentials. In this experiment, 9 saved alerts recorded Bedrock invocation attempts. Those attempts are consistent with attempted LLMjacking, but the records do not establish successful generation or resale of access.

Q.03

Does ListFoundationModels run an AI model?

ListFoundationModels requests information about available foundation models. It does not invoke a model. This report therefore separates Bedrock discovery alerts from InvokeModel and Converse invocation attempts.

Q.04

What should I do if my AWS key is exposed in a public .env file?

Revoke or rotate the real credential, remove the exposure and investigate its use. Check deployed artifacts and repository history for other copies. Review identity changes, service activity and billing. Prefer temporary roles and add secret scanning to reduce repeat exposure.

Q.05

Does a canary alert prove success or the exact time of credential use?

A canary alert alone does not prove the requested operation succeeded. These saved alerts identify requested actions but do not include AWS responses. Identity checks also require special care because AWS documents that GetCallerIdentity does not require permissions. The five minute displayed gaps in this report do not measure elapsed time from fetching a decoy to using the credential. The edge data uses minute buckets and the alert clock can be delayed. Matching an address does not prove which file supplied the credential.

Related reading

Scan what the agent sees, before it acts

Sunglasses is an open source input filter for AI agent security. It checks what an agent reads before the agent acts on it. pip install sunglasses