CONSENT PHISHING
ILLICIT GRANT
OAUTH SCOPES
ENTRA AUDIT
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting OAuth Consent Phishing and Illicit Grants

Consent phishing skips the password and the MFA prompt. The victim hands an attacker-controlled app a token, and that token keeps working after a password reset.

Scroll

In an illicit consent grant attack, the lure is a link to a real Microsoft consent screen for an app the attacker registered. Once a user clicks Accept, the app holds delegated access to mail, files or contacts through a refresh token, with no credential theft and no MFA challenge involved. The grant is logged in Entra audit logs, which makes it detectable if you watch the right operations.

Signals at a Glance

SignalWhereATT&CK
User consent to an app requesting mail, files or offline_access scopesEntra AuditLogsT1528
First-seen app consented by two or more users in a short windowEntra AuditLogsT1566.002
Admin consent granted to an unverified publisher or new appEntra AuditLogsT1528
App sign-in or Graph calls from infrastructure unrelated to the publisherService principal sign-in logsT1550.001
New mailbox rules or bulk mail reads by the app after consentUnified audit log, Graph activityT1114.002

Catching the Grant

The consent event is the earliest reliable signal. Entra records Consent to application and related grant operations in AuditLogs, with the app and the granted permissions in the target resource. Start by flagging grants that include scopes with high abuse value:

// Microsoft Sentinel (KQL) - consent grants that include high-value delegated scopes
let riskyScopes = dynamic(["Mail.Read","Mail.ReadWrite","Mail.Send","Files.Read.All","Files.ReadWrite.All",
                           "Contacts.Read","MailboxSettings.ReadWrite","User.Read.All","Directory.ReadWrite.All","offline_access"]);
AuditLogs
| where OperationName in ("Consent to application", "Add delegated permission grant", "Add app role assignment grant to user")
| where Result =~ "success"
| extend App = tostring(TargetResources[0].displayName),
         AppId = tostring(TargetResources[0].id),
         Actor = tostring(InitiatedBy.user.userPrincipalName),
         ActorIp = tostring(InitiatedBy.user.ipAddress),
         Perms = tostring(TargetResources[0].modifiedProperties)
| where Perms has_any (riskyScopes)
| project TimeGenerated, OperationName, Actor, ActorIp, App, AppId, Perms
// tune/validate: offline_access alone is common; baseline your sanctioned apps and allowlist by AppId

Spotting the Campaign

Phishing campaigns reuse one app across many victims, so the strongest pattern is a first-seen application consented by several users within hours. This query separates it from your normal app catalogue:

// KQL - new app consented by multiple distinct users in the last day
let known = AuditLogs
    | where TimeGenerated between (ago(30d) .. ago(1d))
    | where OperationName == "Consent to application"
    | extend AppId = tostring(TargetResources[0].id)
    | distinct AppId;
AuditLogs
| where TimeGenerated > ago(1d)
| where OperationName == "Consent to application" and Result =~ "success"
| extend AppId = tostring(TargetResources[0].id),
         App = tostring(TargetResources[0].displayName),
         User = tostring(InitiatedBy.user.userPrincipalName)
| where AppId !in (known)
| summarize Users = dcount(User), FirstSeen = min(TimeGenerated), UserList = make_set(User, 20) by AppId, App
| where Users >= 2
// tune/validate: raise the threshold in large tenants or add a publisher-domain filter
Vetted sources

Use Microsoft’s Entra guidance on detecting and remediating illicit consent grants, Microsoft Sentinel and Defender for Cloud Apps app-governance content, and the SigmaHQ Azure audit rules as starting points. Baseline your own environment first: sanctioned SaaS integrations generate legitimate consent events constantly.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026