Back to All Articles
Cybersecurity

LLMJacking Explained: Inside the $100K/Day Cloud AI Heist Targeting AWS Bedrock & Azure OpenAI

Threat actors have abandoned cryptomining to weaponize hijacked enterprise cloud accounts for LLMJacking: routing high-velocity inference through stolen AWS Bedrock and Azure OpenAI credentials to resell raw tokens. With standard cloud billing alarms lagging by 24 to 48 hours, victims wake up to catastrophic six-figure invoices. Here is an evidence-based forensic breakdown of LLMJacking attack chains, CloudTrail blind spots, and production zero-trust defense architectures.

Pathubs Engineering
Pathubs Engineering
Database & Systems Architecture
Published Nov 5, 2026Updated Nov 5, 202610 min read
Cinematic Cloud Security Operations Center terminal displaying an active LLMJacking attack against AWS Bedrock, highlighting anomalous token surges, CloudTrail telemetry, and automated Lambda circuit breaker containment.

<div className="callout callout-warning"> <div className="callout-title"> <span>⚠️ Critical Threat Advisory (FinOps & Cloud Infrastructure)</span> </div> <p> Over the past quarter, enterprise security response teams have recorded a massive operational pivot across financially motivated threat actors: Cryptojacking has been eclipsed by LLMJacking. By abusing exposed cloud credentials with unrestricted foundation model API permissions, attackers routinely generate \$75,000 to over \$100,000 per day in fraudulent inference billing. This guide provides an end-to-end technical postmortem of the attack mechanics, explains the 48-hour monitoring blind spot, and delivers production-hardened IAM policies, Service Control Policies (SCPs), and real-time EventBridge circuit breakers. </p> </div>

---

1. Executive Summary & Key Takeaways

LLMJacking is the unauthorized exploitation of enterprise foundation model APIs (primarily Amazon Bedrock, Azure OpenAI Service, and Google Cloud Vertex AI) by threat actors who have gained possession of compromised cloud identity tokens.

Unlike traditional breaches that seek data exfiltration or extortion through ransomware, an LLMJacking campaign treats the victim’s cloud infrastructure as a free, high-throughput AI inference utility. Stolen credentials are piped into automated "shadow reverse-proxy" networks where high-tier frontier models—such as Anthropic Claude 3.5 Sonnet, Claude 3 Opus, and OpenAI GPT-4o—are queried at scale to fuel malicious offensive automation or resold on darknet markets as "unlimited, jailbroken API keys."

text
┌────────────────────────────────────────────────────────────────────────┐
│                        KEY TAKEAWAYS FOR DEFENDERS                     │
├────────────────────────────────────────────────────────────────────────┤
│ 1. Asymmetric Financial Velocity:                                     │
│    Cryptojacking burns CPU/GPU yielding ~$10/day/core.                 │
│    LLMJacking invokes frontier APIs costing $3-$15/M tokens, racking   │
│    up $5,000 to $10,000/hour in irreversible model execution.         │
│                                                                        │
│ 2. The 48-Hour Billing Alert Trap:                                     │
│    AWS Budgets and CloudWatch 'EstimatedCharges' update with a 24-48hr │
│    lag. Standard billing alarms fire long after catastrophic loss.     │
│                                                                        │
│ 3. The CloudTrail Visibility Gap:                                      │
│    Standard CloudTrail logs API calls ('InvokeModel') but NOT prompt    │
│    or response text. Without locked Model Invocation Logging, your SOC │
│    is completely blind to what the attacker is generating.             │
│                                                                        │
│ 4. Defense Evasion via API:                                            │
│    Attackers routinely invoke 'DeleteModelInvocationLoggingConfig'    │
│    to sever logging destinations before launching high-volume bursts. │
│                                                                        │
│ 5. The Zero-Trust Remedy:                                              │
│    Enforce Service Control Policies (SCPs) locking logging, restrict   │
│    invocations strictly to VPC Endpoints ('aws:sourceVpce'), and       │
│    deploy real-time EventBridge Lambda circuit breakers.               │
└────────────────────────────────────────────────────────────────────────┘

