☁️ IAM Privilege Escalation
Cloud IAM Privilege Escalation Reference
Every known path from a limited cloud permission to full admin — AWS (25+ paths), Azure, and GCP. For red teams and defenders alike.
These paths are documented for defensive purposes — understanding escalation paths allows defenders to detect and prevent them. Every path includes detection queries and remediation guidance.
☁ AWS IAM Privilege Escalation Paths
#1iam:CreatePolicyVersion → Adminiam:CreatePolicyVersionCriticalT1078.004▼
Required Permission(s)
iam:CreatePolicyVersionEscalation Technique
Create a new version of an existing IAM policy setting it as default. Set the new version to allow Action:* Resource:* — granting full admin access via that policy to all entities attached to it.
Detection
CloudTrail: CreatePolicyVersion where isDefaultVersion=true and policy document contains Action:*
Remediation
SCPs blocking CreatePolicyVersion. Alert on any new policy version creation with wildcard permissions.
#2iam:SetDefaultPolicyVersion → Adminiam:SetDefaultPolicyVersionCriticalT1078.004▼
Required Permission(s)
iam:SetDefaultPolicyVersionEscalation Technique
If older policy versions with broader permissions exist, set a previous wildcard-permissioned version as default without creating a new one — often overlooked as suspicious.
Detection
CloudTrail: SetDefaultPolicyVersion — especially if version being set is older than current
Remediation
Block SetDefaultPolicyVersion via SCP unless from approved automation role.
#3iam:CreateAccessKey → Lateral Movementiam:CreateAccessKeyCriticalT1552.001▼
Required Permission(s)
iam:CreateAccessKeyEscalation Technique
Create new access keys for any existing IAM user — especially users with higher privileges. Use those keys from external infrastructure.
Detection
CloudTrail: CreateAccessKey where targetUser != callerUser (creating keys for another user)
Remediation
Allow CreateAccessKey only for self via condition aws:RequestedRegion and IAM condition keys.
#4iam:CreateLoginProfile → Console Accessiam:CreateLoginProfileCriticalT1078.004▼
Required Permission(s)
iam:CreateLoginProfileEscalation Technique
Create a console password for an IAM user that previously had no console access — turns a programmatic-only user into a console user. Combined with admin permissions, gives full console control.
Detection
CloudTrail: CreateLoginProfile
Remediation
Alert on CreateLoginProfile for any user that already has significant IAM policies attached.
#5iam:UpdateLoginProfile → Account Takeoveriam:UpdateLoginProfileCriticalT1531▼
Required Permission(s)
iam:UpdateLoginProfileEscalation Technique
Change the console password of any existing IAM user — takes over their console session.
Detection
CloudTrail: UpdateLoginProfile where targetUser != callerUser
Remediation
Restrict UpdateLoginProfile to self only via IAM condition. Alert on any cross-user update.
#6iam:PassRole + ec2:RunInstances → Instance Adminiam:PassRole, ec2:RunInstancesCriticalT1078.004▼
Required Permission(s)
iam:PassRole, ec2:RunInstancesEscalation Technique
Launch a new EC2 instance and pass it a highly privileged IAM role (e.g. AdministratorAccess). SSH into the instance and use IMDS to get the admin credentials.
Detection
CloudTrail: RunInstances where IamInstanceProfile is a high-privilege role, from caller that doesn't normally launch instances
Remediation
Require MFA or SCP condition for RunInstances with privileged roles. Use iam:PassRole with conditions limiting which roles can be passed.
#7iam:PassRole + lambda:CreateFunction + lambda:InvokeFunctioniam:PassRole, lambda:CreateFunction, lambda:InvokeFunctionCriticalT1204.001▼
Required Permission(s)
iam:PassRole, lambda:CreateFunction, lambda:InvokeFunctionEscalation Technique
Create a Lambda function with a highly privileged execution role. Invoke the function with code that calls iam:CreateUser + iam:AttachUserPolicy to create a new admin user.
Detection
CloudTrail: CreateFunction with high-privilege role, immediately followed by InvokeFunction
Remediation
Alert on Lambda functions created with admin-level execution roles. Restrict lambda:CreateFunction via SCPs.
#8iam:PassRole + glue:CreateDevEndpoint → Node Adminiam:PassRole, glue:CreateDevEndpointCriticalT1078.004▼
Required Permission(s)
iam:PassRole, glue:CreateDevEndpointEscalation Technique
Create a Glue Development Endpoint with an admin IAM role. SSH into the endpoint node and use IMDS credentials.
Detection
CloudTrail: CreateDevEndpoint with highly privileged Role ARN
Remediation
Block Glue dev endpoint creation via SCP unless from data engineering approved accounts.
#9iam:CreateRole + iam:AttachRolePolicy → New Admin Roleiam:CreateRole, iam:AttachRolePolicyCriticalT1136▼
Required Permission(s)
iam:CreateRole, iam:AttachRolePolicyEscalation Technique
Create a new IAM role and attach AdministratorAccess policy. Then assume that role if caller also has sts:AssumeRole.
Detection
CloudTrail: CreateRole immediately followed by AttachRolePolicy (AdministratorAccess)
Remediation
SCPs blocking creation of roles with AdministratorAccess without approval workflow.
#10sts:AssumeRole (cross-account trust issues)sts:AssumeRoleCriticalT1550.001▼
Required Permission(s)
sts:AssumeRoleEscalation Technique
If a role trust policy allows * or any account to assume it, attacker in another account or from internet can assume the role directly.
Detection
CloudTrail: AssumeRole from external account IDs or unknown principals
Remediation
IAM Access Analyser detects externally-assumable roles. Alert on cross-account AssumeRole from unexpected accounts.
#11iam:PassRole + cloudformation:CreateStackiam:PassRole, cloudformation:CreateStackHighT1204.001▼
Required Permission(s)
iam:PassRole, cloudformation:CreateStackEscalation Technique
Create a CloudFormation stack that provisions a Lambda or EC2 with an admin execution role. The resources get the privileged role at creation time.
Detection
CloudTrail: CreateStack with template containing high-privilege PassRole
Remediation
Require cfn-guard or OPA validation on CloudFormation templates before deployment.
#12iam:AttachUserPolicy (to self)iam:AttachUserPolicyHighT1078.004▼
Required Permission(s)
iam:AttachUserPolicyEscalation Technique
If the caller can attach policies to themselves, attach AdministratorAccess directly — instant privilege escalation.
Detection
CloudTrail: AttachUserPolicy where targetUser == callerUser and policyArn contains AdministratorAccess
Remediation
Restrict AttachUserPolicy via SCP. Require approval workflow for any policy attachment.
#13iam:AttachGroupPolicy + iam:AddUserToGroupiam:AttachGroupPolicy, iam:AddUserToGroupHighT1078.004▼
Required Permission(s)
iam:AttachGroupPolicy, iam:AddUserToGroupEscalation Technique
Create or modify a group: attach admin policy to a group, then add yourself to that group.
Detection
CloudTrail: AttachGroupPolicy + AddUserToGroup in rapid sequence by same caller
Remediation
Alert on policy attachments to groups immediately followed by group membership changes.
#14s3:GetObject on CloudTrail Bucket → Credential Thefts3:GetObject (on log bucket)HighT1552▼
Required Permission(s)
s3:GetObject (on log bucket)Escalation Technique
Read CloudTrail logs to find IAM user credentials accidentally logged, API call patterns to understand account structure, and existing high-privilege user ARNs to target.
Detection
CloudTrail: high-volume GetObject on CloudTrail S3 bucket from non-logging service principals
Remediation
Restrict read access on CloudTrail S3 bucket to logging service only. Block bucket listing.
#15secretsmanager:GetSecretValue → Credential Escalationsecretsmanager:GetSecretValueHighT1555▼
Required Permission(s)
secretsmanager:GetSecretValueEscalation Technique
Read Secrets Manager secrets — may contain IAM access keys, database credentials, or application service credentials for higher-privilege systems.
Detection
CloudTrail: GetSecretValue for secrets not normally accessed by the caller identity
Remediation
Restrict GetSecretValue per secret using resource-based policies. Enable Secrets Manager access logging.
#16ssm:GetParameter (SecureString) → Credential Theftssm:GetParameterHighT1555▼
Required Permission(s)
ssm:GetParameterEscalation Technique
Read SSM Parameter Store SecureString values — commonly used to store database passwords, API keys, and IAM credentials.
Detection
CloudTrail: GetParameter for SecureString parameters from unusual caller
Remediation
Restrict ssm:GetParameter per parameter path using IAM conditions.
#17ec2:DescribeInstances + ssm:SendCommand → RCE on High-Priv Instancesssm:SendCommandHighT1609▼
Required Permission(s)
ssm:SendCommandEscalation Technique
Send arbitrary shell commands via SSM to existing EC2 instances with high-privilege roles — extract credentials from IMDS without needing SSH.
Detection
CloudTrail: SendCommand from unexpected caller to instances with privileged roles
Remediation
Restrict SendCommand via tag-based conditions. Alert on cross-account or unusual SSM send patterns.
#18iam:PassRole + ecs:RegisterTaskDefinition + ecs:RunTaskiam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTaskHighT1078.004▼
Required Permission(s)
iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTaskEscalation Technique
Register a new ECS task definition with a high-privilege task role. Run the task — the container gets admin credentials via IMDS.
Detection
CloudTrail: RegisterTaskDefinition with high-privilege role, followed by RunTask
Remediation
Restrict task definition creation to CI/CD pipelines. Require task role allowlisting via SCP.
#19iam:PassRole + sagemaker:CreateNotebookInstanceiam:PassRole, sagemaker:CreateNotebookInstanceHighT1078.004▼
Required Permission(s)
iam:PassRole, sagemaker:CreateNotebookInstanceEscalation Technique
Create a SageMaker notebook with admin execution role. Use the Jupyter terminal to access IMDS credentials.
Detection
CloudTrail: CreateNotebookInstance with high-privilege role from non-ML team identity
Remediation
Restrict SageMaker notebook creation to ML team. Block admin role usage in SageMaker via SCP.
#20iam:PassRole + codebuild:CreateProject + StartBuildiam:PassRole, codebuild:CreateProject, codebuild:StartBuildHighT1204.001▼
Required Permission(s)
iam:PassRole, codebuild:CreateProject, codebuild:StartBuildEscalation Technique
Create a CodeBuild project with admin service role. Run a build that exfiltrates environment credentials or creates new IAM users.
Detection
CloudTrail: CreateProject + StartBuild with admin service role from non-DevOps identity
Remediation
Restrict CodeBuild project creation to DevOps team. Alert on builds in projects created in last 24 hours.
#21iam:UpdateAssumeRolePolicy → Trust Policy Modificationiam:UpdateAssumeRolePolicyHighT1078.004▼
Required Permission(s)
iam:UpdateAssumeRolePolicyEscalation Technique
Modify an existing role's trust policy to allow the attacker's principal to assume it — effectively granting themselves that role's permissions.
Detection
CloudTrail: UpdateAssumeRolePolicy — any modification to trust policy
Remediation
Alert on all UpdateAssumeRolePolicy events. Restrict via SCP.
#22iam:PutRolePolicy → Inline Policy Adminiam:PutRolePolicyHighT1078.004▼
Required Permission(s)
iam:PutRolePolicyEscalation Technique
Add an inline policy with wildcard permissions to any IAM role — grants that role admin access instantly.
Detection
CloudTrail: PutRolePolicy with Action:* or Action:iam:*
Remediation
Block PutRolePolicy with wildcard permissions via SCP. Alert on all inline policy modifications.
#23iam:PutUserPolicy → Inline Policy Adminiam:PutUserPolicyHighT1078.004▼
Required Permission(s)
iam:PutUserPolicyEscalation Technique
Same as above but for users — add inline wildcard policy to any user.
Detection
CloudTrail: PutUserPolicy with Action:* in policy document
Remediation
Block PutUserPolicy with wildcard via SCP.
#24iam:PassRole + glue:CreateJob + glue:StartJobRuniam:PassRole, glue:CreateJob, glue:StartJobRunHighT1078.004▼
Required Permission(s)
iam:PassRole, glue:CreateJob, glue:StartJobRunEscalation Technique
Create a Glue ETL job with admin role — Glue job runs arbitrary Python/Scala with those credentials.
Detection
CloudTrail: CreateJob with admin role, StartJobRun by non-data-team identity
Remediation
Restrict Glue job creation to data engineering team accounts.
#25iam:CreateServiceSpecificCredential (CodeCommit)iam:CreateServiceSpecificCredentialHighT1552.001▼
Required Permission(s)
iam:CreateServiceSpecificCredentialEscalation Technique
Create CodeCommit-specific credentials for any IAM user — if that user has access to repos containing sensitive configs or credentials, enables data theft.
Detection
CloudTrail: CreateServiceSpecificCredential where targetUser != callerUser
Remediation
Alert on cross-user credential creation.
🔷 Azure IAM Privilege Escalation Paths
#1Microsoft.Authorization/roleAssignments/write → OwnerroleAssignments/writeCriticalazure▼
Required Permission(s)
roleAssignments/writeEscalation Technique
If a principal has permission to create role assignments, they can assign Owner role to themselves or another principal on any scope (subscription, resource group, management group).
Detection
Azure Activity Log: roleAssignments write where assignee == caller or unexpected principal. Alert on all Owner-level assignments.
Remediation
Remove roleAssignments/write from non-privileged roles. Use PIM for role assignment capability.
#2Microsoft.Authorization/roleDefinitions/write → Custom Admin RoleroleDefinitions/writeCriticalazure▼
Required Permission(s)
roleDefinitions/writeEscalation Technique
Create a new custom role with wildcard permissions (*/*/write or */*/*) and assign it to yourself. Custom roles with wildcard permissions are equivalent to Owner.
Detection
Azure Activity Log: roleDefinitions write followed by roleAssignments write in rapid sequence
Remediation
Block custom role creation via Azure Policy. Require custom roles to be reviewed.
#3Azure AD Global Administrator password resetUser Administrator or Password Administrator (for admins)Criticalazure▼
Required Permission(s)
User Administrator or Password Administrator (for admins)Escalation Technique
User Administrator can reset passwords of non-admin users. If escalated to Global Admin role (via PIM), can reset passwords of all users including other admins.
Detection
Azure AD Audit Log: Update user - password reset where target is a Global Admin or Privileged Role Admin
Remediation
Protect Global Admin accounts with Conditional Access requiring strong authentication.
#4Application Administrator → App credential creation → SP privilegeApplication AdministratorCriticalazure▼
Required Permission(s)
Application AdministratorEscalation Technique
Application Administrator can add credentials (client secrets or certificates) to any Azure AD App Registration. If that app's Service Principal has highly privileged directory roles or Azure RBAC, attacker can authenticate as that SP.
Detection
Azure AD Audit Log: Update application - Certificates and secrets management by non-owner
Remediation
Audit App Registrations for privileged SP permissions. Monitor credential additions by non-owners.
#4bManaged Identity → Resource ControlContributor on resource with MICriticalazure▼
Required Permission(s)
Contributor on resource with MIEscalation Technique
If an Azure resource has a System-assigned Managed Identity with broad permissions, gaining control of that resource (e.g., via a vulnerability in the app it runs) gives access to MI credentials via IMDS.
Detection
Azure Activity Log: IMDS token requests from unexpected resources. Monitor MSI token endpoint access.
Remediation
Apply least privilege to Managed Identities. Audit MI role assignments regularly.
#5Contributor → Automation Account Runbook → Code ExecutionContributorHighazure▼
Required Permission(s)
ContributorEscalation Technique
Contributor can create or modify Azure Automation Account runbooks that run as the Automation Account's Run As Account (which often has Contributor or higher on the subscription).
Detection
Azure Activity Log: Automation runbook creation/modification by unusual principals
Remediation
Restrict Automation Account access. Audit Run As Account permissions.
#6Key Vault Certificate Officer → Code Signing → Supply ChainKey Vault Certificate OfficerHighazure▼
Required Permission(s)
Key Vault Certificate OfficerEscalation Technique
Certificate Officer can issue and manage certificates. If Key Vault contains code-signing certificates, signing malicious code that appears legitimate.
Detection
Azure Key Vault Diagnostic Logs: certificate operations by non-PKI-team principals
Remediation
Restrict Key Vault operations by certificate purpose. Monitor all certificate issuances.
#7Storage Account Contributor → Blob → Credential ExfiltrationStorage Account ContributorHighazure▼
Required Permission(s)
Storage Account ContributorEscalation Technique
Can access all data in storage account including configuration files, tfstate files, or backups containing credentials.
Detection
Azure Storage Diagnostic Logs: bulk blob reads or downloads by unexpected principals
Remediation
Apply least privilege on storage accounts. Enable Azure Defender for Storage.
#8Virtual Machine Contributor → Extension Install → RCEVirtual Machine ContributorHighazure▼
Required Permission(s)
Virtual Machine ContributorEscalation Technique
VM Contributor can install VM Extensions — including Custom Script Extension that runs arbitrary PowerShell/bash. Run as SYSTEM on Windows or root on Linux.
Detection
Azure Activity Log: VM extension installation — especially CustomScript type
Remediation
Restrict VM extension installation via Azure Policy. Alert on CustomScriptExtension deployments.
#9Logic App Contributor → Managed Identity → Graph APILogic App ContributorHighazure▼
Required Permission(s)
Logic App ContributorEscalation Technique
If a Logic App has a System-assigned MI with Microsoft Graph API permissions (e.g., User.ReadWrite.All), can modify the Logic App workflow to call Graph API on behalf of the MI — read all user data, reset passwords.
Detection
Azure Activity Log: Logic App workflow modification
Remediation
Audit Logic App MI Graph API permissions. Apply least privilege to Logic App identities.
🟡 GCP IAM Privilege Escalation Paths
#1iam.serviceAccounts.setIamPolicy → SA Impersonationiam.serviceAccounts.setIamPolicyCriticalgcp▼
Required Permission(s)
iam.serviceAccounts.setIamPolicyEscalation Technique
Modify the IAM policy on a Service Account to grant yourself the roles/iam.serviceAccountTokenCreator role — then generate access tokens for that SA. If the SA has high privileges, instant escalation.
Detection
Cloud Audit Logs: SetIamPolicy on service account resource by non-SA-owner identity
Remediation
Alert on SA IAM policy modifications. Restrict setIamPolicy to SA administrators only.
#2iam.roles.update → Custom Role Escalationiam.roles.updateCriticalgcp▼
Required Permission(s)
iam.roles.updateEscalation Technique
Update an existing custom IAM role to include higher-privilege permissions (e.g., add resourcemanager.projects.setIamPolicy to an existing role). All entities with that role instantly get the new permission.
Detection
Cloud Audit Logs: roles.update where new permissions include resourcemanager or iam write operations
Remediation
Alert on all custom role updates. Require change approval for role modifications.
#3resourcemanager.projects.setIamPolicy → Project Ownerresourcemanager.projects.setIamPolicyCriticalgcp▼
Required Permission(s)
resourcemanager.projects.setIamPolicyEscalation Technique
Directly set the project IAM policy — bind yourself to roles/owner on the project. Full project access.
Detection
Cloud Audit Logs: SetIamPolicy on project resource by non-org-admin identity
Remediation
This permission should be reserved for break-glass accounts only. Audit all holders.
#4iam.serviceAccounts.actAs + compute.instances.create → Instance Credentialiam.serviceAccounts.actAs, compute.instances.createCriticalgcp▼
Required Permission(s)
iam.serviceAccounts.actAs, compute.instances.createEscalation Technique
Create a Compute instance with a high-privilege SA. SSH to instance and use metadata server to get SA tokens.
Detection
Cloud Audit Logs: instances.insert with high-privilege serviceAccount annotation
Remediation
Restrict compute.instances.create via org policy. Require specific SA allowlist via constraints.
#5cloudfunctions.functions.create + iam.serviceAccounts.actAscloudfunctions.functions.create, iam.serviceAccounts.actAsHighgcp▼
Required Permission(s)
cloudfunctions.functions.create, iam.serviceAccounts.actAsEscalation Technique
Deploy a Cloud Function with a high-privilege SA runtime account. Invoke the function — it runs as the privileged SA and can create new IAM bindings.
Detection
Cloud Audit Logs: cloudfunctions.functions.create with high-privilege service account
Remediation
Restrict Cloud Function deployment to approved SAs. Alert on function deployments with owner-level SAs.
#6storage.buckets.setIamPolicy → Bucket Data Accessstorage.buckets.setIamPolicyHighgcp▼
Required Permission(s)
storage.buckets.setIamPolicyEscalation Technique
Modify bucket IAM policy to grant yourself storage.objectViewer or admin — access all bucket data including potential credentials.
Detection
Cloud Audit Logs: SetIamPolicy on storage bucket by non-owner
Remediation
Alert on bucket policy changes. Enable Cloud Audit Data Access logs for storage.
#7cloudrun.services.setIamPolicy + cloudrun.services.createcloudrun.services.setIamPolicyHighgcp▼
Required Permission(s)
cloudrun.services.setIamPolicyEscalation Technique
Create a Cloud Run service with a high-privilege SA identity. The service container runs as that SA.
Detection
Cloud Audit Logs: Cloud Run service creation with privileged SA
Remediation
Restrict Cloud Run SA to minimum required permissions.
#8secretmanager.versions.access on SA key secretssecretmanager.versions.accessHighgcp▼
Required Permission(s)
secretmanager.versions.accessEscalation Technique
Access Secret Manager secrets containing SA keys, database credentials, or API tokens for higher-privilege systems.
Detection
Cloud Audit Logs: AccessSecretVersion for secrets not normally accessed by the caller
Remediation
Apply IAM conditions on Secret Manager. Enable audit logging for all secret accesses.
🔍 Detection Queries for Privilege Escalation
AWS — CloudTrail KQL (Sentinel)
// Detect rapid IAM permission changes — privilege escalation pattern
AWSCloudTrail
| where EventName in (
"CreatePolicyVersion","SetDefaultPolicyVersion","AttachUserPolicy",
"AttachRolePolicy","AttachGroupPolicy","PutUserPolicy","PutRolePolicy",
"CreateAccessKey","UpdateAssumeRolePolicy","CreateLoginProfile","UpdateLoginProfile"
)
| summarize Actions=make_set(EventName), Count=count(), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated)
by UserIdentityArn, SourceIPAddress, bin(TimeGenerated, 30m)
| where Count >= 3 // 3+ IAM changes in 30 minutes
| project TimeRange=strcat(FirstSeen,"→",LastSeen), Actor=UserIdentityArn, SourceIP=SourceIPAddress, Actions, Count
| sort by Count desc
AWS — PassRole to High-Privilege Service (SPL)
index=aws sourcetype="aws:cloudtrail"
eventName IN ("RunInstances","CreateFunction","StartBuild","CreateNotebookInstance","RegisterTaskDefinition","CreateDevEndpoint")
| spath output=roleArn path=requestParameters.iamInstanceProfile.arn
| eval roleArn=coalesce(roleArn, 'requestParameters.role', 'requestParameters.executionRoleArn')
| search roleArn="*AdministratorAccess*" OR roleArn="*admin*" OR roleArn="*full*"
| table _time, userIdentity.arn, eventName, roleArn, sourceIPAddress, awsRegion
| sort -_time
Azure — Role Assignment to High-Privilege Role (KQL)
AzureActivity
| where OperationNameValue == "MICROSOFT.AUTHORIZATION/ROLEASSIGNMENTS/WRITE"
| where ActivityStatusValue == "Success"
| extend Properties = parse_json(Properties)
| extend RoleName = tostring(Properties.roleDefinitionName)
| where RoleName in ("Owner","Contributor","User Access Administrator","Global Administrator")
| project TimeGenerated, Caller, RoleName, ResourceGroup, SubscriptionId, CorrelationId
| sort by TimeGenerated desc
GCP — SA IAM Policy Change (Log Query)
-- GCP Logging query
resource.type="service_account"
AND protoPayload.methodName="SetIamPolicy"
AND protoPayload.serviceData.policyDelta.bindingDeltas.action="ADD"
AND (protoPayload.serviceData.policyDelta.bindingDeltas.role="roles/owner"
OR protoPayload.serviceData.policyDelta.bindingDeltas.role="roles/iam.serviceAccountTokenCreator")