Detection rules › Splunk
Azure AD Privileged Role Assigned
The following analytic detects the assignment of privileged Azure Active Directory roles to a user. It leverages Azure AD audit logs, specifically monitoring the "Add member to role" operation. This activity is significant as adversaries may assign privileged roles to compromised accounts to maintain persistence within the Azure AD environment. If confirmed malicious, this could allow attackers to escalate privileges, access sensitive information, and maintain long-term control over the Azure AD infrastructure.
Known false positives
- Administrators will legitimately assign the privileged roles users as part of administrative tasks. Filter as needed.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Persistence | |
| Privilege Escalation |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Azure | Add member to role |
Rules detecting the same action
These rules filter on the same operation.
- [Entra ID] Application Assigned Administrator Permissions Immediately After Obtaining Role Management Permissions (Kusto)
- [Entra ID] Mass Privileged Role Change Activity Detected (Kusto)
- [Entra ID] Privilege Elevation Request Denied (Kusto)
- [Entra ID] Privileged Role Assigned to a New User (Kusto)
- [Entra ID] Privileged Role Assigned to User (Kusto)
- Account Elevated to New Role (Kusto)
- Admin promotion after Role Management Application Permission Grant (Kusto)
- App Assigned To Azure RBAC/Microsoft Entra Role (Sigma)
Rule body
name: Azure AD Privileged Role Assigned
id: a28f0bc3-3400-4a6e-a2da-89b9e95f0d2a
version: 16
creation_date: '2022-08-29'
modification_date: '2026-05-13'
author: Mauricio Velazco, Gowthamaraj Rajendran, Splunk
status: production
type: TTP
description: The following analytic detects the assignment of privileged Azure Active Directory roles to a user. It leverages Azure AD audit logs, specifically monitoring the "Add member to role" operation. This activity is significant as adversaries may assign privileged roles to compromised accounts to maintain persistence within the Azure AD environment. If confirmed malicious, this could allow attackers to escalate privileges, access sensitive information, and maintain long-term control over the Azure AD infrastructure.
data_source:
- Azure Active Directory Add member to role
search: |-
`azure_monitor_aad` "operationName"="Add member to role"
| rename properties.* as *
| rename initiatedBy.user.userPrincipalName as initiatedBy
| rename targetResources{}.modifiedProperties{}.newValue as roles
| eval role=mvindex(roles,1)
| fillnull
| stats count min(_time) as firstTime max(_time) as lastTime
BY dest user src
vendor_account vendor_product initiatedBy
result role signature
| lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole description
| search isprvilegedadrole = True
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `azure_ad_privileged_role_assigned_filter`
how_to_implement: You must install the latest version of Splunk Add-on for Microsoft Cloud Services from Splunkbase (https://splunkbase.splunk.com/app/3110/#/details). You must be ingesting Azure Active Directory events into your Splunk environment. This analytic was written to be used with the azure:monitor:aad sourcetype leveraging the AuditLog log category.
known_false_positives: Administrators will legitimately assign the privileged roles users as part of administrative tasks. Filter as needed.
references:
- https://docs.microsoft.com/en-us/azure/active-directory/roles/concept-understand-roles
- https://docs.microsoft.com/en-us/azure/active-directory/roles/permissions-reference
- https://adsecurity.org/?p=4277
- https://www.mandiant.com/resources/detecting-microsoft-365-azure-active-directory-backdoors
- https://docs.microsoft.com/en-us/azure/active-directory/roles/security-planning
- https://attack.mitre.org/techniques/T1098/003/
finding:
title: A privileged Azure AD role was assigned for User $user$ initiated by $initiatedBy$
entity:
field: initiatedBy
type: user
score: 50
intermediate_findings:
entities:
- field: user
type: user
score: 50
message: A privileged Azure AD role was assigned for User $user$ initiated by $initiatedBy$
analytic_story:
- Azure Active Directory Persistence
- NOBELIUM Group
- Scattered Lapsus$ Hunters
- Storm-0501 Ransomware
asset_type: Azure Active Directory
mitre_attack_id:
- T1098.003
product:
- Splunk Enterprise
- Splunk Enterprise Security
- Splunk Cloud
category: cloud
security_domain: audit
Stages and Predicates
Stage 1: search
`azure_monitor_aad` "operationName"="Add member to role"
Stage 2: rename
| rename properties.* as *
Stage 3: rename
| rename initiatedBy.user.userPrincipalName as initiatedBy
Stage 4: rename
| rename targetResources{}.modifiedProperties{}.newValue as roles
Stage 5: eval
| eval role=mvindex(roles,1)
Stage 6: fillnull
| fillnull
Stage 7: stats
| stats count min(_time) as firstTime max(_time) as lastTime
BY dest user src
vendor_account vendor_product initiatedBy
result role signature
Stage 8: lookup
| lookup privileged_azure_ad_roles azureadrole AS role OUTPUT isprvilegedadrole description
Stage 9: search
| search isprvilegedadrole = True
Stage 10: search
| `security_content_ctime(firstTime)`
Stage 11: search
| `security_content_ctime(lastTime)`
Stage 12: search
| `azure_ad_privileged_role_assigned_filter`
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
isprvilegedadrole | eq |
| field:"isprvilegedadrole" kind:eq value:"True" |
operationName | eq |
| field:"operationName" kind:eq |
sourcetype | eq |
| field:"sourcetype" kind:eq value:"azure:monitor:aad" |