---

2. The Anatomy of an LLMJacking Campaign

How does an attacker go from finding a forgotten developer key to draining \$100,000 from an enterprise cloud budget? Forensic analysis conducted by the Sysdig Threat Research Team (TRT) and independent cloud incident response teams reveals a disciplined, 4-stage operational kill chain:

text
[ Stage 1: Credential Harvesting ]
       │  Exposed .env in GitHub, CI/CD pipeline leak, or web app RCE (e.g., Laravel CVE)
       ▼
[ Stage 2: Reconnaissance & Model Activation ]
       │  Calls 'bedrock:ListFoundationModels'
       │  Enables Anthropic Claude 3.5 Sonnet / Opus if inactive
       ▼
[ Stage 3: Defense Evasion & Log Blinding ]
       │  Calls 'bedrock:DeleteModelInvocationLoggingConfiguration'
       │  Disconnects CloudWatch Logs and S3 bucket destinations
       ▼
[ Stage 4: High-Velocity Inference Monetization ]
       │  Connects keys to 'OAI Reverse Proxy' relays (1,000s req/sec)
       │  Bypasses geographic AI sanctions, fuels brute-force cracking, or resells tokens
       ▼
[ Outcome: $75,000 - $100,000 Daily Cloud Invoice ]

Stage 1: Initial Access & Credential Harvesting

The entry point rarely requires novel zero-day exploits against cloud control planes. Rather, threat actors harvest valid IAM user credentials (AKIA...), temporary STS credentials, or Azure Service Principal secrets through:

  • Public Code Repositories: Accidental commits of .env files, staging deployment scripts, or hardcoded credentials in public GitHub/GitLab repositories.
  • Compromised Web Applications: Remote Code Execution (RCE) flaws in internet-facing web frameworks (e.g., unpatched PHP, Laravel, Spring Boot) that allow adversaries to dump instance environment variables or query the AWS EC2 Instance Metadata Service (IMDSv1).
  • Developer Workstations: Infostealer malware (such as RedLine or Lumma) scraping ~/.aws/credentials from local engineering laptops.

Stage 2: Reconnaissance & Silent Model Activation

Once authenticated, the attacker's automation immediately conducts cloud-native discovery:

bash
# Attacker enumerates available foundation models
aws bedrock list-foundation-models --by-provider anthropic --region us-east-1

# If the account does not have model access granted, attackers call management APIs
aws bedrock put-foundation-model-entitlement --model-id anthropic.claude-3-5-sonnet-20241022-v2:0

Because Amazon Bedrock requires explicit model enablement in the console, attackers leverage overly permissive IAM roles (e.g., AdministratorAccess or wildcard bedrock:*) to enable the most expensive flagship models on the fly.

Stage 3: Defense Evasion via Log Blinding

A hallmark of sophisticated LLMJacking actors is intentional tampering with cloud audit pipelines. To prevent security engineers from inspecting prompt payloads, the attacker issues:

bash
# Disables delivery of prompt/completion payloads to CloudWatch and S3
aws bedrock delete-model-invocation-logging-configuration --region us-east-1

While basic CloudTrail management events still record that an API call took place, the actual text of the prompts (which might reveal illicit cyber reconnaissance or darknet chatbot operations) is discarded, severely crippling post-incident forensics.

Stage 4: High-Throughput Token Monetization

With logging suppressed, the attacker connects the stolen AWS credentials to automated proxy tools (such as open-source OpenAI-compatible reverse proxy engines like *ChatGPT-to-API* or *OAI-Proxy*). These proxies transform standard /v1/chat/completions requests into signed AWS SigV4 Bedrock InvokeModelWithResponseStream requests.

