We are at re:Invent 2026Book my merch
Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

LLMjacking: When Attackers Run LLMs on Your AWS Bill

What we've learned from 2026's Bedrock compromises, the AWS controls that stop them, and how to set up DoiT Cloud Intelligence as a tripwire

This page is also available in Deutsch, Español, Français, Italiano, 日本語, and Português.

Richard KangBy Dr. Richard KangOct 16, 202615 min read

About the author: Richard Kang is the APJ Field Engineer Lead, based in Singapore. About the data: The incident figures in this post come from AWS LLMjacking cases that DoiT's support team handled between June and October 2026. Customer details are anonymized, and dollar amounts are as reported in each case.

A sandbox account that normally costs $120 a day bills $85,000 in fourteen hours. A dormant member account, untouched for eleven months, runs up $75,000 before anyone opens the invoice. A European retailer's account goes from a few hundred dollars a month to $522,000 in under two days.

None of these attackers stole data or deployed ransomware. They took cloud credentials and used them to call the most expensive large language models on Amazon Bedrock, then left the victim with the bill. This is LLMjacking. In 2026 it has become one of the most common, and most expensive, security incidents that reach DoiT's support team.

This post covers how the attack works and what we've seen in this year's incidents. It then walks through the AWS controls that prevent it. Finally, it shows how to set up DoiT Cloud Intelligence™ (DCI) so you find out from an alert instead of your invoice.

What LLMjacking is

The Sysdig Threat Research Team coined the term in May 2024. They watched attackers exploit a vulnerable Laravel application, extract AWS credentials, and probe Amazon Bedrock along with nine other hosted-AI services (Sysdig, 2024). In operational terms it's cryptojacking with a different commodity: the attacker resells someone else's paid LLM capacity instead of mining coins.

The market has matured since then. Sysdig has since documented reverse-proxy services that pool stolen accounts and sell "unlimited" model access (Sysdig, 2026). It has also seen attackers use stolen model capacity to power automated offensive tooling (Sysdig, June 2026). Google's threat intelligence teams report the same pattern on Google Cloud (Google Cloud Threat Horizons).

What we've seen in 2026

Across the AWS LLMjacking cases DoiT has helped customers work through this year:

  • Reported unauthorized charges added up to roughly $1.4 million. The median incident was about $72,000, and the largest was $522,000.
  • Bursts of $80,000 to $113,000 a day were common. Attackers fan out across every enabled region and pick the priciest models. Claude Opus variants accounted for most of the spend in nearly every case.
  • Most incidents started with a long-lived IAM user access key. These were typically years old, over-privileged, and shared between CI pipelines, config files, or agent credential files. Two cases began with a root account takeover. In one, the root email sat on an expired domain that the attacker re-registered, reset the password, and enrolled their own MFA.
  • Only two of the incidents were first caught by the customer's own monitoring or a DoiT alert. Everyone else found out another way: the bill, an AWS security notice, or an account restriction. Some got an unexpected AWS Marketplace "thanks for subscribing" email.

Anatomy of an attack

The details differ from case to case, but most attacks follow the same steps.

1. Get a credential. Leaked IAM access keys dominate. In several cases the evidence pointed to automated secret scanners. The same key was used by multiple tools from several countries, including validation calls from TruffleHog. Other entry points were an internal app accidentally exposed to the internet, a role trust policy that allowed external accounts, and root credentials.

2. Recon quietly, sometimes for weeks. Attackers call GetCallerIdentity, enumerate IAM and service quotas, and list available foundation models in each region. In one case the reconnaissance began 17 days before the spending burst. Some attackers check GetModelInvocationLoggingConfiguration to find out whether you log prompts (AWS API reference). One opened the AWS console, checked who received the account's AWS Budgets notifications, and edited a budget before starting work.

3. Get a console session and persistence. sts:GetFederationToken turns an access key into a console session without MFA. Attackers create new access keys on existing users, add users to admin groups, or create backdoor IAM users.

4. Enable the models. AWS retired the explicit model-access step in October 2025, and serverless models are now available by default, subject to IAM (AWS). Third-party models such as Claude are billed through AWS Marketplace. In practice, any principal allowed to invoke a model can subscribe your account to it. We saw eight Marketplace agreements accepted within twelve seconds.

5. Monetize at full throttle. Requests go to every enabled region and through cross-region inference profiles to get around per-region quotas. AWS throttles most of them (2.3 million of 2.58 million calls in one case), and you pay for the rest. Heavy prompt-cache traffic is a common signature of a resale proxy serving many end users.

