Detection rules › Splunk

Azure AD Privileged Graph API Permission Assigned

Status
production
Severity
medium
Group by
Permissions, aws::recipientAccountId, dest, signature, src, user, vendor_product
Author
Mauricio Velazco, Splunk
Source
github.com/splunk/security_content

The following analytic detects the assignment of high-risk Graph API permissions in Azure AD, specifically Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All, and RoleManagement.ReadWrite.Directory. It uses azure_monitor_aad data to scan AuditLogs for 'Update application' operations, identifying when these permissions are assigned. This activity is significant as it grants broad control over Azure AD, including application and directory settings. If confirmed malicious, it could lead to unauthorized modifications and potential security breaches, compromising the integrity and security of the Azure AD environment. Immediate investigation is required.

Known false positives

  • Privileged Graph API permissions may be assigned for legitimate purposes. Filter as needed.

MITRE ATT&CK coverage

Telemetry coverage

PlatformRecord / event type
AzureUpdate application

Rules detecting the same action

These rules filter on the same operation.

Rule body

name: Azure AD Privileged Graph API Permission Assigned
id: 5521f8c5-1aa3-473c-9eb7-853701924a06
version: 11
creation_date: '2024-02-14'
modification_date: '2026-05-13'
author: Mauricio Velazco, Splunk
status: production
type: TTP
description: The following analytic detects the assignment of high-risk Graph API permissions in Azure AD, specifically Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All, and RoleManagement.ReadWrite.Directory. It uses azure_monitor_aad data to scan AuditLogs for 'Update application' operations, identifying when these permissions are assigned. This activity is significant as it grants broad control over Azure AD, including application and directory settings. If confirmed malicious, it could lead to unauthorized modifications and potential security breaches, compromising the integrity and security of the Azure AD environment. Immediate investigation is required.
data_source:
    - Azure Active Directory Update application
search: "`azure_monitor_aad` category=AuditLogs operationName=\"Update application\" | eval newvalue = mvindex('properties.targetResources{}.modifiedProperties{}.newValue',0) | spath input=newvalue | search \"{}.RequiredAppPermissions{}.EntitlementId\"=\" 1bfefb4e-e0b5-418b-a88f-73c46d2cc8e9\" OR \"{}.RequiredAppPermissions{}.EntitlementId\" =\"06b708a9-e830-4db3-a914-8e69da51d44f\" OR \"{}.RequiredAppPermissions{}.EntitlementId\" =\"9e3f62cf-ca93-4989-b6ce-bf83c28f9fe8\" | eval Permissions = '{}.RequiredAppPermissions{}.EntitlementId' | fillnull | stats count min(_time) as firstTime max(_time) as lastTime by dest user src vendor_account vendor_product Permissions signature | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `azure_ad_privileged_graph_api_permission_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: Privileged Graph API permissions may be assigned for legitimate purposes. Filter as needed.
references:
    - https://cloudbrothers.info/en/azure-attack-paths/
    - https://github.com/mandiant/Mandiant-Azure-AD-Investigator/blob/master/MandiantAzureADInvestigator.json
    - https://learn.microsoft.com/en-us/graph/permissions-reference
    - https://www.microsoft.com/en-us/security/blog/2024/01/25/midnight-blizzard-guidance-for-responders-on-nation-state-attack/
    - https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48
finding:
    title: User $user$ assigned privileged Graph API permissions to $Permissions$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Azure Active Directory Persistence
    - NOBELIUM Group
asset_type: Azure Active Directory
mitre_attack_id:
    - T1003.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`azure_monitor_aad` category=AuditLogs operationName="Update application"

Stage 2: eval

| eval newvalue = mvindex('properties.targetResources{}.modifiedProperties{}.newValue',0)

Stage 3: spath

| spath input=newvalue

Stage 4: search

| search "{}.RequiredAppPermissions{}.EntitlementId"=" 1bfefb4e-e0b5-418b-a88f-73c46d2cc8e9" OR "{}.RequiredAppPermissions{}.EntitlementId" ="06b708a9-e830-4db3-a914-8e69da51d44f" OR "{}.RequiredAppPermissions{}.EntitlementId" ="9e3f62cf-ca93-4989-b6ce-bf83c28f9fe8"

Stage 5: eval

| eval Permissions = '{}.RequiredAppPermissions{}.EntitlementId'

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 Permissions signature

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `azure_ad_privileged_graph_api_permission_assigned_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
categoryeq
  • AuditLogs
field:"category" kind:eq value:"AuditLogs"
operationNameeq
  • "Update application"
field:"operationName" kind:eq
sourcetypeeq
  • azure:monitor:aad
field:"sourcetype" kind:eq value:"azure:monitor:aad"
{}.RequiredAppPermissions{}.EntitlementIdeq
  • " 1bfefb4e-e0b5-418b-a88f-73c46d2cc8e9"
  • "06b708a9-e830-4db3-a914-8e69da51d44f"
  • "9e3f62cf-ca93-4989-b6ce-bf83c28f9fe8"
field:"{}.RequiredAppPermissions{}.EntitlementId" kind:eq