Summary
| Forestall ACL Alias | AZ_MG_GRANT_APP_ROLES |
| Entra ID (Azure AD) Alias | Grant App Roles (Microsoft Graph) |
| Affected Object Types | Service Principals (Enterprise applications), Users, Groups |
| Exploitation Certainty | Certain |
| Graph Permission / Role | Application Permission: AppRoleAssignment.ReadWrite.All or RoleManagement.ReadWrite.Directory |
Description
AZ_MG_GRANT_APP_ROLES represents the ability for a principal to grant app roles via Microsoft Graph by creating app role assignments.
App role assignments can be granted to:
- A service principal (enterprise application).
- A user.
- A group.
By granting an app role to a controlled identity, an attacker can:
- Assign high-privilege application permissions to a service principal (for example, by assigning Microsoft Graph app roles), then authenticate as that app and act with those privileges.
- Assign roles in line-of-business applications that gate access to sensitive data or administrative features.
- Establish persistence by granting roles to long-lived identities (service principals / managed identities).
Therefore, any identity that can grant app roles through Microsoft Graph can quickly escalate privileges or expand access by modifying app role assignments.
Identification
PowerShell (Microsoft Graph)
Enumerate service principals that have Microsoft Graph application permissions that can grant app roles (AppRoleAssignment.ReadWrite.All or RoleManagement.ReadWrite.Directory).
Install-Module Microsoft.Graph -Scope CurrentUserImport-Module Microsoft.Graph.Applications
Connect-MgGraph -Scopes "Application.Read.All", "AppRoleAssignment.Read.All"
$graphAppId = "00000003-0000-0000-c000-000000000000"$graphSp = Get-MgServicePrincipal -Filter "appId eq '$graphAppId'"if (-not $graphSp) { throw "Microsoft Graph service principal not found." }
# Permission IDs that can grant app roles$targetPermissions = @{ "AppRoleAssignment.ReadWrite.All" = "06b708a9-e830-4db3-a914-8e69da51d44f" "RoleManagement.ReadWrite.Directory" = "9e3f62cf-ca93-4989-b6ce-bf83c28f9fe8"}
# Get all app role assignments granted TO Microsoft Graph$allAssignments = Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $graphSp.Id -All
# Filter for target permissions$matchingAssignments = $allAssignments | Where-Object { $targetPermissions.Values -contains $_.AppRoleId }
$results = $matchingAssignments | ForEach-Object { $assignment = $_ $permName = ($targetPermissions.GetEnumerator() | Where-Object { $_.Value -eq $assignment.AppRoleId }).Key [PSCustomObject]@{ ServicePrincipalDisplayName = $assignment.PrincipalDisplayName ServicePrincipalId = $assignment.PrincipalId GraphApplicationPermission = $permName AssignedDateTime = $assignment.CreatedDateTime }}
Write-Host "Found $($results.Count) service principals with permissions that can grant app roles"$results | Sort-Object GraphApplicationPermission, ServicePrincipalDisplayName | Format-Table -AutoSizeAzure Portal
- Identify service principals with Graph permissions that can grant app roles
- Go to Microsoft Entra admin center -> Enterprise applications.
- Open the application (service principal).
- Go to Permissions / API permissions.
- Under Microsoft Graph -> review Application permissions for:
AppRoleAssignment.ReadWrite.AllRoleManagement.ReadWrite.Directory
- Record the business owner and justification.
- Identify admin roles that can grant app roles
- Go to Roles & administrators.
- Review assignments for:
- Global Administrator
- Privileged Role Administrator
- Application Administrator
- Cloud Application Administrator
- If a group is assigned, enumerate transitive membership.
- Review existing app role assignments
- For a target enterprise app:
- Open Enterprise applications -> select the app -> go to Users and groups.
- Review who has roles assigned inside the application.
- For a target enterprise app:
Exploitation
Related Attack Paths:
- AZ_MG_APPROLEASSIGNMENT_READWRITE_ALL - Directly grants the
AppRoleAssignment.ReadWrite.Allpermission enabling app role assignment creation.- AZ_MG_ROLEMANAGEMENT_READWRITE_DIRECTORY - Allows assigning directory roles (e.g., Global Administrator) to escalate privileges after granting app roles.
Azure Portal
- Go to Microsoft Entra admin center -> Identity -> Applications -> App registrations.
- Open your app registration (Contoso-Automation).
- Select API permissions.
- Select Add a permission.
- Select Microsoft Graph.
- Select Application permissions.
- Search for Group.Read.All, select it, then choose Add permissions.
- Back on API permissions, select Grant admin consent for
, then confirm. - Confirm Status shows Granted for
Group.Read.All.
Mitigation
- Remove unnecessary Graph application permissions from service principals:
- Prioritize removing
AppRoleAssignment.ReadWrite.AllandRoleManagement.ReadWrite.Directorywhen not required.
- Prioritize removing
- Restrict who can grant admin consent and who can manage enterprise applications.
- Limit privileged directory roles:
- Keep Application Administrator and Cloud Application Administrator assignments minimal.
- Use just-in-time access where possible.
- Implement change control for enterprise app role assignments:
- Require approvals for role assignment changes on sensitive applications.
- Regularly review app role assignments:
- Review both application permissions (app role assignments to Microsoft Graph) and enterprise app roles (Users and groups assignments).
Detection
Use the Microsoft Entra admin center:
- Open Microsoft Entra ID -> Audit logs.
- Filter for application and enterprise application management activities.
- Review activities such as app role assignment added, app role assignment granted, and application role assigned to a user, group, or service principal.
- Review Initiated by (actor), Target resources, Date, and Status for unexpected app role grants.
- Open the affected Enterprise application and review Permissions, Users and groups, and Owners.
References
- https://learn.microsoft.com/en-us/graph/api/serviceprincipal-post-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/api/user-post-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/api/group-post-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/api/serviceprincipal-list-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/api/user-list-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/api/group-list-approleassignments?view=graph-rest-1.0
- https://learn.microsoft.com/en-us/graph/permissions-reference
- https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.applications/get-mgserviceprincipalapproleassignment?view=graph-powershell-1.0
- https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.applications/new-mgserviceprincipalapproleassignment?view=graph-powershell-1.0
- https://learn.microsoft.com/en-us/entra/identity/monitoring-health/reference-audit-activities