6. Run side businesses. Attackers used the same access to send tens of thousands of spam emails through Amazon SES. Others bought a future-dated GPU Capacity Block or launched SageMaker notebooks and EC2 fleets. In one case the SES spam started two days before the Bedrock bill, and nobody was watching send volume.

Why the bill is usually the first alarm

LLMjacking is hard to catch with standard cost monitoring for three structural reasons:

  1. The spend doesn't look like "Amazon Bedrock." AWS Marketplace bills each third-party model on Bedrock as a separate product, such as "Claude Opus 5 (Amazon Bedrock Edition)." A budget or dashboard filtered on the Amazon Bedrock service can show nothing at all.
  2. Every new model is a brand-new service with no history. Machine-learning anomaly detection learns what normal looks like from your spending history. That's true of AWS Cost Anomaly Detection and of DCI. DCI's billing-based anomaly detection needs a 14-day baseline before it classifies anything as anomalous (DoiT Help Center). A model your account has never used has no baseline, and attackers spread spend across many models.
  3. Billing data lags. AWS cost data takes 24 to 72 hours to reach any downstream tool, DCI included (DoiT Help Center). At $100,000 a day, that delay is expensive.

Anomaly detection still matters. It flagged the attack in some cases, and it catches the EC2 and GPU abuse that often comes alongside. But it can't be your only fraud alarm. You need prevention controls in AWS and threshold-based tripwires that don't need a baseline.

Cloud bill shouldn't be a mystery

One platform for AI and Cloud optimization.

Part 1: AWS controls that prevent LLMjacking

Remove the credentials worth stealing

  • Stop issuing long-lived IAM user keys. Use IAM Identity Center for people. Give workloads IAM roles with temporary credentials: OIDC for GitHub Actions, IRSA or EKS Pod Identity, and instance profiles. AWS's IAM best practices are explicit about this.
  • Audit the keys you already have. Delete keys unused for 90 days; don't stop at deactivating them. AWS will ask for deletion after an incident anyway. Never put shared keys in CI variables, Helm values, or agent/MCP credential files.
  • Treat Bedrock API keys as secrets. Prefer short-term keys, which last up to 12 hours, and inventory and scope any long-term ones (AWS).
  • Turn on secret scanning and push protection in your source control (GitHub). If AWS attaches the AWSCompromisedKeyQuarantineV3 policy to one of your users, start incident response. The policy limits what the key can do, but it doesn't remove the attacker (AWS).

Protect root

Use hardware MFA, no root access keys, and a root email address on a domain you control and actively monitor. Set the SECURITY and OPERATIONS alternate contacts on every account, including the dormant ones, so AWS's warnings reach someone who reads them.

Put guardrails at the Organization level

IAM least privilege should limit each workload to the specific models and regions it needs (AWS policy examples). Service control policies then add a backstop that a compromised principal can't remove. Here's a starting point, to be tested in a non-production OU first:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyMarketplaceSubscribeExceptPlatformRole",
"Effect": "Deny",
"Action": "aws-marketplace:Subscribe",
"Resource": "*",
"Condition": {
"ArnNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:role/ai-platform-admin" }
}
},
{
"Sid": "DenyBedrockOutsideApprovedRegions",
"Effect": "Deny",
"Action": "bedrock:*",
"Resource": "*",
"Condition": {
"StringNotEquals": { "aws:RequestedRegion": ["us-east-1", "us-west-2"] }
}
},
{
"Sid": "DenyFederationTokenConsoleBypass",
"Effect": "Deny",
"Action": "sts:GetFederationToken",
"Resource": "*"
}
]
}

A few cautions. Cross-region inference profiles route requests to other regions, so validate the region condition against the profiles you actually use (AWS). Some accounts should never use generative AI: sandboxes, dormant accounts, and most production accounts outside your AI platform. For those, a plain deny on bedrock:* is simpler and safer.

Limit how fast money can leave

  • Lower Bedrock tokens-per-minute quotas to what each workload needs, and require approval for increases (AWS). A quota caps the rate, not the total, but it buys you time.
  • Keep experimentation in bounded accounts with their own budgets.

Log and detect

  • A multi-region organization CloudTrail trail delivered to a locked-down log archive account.
  • Bedrock model invocation logging for approved workloads (AWS).
  • Amazon GuardDuty in every account and every region, with AI-related protections enabled. After an incident, AWS checked for security services in the affected member account, not just the management account.
  • Alerts on the signals that showed up early in real incidents:
    • new Marketplace agreements
    • GetFederationToken calls
    • CreateAccessKey called by an assumed role
    • root sign-ins or MFA changes
    • sudden jumps in SES send volume

Part 2: Setting up DoiT Cloud Intelligence as your tripwire