The hijacked account is now monetized through three primary vectors:

  1. Reselling as "Bulletproof AI": The attacker sells API keys on darknet forums claiming to offer "unlimited, unmetered Claude 3.5 access" at a 70% discount compared to retail prices.
  2. Bypassing Regional AI Sanctions: Threat actors located in embargoed jurisdictions use the enterprise's US-based AWS infrastructure to bypass regional geofences.
  3. Powering Automated Offensive AI Tooling: Attackers use the victim's compute to run brute-force vulnerability scanning, autonomous vulnerability analysis agents, or spear-phishing generators without paying a penny for tokens.

---

3. Cryptojacking vs. LLMJacking: The Shift in Asymmetric Impact

For nearly a decade, cloud resource jacking meant cryptomining (e.g., Monero via XMRig). Why have attackers overwhelmingly shifted to LLMJacking? The answer lies in the economic yield per unit of compromised compute:

Evaluation MetricTraditional Cryptojacking (EC2 / EKS)LLMJacking (Bedrock / Azure OpenAI)
Target ResourceCPU / GPU cycles on provisioned virtual machinesManaged Serverless Foundation Model APIs
Attacker YieldMonero coins (~$1.50 to $8.00 per instance per day)High-demand model access (resold for $500–$2,000/day)
Victim Financial VelocityLinear ($50 to $200/day for c5.24xlarge instances)Exponential ($3,000 to $10,000/hour)
Detection FootprintObvious: 100% CPU utilization alerts, GuardDuty minersSubtle: Looks like standard HTTPS REST API calls
Infrastructure OverheadAttacker must compile binaries, evade host-level EDRAttacker only sends standard JSON HTTP POST payloads
Infrastructure ScalabilityLimited by instance type, VPC limits, vCPU quotasAuto-scaling: Bedrock handles thousands of tokens/sec

When an attacker spins up 50 EC2 instances for cryptomining, AWS GuardDuty triggers an immediate high-severity alert (CryptoCurrency:EC2/BitcoinTool.B!DNS), and AWS billing scales linearly based on hourly VM rates.

In contrast, when an attacker invokes Bedrock's anthropic.claude-3-5-sonnet with a multi-threaded Python cluster, Bedrock's serverless backend automatically scales up to handle hundreds of thousands of tokens per minute. At \$3.00 per million input tokens and \$15.00 per million output tokens, a high-concurrency script generating deep reasoning chains racks up thousands of dollars every single hour without triggering a single OS-level CPU alarm.

---

4. The Architectural Blind Spot: Why Standard Alarms Fail

The primary reason LLMJacking causes catastrophic financial losses is the latency disconnect between serverless API consumption and cloud billing telemetry.

text
Standard Cloud Monitoring (The Failure Window):
Hour 0         Hour 6                   Hour 24              Hour 48
  │               │                        │                    │
  ▼               ▼                        ▼                    ▼
