CHAIN-120 — Function App with over-privileged Graph permission¶
Summary
Severity: High · Likelihood: Medium · Logic: ALL
Why this chain matters¶
A Function App is granted Directory.ReadWrite.All via its managed identity — the developer couldn't figure out the least-privilege scope. Any prompt-injection / template-injection / upstream-library-compromise against the function gives attackers tenant-wide directory write.
Component rules¶
This chain fires when its trigger conditions are met by the following rules. Click any rule to see its detection logic and compliance mappings.
| Rule ID | Role |
|---|---|
zt_wl_002 |
Trigger |
zt_id_011 |
Trigger |
Attack walkthrough¶
Step 1 — Exploit injection vuln in function HTTP handler.¶
Actor: Attacker
MITRE ATT&CK: T1190
Enabled by: zt_wl_002
Attacker gain: Code execution with function MI.
Step 2 — Use MI's Directory.ReadWrite.All to create admin users.¶
Actor: Attacker
MITRE ATT&CK: T1098
Enabled by: zt_id_011
Attacker gain: Tenant admin persistence.
Blast radius¶
| Initial access | Function-app vuln. |
| Max privilege | Tenant directory write. |
| Data at risk | All directory objects |
| Services at risk | Entra ID |
How the logic works¶
The chain fires only when every rule above has at least one finding in the current scan. Missing any one rule breaks the chain — so remediating any single step disrupts the attack path.