DCI won't replace GuardDuty or CloudTrail. Its value here is that it's a cost control plane outside your AWS accounts. An attacker holding your AWS keys can read and edit AWS Budgets, and we've seen one do exactly that. They can't touch the alerts and budgets you've configured in DCI.

How DCI alerts, budgets, anomaly detection, Attribute, Composer, Security Insights and CloudFlow work together against LLMjacking

Alerts, budgets and anomaly detection watch the spend. Composer and Security Insights close the gaps attackers use to get in. CloudFlow turns any of them into a notification, a ticket, or an approved containment step.

1. Threshold alerts that don't need a baseline

Alerts fire on a fixed rule, so they work on day one, on a model you've never used. This is the most dependable DCI control for LLMjacking.

  • Create an allocation that groups all AI model spend: Amazon Bedrock and the "(Amazon Bedrock Edition)" Marketplace products. New models then roll into it automatically, and your alerts don't silently miss next month's model launch.
  • Daily spend alert per account: scope it to that allocation, with Metric set to Cost and Interval to Daily. Set the condition to is > $X, where X is two to three times a normal day. Turn on Evaluate for each: Account so one rule covers every account.
  • "Should be zero" alert: for sandboxes, dormant accounts, and anything not running AI workloads, alert at > $10 a day.
  • Day-over-day jump: percentage change is > 100%.
  • Forecast alert: monthly, is forecasted to be > your planned AI spend.

Route alerts to email and a Slack channel that someone actually watches (Slack alert delivery).

2. Budgets on every account, especially the quiet ones

Put a recurring monthly budget on each AWS account, with thresholds at 50%, 85%, and 100%. Budget suggestions can size them for you. Add a daily budget on the AI allocation as a second tripwire that's easy to read. Dormant and sandbox accounts are attackers' favourite targets precisely because nobody budgets them. A $0 account with a $50 budget is a very good alarm.

Budgets won't stop the spend, but they'll tell you about it from outside the compromised account.

3. Tune anomaly detection so it actually reaches you

Cost anomaly detection still earns its place, especially for the EC2, GPU, and SageMaker side of an attack. Three settings matter:

  • Widen the severity filter. Email notifications default to Critical only. Set them to "Warning and above" or "All severity levels" (notification settings).
  • Turn on renotification, so an active anomaly that keeps growing pings you again.
  • Make sure a recipient is configured. In more than one incident, DCI detected the anomaly but nobody heard about it. No notification target was set.

On the Enhanced and Enterprise plans, enable real-time anomaly detection for AWS. It works from CloudTrail and reports within about an hour. Today it covers EC2 and RDS rather than Bedrock. That still catches the GPU and instance half of the attack, which often runs alongside the model abuse. You can also enable anomaly detection on the AI allocation itself (allocation monitoring).

If you instrument AI workloads with Attribute, DoiT also offers token-level usage anomalies in early access. They can flag a runaway workload faster than billing data. They only see traffic from your own instrumented hosts, so they won't catch a stolen key used from an attacker's machine.

4. Automate the first response with CloudFlow

CloudFlow can trigger on DCI alerts, budget thresholds, and cost anomalies, which turns a notification into an action:

  • Alert → Slack → approval → containment. When the Bedrock alert fires, post the account and amount to your incident channel. Then, after a human approves, run an AWS action: deactivate the suspected access key, or attach an explicit deny on bedrock:InvokeModel* and bedrock:Converse*. Approval gates keep a false positive from taking production down.
  • First-time service detection. A scheduled flow template flags the first spend on any AWS service or SKU. That covers the new-model gap described earlier.
  • Revoke AI provider API keys. A webhook-driven template, with approval built in, deletes long-term Bedrock credentials (and OpenAI, Anthropic, or Gemini keys). You can call it from EventBridge, your SIEM, or a GuardDuty finding (tutorial).

Any containment action needs the CloudFlow role in the target account to hold the matching IAM permissions. Decide on those permissions before an incident.

5. Close the gaps before an attacker finds them

Security Insights brings in AWS Security Hub and Trusted Advisor findings. They include access keys that haven't been rotated, root accounts without MFA, and accounts without GuardDuty or CloudTrail. Almost every incident described above started with one of these issues.

Those findings use AWS's generic rules. Composer lets you write your own, on the Enhanced and Enterprise plans. It's DCI's policy engine. It scans the resources in each connected account and checks them against recipes, which are rules you build without code. You can duplicate a DoiT recipe and edit it, or describe the check to the AI assistant. Matches show up as Security insights.

Here's how the gaps behind this year's incidents map to recipes you can build today:

Gap we saw in incidents Recipe to build Data Composer reads
Years-old keys nobody remembered Access keys not used in 90 days, or never used Access key last-used date
Admin users with long-lived keys Users with admin policies and at least one active key User policies and access keys
Root account takeover Root without MFA, or with an access key IAM credential report
AWS warnings sent to nobody Accounts with no security alternate contact Account contacts
Gaps in the audit trail Trails that aren't multi-region, organization-wide, or logging CloudTrail trail status
Keys calling Bedrock from the wrong place Keys last used for Bedrock in accounts outside your AI allowlist Access key last-used service and region

The last row is the closest Composer gets to spotting abuse. A key in a sandbox account that was last used for Bedrock deserves a look, even if spend hasn't moved yet.

To act on the findings, schedule a CloudFlow that reads open Security findings through the Composer Insights node. Post them to Slack or open a ticket each morning. For stale keys, add an approval step that deactivates the key once the owner confirms it's unused.

Composer runs periodic scans, so it's a hygiene control rather than an attack alarm. It doesn't check GuardDuty or Security Hub status, Bedrock invocation logging, Bedrock API keys, or SCP contents. Security Insights and AWS Config cover those. Use Composer to close the doors attackers walked through this year, and keep the threshold alerts above for the spend itself.

If it happens anyway

Start containment as soon as you suspect a compromise. Don't wait for an anomaly alert or final billing figures.

  1. Contain first. Deactivate, and then delete, the compromised access keys. Revoke active role sessions with a deny policy conditioned on aws:TokenIssueTime, and disable any suspected Bedrock API keys. If you need a blunt instrument, an emergency SCP that denies bedrock:* on the affected account stops the bleeding (it also stops legitimate Bedrock use). Expect a few minutes of calls to keep landing after a key is disabled.
  2. Hunt for persistence. Look for new IAM users, access keys, roles and trust-policy changes, Marketplace agreements, SES identities, Capacity Blocks, and instances in every region. Rotate every key that could have been exposed, not only the one AWS flagged. We've seen a second wave arrive six days into an open incident through a key nobody rotated.
  3. Preserve evidence. Export CloudTrail (Event History only holds 90 days), invocation logs, a resource inventory, and a cost export by service.
  4. Answer AWS before the deadline. AWS security notices typically give five days before services are suspended. Restrictions can land days after the incident and can affect production services such as Lambda, ECS, and EC2.
  5. Ask for the billing adjustment explicitly. In the cases we've seen, AWS expects at least two cost-monitoring controls, such as AWS Budgets and Cost Anomaly Detection. It also expects root MFA, GuardDuty, or Security Hub. They check these in the affected account. Attacker-created Marketplace agreements need to be cancelled. Outcomes have ranged from full credits to partial credits to denials. The process has taken two to twelve weeks. A clear timeline, fast containment, and complete evidence make the difference. AWS has also said it may not review future bills if the controls aren't in place.

If DoiT resells your AWS account, open a DoiT support ticket as soon as you suspect compromise. Our team coordinates with AWS on the security case and the billing-adjustment request, and helps you assemble the evidence AWS asks for.

Your LLMjacking checklist

In AWS

  • No long-lived IAM user keys for humans or workloads. Old keys audited and deleted.
  • Root: hardware MFA, no access keys, and a monitored email address on a domain you own.
  • SECURITY and OPERATIONS alternate contacts set on every account.
  • SCPs that deny Bedrock where it isn't needed, restrict Marketplace subscriptions, and block GetFederationToken.
  • Bedrock tokens-per-minute quotas sized to need.
  • Organization CloudTrail, Bedrock invocation logging, and GuardDuty in every account and region.

In DoiT Cloud Intelligence

  • An allocation covering Bedrock plus "(Amazon Bedrock Edition)" Marketplace spend.
  • Daily threshold alerts per account on that allocation, including "should be zero" accounts.
  • A budget on every AWS account, dormant ones included.
  • Anomaly notifications set to Warning or above, with renotification and a real recipient.
  • Real-time anomaly detection on AWS (Enhanced and Enterprise plans).
  • Composer recipes for stale and admin keys, root posture, security contacts, trail coverage, and Bedrock key use outside your AI accounts.
  • CloudFlow: alert-to-approval containment and first-time service detection.

Attackers make money from LLMjacking, so they'll keep looking for accounts nobody watches. Perfect detection isn't realistic. You can still make your account an expensive, noisy, short-lived target. And if something gets through, you can hear about it within hours rather than from the invoice.

Want help reviewing your AWS guardrails or setting up DCI alerts, budgets, and CloudFlow for AI workloads? Talk to DoiT.