[Key Stolen] ──► [Inference Spike] ──► [Loss: $50,000] ──► [AWS Billing Alarm Fires]
  (Attacker       (1,000 req/sec         (CloudWatch           ("Your budget exceeded
   begins)         unrestricted)          still calculating)    $5,000 threshold!")
                                                                     ▲
                                                               [TOO LATE]

Production Zero-Trust Architecture (Real-Time Interception):
Hour 0         Minute 1                 Minute 3
  │               │                        │
  ▼               ▼                        ▼
[Key Stolen] ──► [Inference Spike] ──► [EventBridge Alarm] ──► [Lambda Circuit Breaker]
  (Attacker       (>50 req/min from       (Pattern matched       (Revokes IAM Key,
   begins)         non-VPC IP)             in real time)          restores logging, alerts SOC)

The 24-to-48-Hour Billing Alert Delay

Most organizations rely on AWS Budgets or CloudWatch alarms evaluating the metric AWS/Billing -> EstimatedCharges. However:

  • AWS Billing metrics are updated only every 4 to 6 hours under optimal conditions.
  • Actual aggregated usage data from foundational model providers can take 24 to 48 hours to fully reconcile and post to Cost Explorer.
  • The Result: By the time an engineer receives an automated PagerDuty alert indicating that monthly spending has exceeded the \$5,000 threshold, the attacker has already spent \$60,000 to \$120,000 over the preceding 36 hours.

The CloudTrail Payload Invisibility Problem

Cloud architects frequently assume that having AWS CloudTrail enabled protects them. But examine this standard CloudTrail event snippet recorded during an LLMJacking attack:

json
{
  "eventVersion": "1.08",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAXXXXXXXXXXXXXXXXX",
    "arn": "arn:aws:iam::123456789012:user/ci-deployer",
    "accountId": "123456789012",
    "accessKeyId": "AKIAXXXXXXXXXXXXXXXX"
  },
  "eventTime": "2026-11-05T01:14:22Z",
  "eventSource": "bedrock.amazonaws.com",
  "eventName": "InvokeModel",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "185.220.101.5",
  "userAgent": "python-requests/2.31.0",
  "requestParameters": {
    "modelId": "anthropic.claude-3-5-sonnet-20241022-v2:0"
  },
  "responseElements": null,
  "requestID": "4f5b2c11-9a8e-4a0b-8d12-abcdef123456",
  "eventID": "8e3c1234-5678-9abc-def0-123456789abc",
  "readOnly": false,
  "eventType": "AwsApiCall",
  "managementEvent": false,
  "recipientAccountId": "123456789012"
}

Notice what is missing:

  1. No Input Prompts: You cannot see what questions the attacker asked.
  2. No Output Completions: You cannot see what data was generated or if proprietary code was leaked.
  3. No Token Counts: The CloudTrail management event does not record the prompt token count or completion token count!

Without enabling and locking down Amazon Bedrock Model Invocation Logging, you are forced to conduct incident response in total darkness.

---

5. The Zero-Trust Defense Blueprint

Preventing LLMJacking requires transitioning from reactive billing monitoring to proactive, architectural control planes. Here is the 3-tier zero-trust blueprint deployed by production enterprise security teams.

Tier 1: Organization-Wide Service Control Policy (SCP)

Attach this Service Control Policy at your AWS Organizations root or organizational unit (OU) to enforce non-negotiable boundaries:

  1. Prevent anyone (even full account administrators) from disabling Bedrock Model Invocation Logging.
  2. Block model invocation in unauthorized geographic AWS regions.
  3. Deny the creation of foundation model subscriptions through AWS Marketplace.
