Summary
| Forestall ACL Alias | AWS_SSO_ASSUME_ROLE |
| Affected Object Types | AWSSSOUser|AWSSSOGroup → AWSReservedSSO (AWSIAMRole) |
| Exploitation Certainty | High |
Description
An SSO User can assume a specific IAM role provisioned by IAM Identity Center. These roles follow the naming pattern AWSReservedSSO_{PermissionSetName}_{hash} and are created automatically in each assigned account.
AWS_SSO_ASSUME_ROLE is the single SSO → IAM uplift: the SSO principal converts its Identity Center session into temporary credentials for the provisioned IAM role. It is derived structurally (an account assignment plus a provisioned AWSReservedSSO_* role, see AWS_SSO_MAPS_TO_ROLE), not from any IAM policy. The Permission Set’s policies set the role’s value, not the edge’s existence.
Edge semantics: (AWSSSOUser|AWSSSOGroup) -[AWS_SSO_ASSUME_ROLE]-> (AWSReservedSSO_* IAM Role). A group assignment reaches the role through membership: AWSSSOUser -member-> AWSSSOGroup -ASSUME_ROLE-> role.
Abuse methods (same edge, transport only):
- console_saml: portal “Management console” → SAML POST →
sts:AssumeRoleWithSAML. The reserved role trusts the IdC-managedAWSSSO_*_DO_NOT_DELETESAML provider. CloudTrail:AssumeRoleWithSAML@sts.amazonaws.com. - cli_token:
aws sso login→ sso-oidc device flow → access token (~/.aws/sso/cache/*.json, ~8h) →aws sso get-role-credentials --role-name <PS> --account-id <acct> --access-token <token>. IdC assumes the role on the user’s behalf and returns SigV4 credentials. CloudTrail:GetRoleCredentials@sso.amazonaws.com. (sso:GetRoleCredentialsis a Portal API call authorized by the bearer token, not a grantable IAM policy action. That is why it cannot be a separate, policy-derived edge.)
An attacker who controls this SSO identity (e.g. by stealing the cached access token) gets every permission the target IAM role carries in that account. If the role has AdministratorAccess, that is full account compromise.
Identification
Find which IAM roles an SSO user can assume:
# List AWSReservedSSO roles in the target accountaws iam list-roles --query "Roles[?starts_with(RoleName, 'AWSReservedSSO_')].[RoleName,Arn]"
# Review the trust policy of a specific SSO-provisioned roleaws iam get-role --role-name "AWSReservedSSO_<PermissionSetName>_<hash>" \ --query "Role.AssumeRolePolicyDocument"
# Check the role's attached policiesaws iam list-attached-role-policies \ --role-name "AWSReservedSSO_<PermissionSetName>_<hash>"Forestall ISPM emits this edge when an SSO user’s effective permission set matches a provisioned AWSReservedSSO_* IAM role in an assigned account.
Mitigation
- Keep
AWSReservedSSO_*role permissions minimal. Build least-privilege permission sets from the start. - Audit permission set policies regularly and remove any
*action or resource grants. - Restrict which accounts each permission set is assigned to.
- Apply SCPs to limit what
AWSReservedSSO_*roles can do, even if the permission set is broad.
Detection
The two abuse methods are logged separately. Cover both:
- console_saml:
AssumeRoleWithSAML@sts.amazonaws.com:roleArnstarts withAWSReservedSSO_, plussourceIPAddress,responseElements.assumedRoleUser. - cli_token:
GetRoleCredentials@sso.amazonaws.com:roleName(Permission Set),accountId,userIdentity(portal identity),sourceIPAddress.
Alert on calls from unexpected source IPs or outside normal hours, and on token-credential retrieval that fans out across many accounts. Use Security Hub and GuardDuty to catch anomalous activity from SSO-provisioned roles after they assume.