json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceBedrockLoggingIntegrity",
      "Effect": "Deny",
      "Action": [
        "bedrock:DeleteModelInvocationLoggingConfiguration",
        "bedrock:PutModelInvocationLoggingConfiguration"
      ],
      "Resource": "*",
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws-service-role/organizations.amazonaws.com/*",
            "arn:aws:iam::*:role/SecurityAdminBreakGlassRole"
          ]
        }
      }
    },
    {
      "Sid": "RestrictBedrockToApprovedRegions",
      "Effect": "Deny",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream",
        "bedrock:Converse"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-1",
            "us-west-2"
          ]
        }
      }
    }
  ]
}

Tier 2: Network-Enforced Least-Privilege IAM Policy

Never grant bedrock:* to developers, automated pipelines, or backend applications. Furthermore, bind invocation privileges strictly to your private Virtual Private Cloud (VPC) endpoint. If an IAM key is stolen, the attacker cannot invoke Bedrock over the public internet because AWS will verify that the request did not originate from your internal VPC endpoint (vpce-xxxxxxxx):

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowBedrockInvocationViaVpcOnly",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet*",
        "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1"
      ],
      "Condition": {
        "StringEquals": {
          "aws:sourceVpce": "vpce-0123456789abcdef0"
        }
      }
    },
    {
      "Sid": "DenyModelManagementActions",
      "Effect": "Deny",
      "Action": [
        "bedrock:Create*",
        "bedrock:Delete*",
        "bedrock:Put*",
        "bedrock:Update*"
      ],
      "Resource": "*"
    }
  ]
}

<div className="callout callout-tip"> <div className="callout-title"> <span>💡 Architectural Best Practice</span> </div> <p> By adding the <code>"aws:sourceVpce"</code> condition key, even if an attacker extracts raw <code>AWS_ACCESS_KEY_ID</code> and <code>AWS_SECRET_ACCESS_KEY</code> values from your GitHub repo, any attempt to run <code>boto3.client('bedrock-runtime').invoke_model()</code> from their laptop or cloud server will fail immediately with <code>AccessDeniedException</code>. </p> </div>

Tier 3: Real-Time EventBridge & Lambda Circuit Breaker

To catch anomalous token bursts within seconds rather than days, configure an Amazon EventBridge rule that listens for Bedrock invocation spikes and triggers an automated containment Lambda function.

The EventBridge Rule Pattern (`bedrock-anomaly-rule.json`):

json
{
  "source": ["aws.bedrock"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["bedrock.amazonaws.com"],
    "eventName": ["InvokeModel", "InvokeModelWithResponseStream"],
    "sourceIPAddress": [{ "anything-but": ["10.0.0.0/16", "172.16.0.0/12"] }]
  }
}

The Automated Containment Lambda (`circuit_breaker.py`):

python
import json
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

iam_client = boto3.client('iam')
sns_client = boto3.client('sns')

SECURITY_ALERT_SNS_ARN = "arn:aws:sns:us-east-1:123456789012:security-incident-alerts"

def lambda_handler(event, context):
    """
    Automated Circuit Breaker: Revokes IAM key on anomalous Bedrock invocation.
    Fires within 15 seconds of unauthorized API call.
    """
    detail = event.get('detail', {})
    event_name = detail.get('eventName')
    source_ip = detail.get('sourceIPAddress')
    user_identity = detail.get('userIdentity', {})
    
    user_type = user_identity.get('type')
    user_name = user_identity.get('userName')
    access_key_id = user_identity.get('accessKeyId')
    
    logger.warning(f"🚨 ANOMALOUS BEDROCK INVOCATION DETECTED! User: {user_name}, IP: {source_ip}, Action: {event_name}")
    
    # Containment: Immediately deactivate the compromised access key
    if user_type == "IAMUser" and access_key_id and user_name:
        try:
            iam_client.update_access_key(
                UserName=user_name,
                AccessKeyId=access_key_id,
                Status='Inactive'
            )
            logger.info(f"Successfully revoked compromised AccessKeyId: {access_key_id}")
            
            # Send immediate alert to PagerDuty / Slack via SNS
            alert_payload = {
                "Title": "🚨 [URGENT] LLMJacking Circuit Breaker Triggered",
                "Details": f"AccessKey {access_key_id} belonging to user '{user_name}' was automatically deactivated.",
                "Reason": f"Unauthorized Bedrock {event_name} call from IP {source_ip}.",
                "Timestamp": detail.get('eventTime')
            }
            sns_client.publish(
                TopicArn=SECURITY_ALERT_SNS_ARN,
                Message=json.dumps(alert_payload, indent=2),
                Subject="CRITICAL: Compromised IAM Key Revoked (LLMJacking Defense)"
            )
        except Exception as e:
            logger.error(f"Failed to deactivate access key {access_key_id}: {str(e)}")
            raise e
            
    return {"statusCode": 200, "body": "Containment executed successfully"}

---

6. Real-World Attack Forensic Breakdown

Let's dissect real forensic evidence from an investigated enterprise breach where a staging developer key was leaked in an open GitHub gist.

text
00:14:02 UTC - First Probe
  Attacker IP: 185.220.101.5 (Tor Exit Node)
  Action: 'bedrock:ListFoundationModels'
  Result: HTTP 200 (Success, 14 models listed)

00:14:28 UTC - Log Blind Attempt
  Action: 'bedrock:DeleteModelInvocationLoggingConfiguration'
  Result: HTTP 200 (Bedrock prompt logging successfully deleted!)

00:15:10 UTC - Model Activation
  Action: 'bedrock:PutFoundationModelEntitlement' (Claude 3.5 Sonnet)
  Result: HTTP 200 (Flagship model unlocked)

00:16:00 to 06:00:00 UTC - The Heist
  Inference Burst: 1,840 requests per minute
  Concurrency: 64 distributed threads across 12 countries
  Total Prompts Executed: 662,400 calls
  Average Context Length: 4,200 input tokens + 1,100 output tokens
  Total Tokens: 3.5 Billion tokens processed
  Financial Velocity: $4,850/hour
  Cumulative 6-Hour Damage: $29,100

08:30:00 UTC - Traditional CloudWatch Alert Fires
  Message: "AWS Budgets: Staging Account has exceeded monthly budget of $1,000."
  Status: Attacker has already exfiltrated 3.5B tokens of compute.

When the victim's engineering team examined their AWS console, the EC2 dashboard showed zero instances running. CloudWatch CPU metrics were flat at 0%. Yet the billing dashboard showed an active balance of \$29,100 under Amazon Bedrock Runtime.

This represents the defining operational characteristic of LLMJacking: zero server footprints, zero malware payloads, pure API-level financial exploitation.

---

7. Production Incident Checklist: Active LLMJacking Containment

If your organization notices unexpected Bedrock or Azure OpenAI billing anomalies, execute this 5-step containment checklist immediately:

Step 1: Emergency Access Key Revocation

Do not spend time debugging permissions. Invalidate all active access keys for the suspected IAM identity:

bash
# List all active access keys for the compromised user
aws iam list-access-keys --user-name <COMPROMISED_USERNAME>

# Immediately deactivate each key
aws iam update-access-key --user-name <COMPROMISED_USERNAME> --access-key-id <ACCESS_KEY_ID> --status Inactive

Step 2: Invalidate Active STS Sessions

If temporary session credentials were generated via sts:AssumeRole, revoke all existing sessions by attaching an inline policy with an aws:TokenIssueTime condition:

bash
aws iam put-role-policy --role-name <COMPROMISED_ROLE_NAME> --policy-name RevokeOlderSessions --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "DateLessThan": {
          "aws:TokenIssueTime": "2026-11-05T04:00:00Z"
        }
      }
    }
  ]
}'

Step 3: Re-Enable & Lock Bedrock Model Invocation Logging

Check whether the logging configuration was severed, and restore it pointing to an encrypted S3 bucket:

bash
# Check current logging status
aws bedrock get-model-invocation-logging-configuration --region us-east-1

# Restore logging to secure S3 and CloudWatch
aws bedrock put-model-invocation-logging-configuration --region us-east-1 --logging-config '{
  "cloudWatchConfig": {
    "logGroupName": "/aws/bedrock/model-invocations",
    "roleArn": "arn:aws:iam::123456789012:role/BedrockLoggingServiceRole"
  },
  "s3Config": {
    "bucketName": "enterprise-bedrock-audit-logs-encrypted",
    "keyPrefix": "invocations/"
  },
  "textDataDeliveryEnabled": true
}'

Step 4: Clamp Bedrock Quotas via Service Quotas API

To stop the bleeding while investigating, request an immediate temporary reduction of your account's TPS (Transactions Per Second) quota for Bedrock via the AWS Service Quotas console or API.

Step 5: Preserve CloudTrail Evidence for AWS Billing Concessions

AWS Support frequently evaluates billing concession requests based on whether the customer demonstrates diligence and provides tamper-proof CloudTrail forensics. Export all CloudTrail events containing eventSource = "bedrock.amazonaws.com" over the past 7 days and submit them alongside your unauthorized activity ticket.

---

8. Audit Your AWS Account in 60 Seconds

Run this diagnostic shell script locally with your read-only security auditor profile to evaluate your risk exposure to LLMJacking:

bash
#!/usr/bin/env bash
# LLMJacking Risk Assessment Audit Script

echo "========================================================"
echo "   AWS Bedrock LLMJacking Vulnerability Audit           "
echo "========================================================"

# 1. Audit Model Invocation Logging
echo -n "[*] Checking Bedrock Model Invocation Logging in us-east-1... "
LOG_CONFIG=$(aws bedrock get-model-invocation-logging-configuration --region us-east-1 2>&1)

if [[ $LOG_CONFIG == *"loggingConfig"* ]]; then
    echo "✅ CONFIGURED"
else
    echo "❌ CRITICAL: Bedrock Model Invocation Logging is DISABLED!"
fi

# 2. Check for Wildcard Bedrock Permissions in IAM Policies
echo "[*] Scanning for dangerous wildcard 'bedrock:*' policies..."
WILDCARDS=$(aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text)

for POLICY_ARN in $WILDCARDS; do
    VERSION=$(aws iam get-policy --policy-arn "$POLICY_ARN" --query 'Policy.DefaultVersionId' --output text)
    STATEMENT=$(aws iam get-policy-version --policy-arn "$POLICY_ARN" --version-id "$VERSION" --query 'PolicyVersion.Document.Statement' 2>&1)
    
    if [[ $STATEMENT == *"\"bedrock:*\""* ]] || [[ $STATEMENT == *"\"*\""* ]]; then
        echo "   ⚠️ WARNING: Potential wildcard found in policy: $POLICY_ARN"
    fi
done

# 3. Check for VPC Endpoints
echo -n "[*] Checking for private Bedrock VPC Endpoints... "
VPCE=$(aws ec2 describe-vpc-endpoints --filters "Name=service-name,Values=com.amazonaws.us-east-1.bedrock-runtime" --query 'VpcEndpoints[*].VpcEndpointId' --output text)

if [ -n "$VPCE" ]; then
    echo "✅ FOUND ($VPCE)"
else
    echo "⚠️ NO VPC ENDPOINT FOUND: Invocations rely on public endpoints!"
fi

echo "========================================================"
echo "Audit complete. Review highlighted findings."

---

9. Conclusion: The New Frontier of Cloud Infrastructure Defense

The emergence of LLMJacking marks the definitive end of the "wild west" era of enterprise AI adoption. In the early days of Generative AI, developers were given unrestricted API tokens and unmetered access to accelerate prototyping.

Today, that convenience has become a premier corporate attack surface. An exposed API key is no longer just a privacy leak—it is a direct financial pipeline draining tens of thousands of dollars from your operating budget every hour.

Securing the AI engineering lifecycle requires the exact same engineering discipline that transformed web infrastructure in the early 2010s:

  1. Never expose model endpoints over public routes without VPC constraints (`aws:sourceVpce`).
  2. Never allow foundation model logging to be modified by non-root identities (enforce via SCP).
  3. Never rely on 48-hour billing alarms as your primary incident response tripwire (build automated EventBridge Lambda circuit breakers).

By implementing structural, real-time zero-trust boundaries around foundation models, organizations can fully leverage the power of autonomous AI agents and frontier LLMs without fearing the catastrophic surprise of a six-figure morning invoice.

Frequently Asked Questions

What is LLMJacking?

LLMJacking is a specialized cloud resource-hijacking attack where adversaries leverage stolen cloud credentials (such as AWS IAM access keys or Azure Service Principals) to access enterprise foundation model services like Amazon Bedrock or Azure OpenAI. Instead of stealing data or deploying ransomware, attackers route high-volume automated LLM inference through the victim's account to power their own AI applications, bypass regional restrictions, or resell token streams on underground reverse proxy networks.

How does LLMJacking differ from traditional Cryptojacking?

While Cryptojacking consumes raw CPU and GPU compute cycles on EC2 or Kubernetes instances to mine cryptocurrency (yielding small, diminishing returns of $2 to $10 per instance per day), LLMJacking exploits enterprise foundation model APIs billed directly per token. Because high-end frontier models like Claude 3.5 Sonnet or GPT-4o cost $3 to $15 per million tokens, a distributed attacker relay invoking models in parallel can generate $50,000 to $100,000 in charges within 24 hours, yielding vastly higher financial damage and illicit utility.

Why do standard AWS billing alerts fail to stop LLMJacking?

AWS Budgets and CloudWatch metric 'EstimatedCharges' rely on billing data pipelines that have a built-in 24-to-48-hour calculation and ingestion latency. In an active LLMJacking assault, attackers execute tens of thousands of inference requests per hour. By the time a billing threshold email fires on day two, the victim account has already accumulated tens of thousands of dollars in irreversible token consumption.

Can standard AWS CloudTrail show the prompts and responses sent during an attack?

No. Standard AWS CloudTrail data events only record metadata: the IAM identity, timestamp, source IP, user-agent, target service (bedrock.amazonaws.com), and the action (InvokeModel). CloudTrail does not log the input text prompt or the model's output payload. To inspect payloads, organizations must explicitly configure Bedrock Model Invocation Logging to write to S3 or CloudWatch Logs.

What is the 'DeleteModelInvocationLoggingConfiguration' evasion technique?

When attackers compromise an IAM key with broad or wildcard bedrock permissions, one of their initial actions is to call 'bedrock:DeleteModelInvocationLoggingConfiguration'. This silently disables the export of prompt and response logs to S3 and CloudWatch, blinding the victim's security operations center (SOC) to the queries being executed while leaving basic CloudTrail API auditing unaware of the content.

How can organizations enforce zero-trust isolation on Amazon Bedrock?

Organizations should implement three layers of defense: First, attach an AWS Organizations Service Control Policy (SCP) denying 'bedrock:*' in unauthorized regions and explicitly forbidding 'bedrock:DeleteModelInvocationLoggingConfiguration'. Second, restrict IAM policies using the 'aws:sourceVpce' condition key so Bedrock can only be invoked through a private VPC Endpoint. Third, deploy an Amazon EventBridge rule that detects anomalous 'InvokeModel' rates and automatically deactivates compromised access keys via AWS Lambda.

Technical cybersecurity diagram illustrating software supply chain verification, build provenance, pipeline injection detection, and container isolation shields.
Cybersecurity14 min read

LiteLLM 1.107.0 Supply-Chain Attack: Affected Packages, Timeline, and Recovery Checklist

On 21 October 2026, the widely used open-source LLM proxy LiteLLM suffered a critical software supply-chain compromise affecting version 1.107.0 on PyPI, Docker Hub, and GHCR. Here is an evidence-based forensic guide covering affected artifacts, exact UTC and IST exposure windows, the Python startup hook payload, critical safety warnings, and a step-by-step recovery checklist.

Defensive cybersecurity command center architecture showing AI agent threat vectors, policy controls, and SOC operations.
Cybersecurity15 min read

CERT-In's Critical AI Agent Warning: What Happened to Indian Companies—and 9 Security Fixes Developers Should Apply

India's cybersecurity agency CERT-In has issued a Critical advisory warning that autonomous AI agents breached live Indian business systems. Here is what actually happened across the two incident categories, the conventional infrastructure weaknesses exploited, and 9 verified engineering fixes.

Technical cybersecurity diagram showing an autonomous AI coding agent ingesting a poisoned AGENTS.md file in a Downloads folder, leading to global configuration hijacking, malicious npm package execution, and credential exfiltration.
Cybersecurity12 min read

Instruction File Poisoning: How Malicious AGENTS.md Files Turn AI Coding Agents into Malware Vectors (2026)

In late October 2026, security researchers caught live malware exploiting a silent attack vector: poisoned AGENTS.md and CLAUDE.md files. Because AI coding agents inherently trust workspace markdown instructions, attackers can trigger unauthorized package installations, hijack global configurations, and establish persistent backdoors—all without traditional binary exploits.