Executive Summary
The assessment recorded 9 findings in the in-scope environment (1 Critical, 4 High, 2 Medium, 1 Low, 1 Informational).
The highest-severity modeled attack path, AZ-PATH-001 (Critical), “Public web app to subscription Owner,” traces a route ending in Subscription Owner.
9 of 9 findings are in an open or unresolved state and warrant remediation tracking.
4 findings participate in at least one modeled attack path and should be prioritized to break those chains.
Attack Paths
Modeled routes an adversary could take through the environment. Nodes linked to a finding are clickable and jump to the detailed finding.
Findings
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-web-prod/providers/Microsoft.Web/sites/contoso-public-portalDescription
An internet-facing App Service has a system-assigned managed identity that can read a Key Vault holding a service principal credential. That principal holds roleAssignments/write at the subscription scope, enabling self-elevation to Owner.
Attack vector
Public web entry -> SSRF/code exec -> managed identity token -> Key Vault secret -> privileged SP -> roleAssignments/write -> subscription Owner
Attack path
- Public App Service (contoso-public-portal)
- App managed identity token (IMDS)
- Key Vault kv-web-prod secret read
- Service principal sp-deploy-prod
- roleAssignments/write self-elevation
- Subscription Owner
Risk
Full administrative control of the production subscription, including all data stores and the ability to disable logging.
Evidence
- Azure Resource GraphApp Service contoso-public-portal exposes HTTPS publicly with system-assigned identity enabled.
- az role assignment listSP 'sp-deploy-prod' holds a custom role with Microsoft.Authorization/roleAssignments/write at subscription scope.
- az keyvault showKey Vault kv-web-prod grants get/list secrets to the app's managed identity via access policy.
Recommendation
Remove roleAssignments/write from the service principal (replace with PIM-eligible, time-bound assignment). Scope the managed identity's Key Vault access to only the secrets it needs and enable Key Vault RBAC with purge protection.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleAssignments/sp-deploy-prodDescription
The CI/CD service principal 'sp-deploy-prod' is assigned a custom role that includes Microsoft.Authorization/roleAssignments/write — an escalation primitive that lets the principal grant itself Owner.
Attack vector
Any compromise of the SP credential yields a one-step path to subscription Owner.
Attack path
- Compromised SP sp-deploy-prod
- roleAssignments/write
- Self-assign Owner
Risk
Privilege escalation to full subscription control; this is the pivot that turns the public-web entry point into a Critical chain.
Evidence
- az role definition listCustom role 'Deploy-Prod' includes Microsoft.Authorization/roleAssignments/write.
Recommendation
Replace the standing assignment with a least-privilege deployment role that excludes roleAssignments/write. If role assignment is required, gate it behind PIM with approval.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-infra/providers/Microsoft.Network/networkSecurityGroups/nsg-jumpboxDescription
NSG 'nsg-jumpbox' has an inbound rule allowing TCP 3389 from source 0.0.0.0/0 (Any). The associated VM is directly reachable for RDP brute-force.
Attack vector
Internet-wide RDP brute force / credential stuffing against the jumpbox.
Risk
Initial access foothold on a management host with line of sight to internal resources.
Evidence
- az network nsg rule listRule 'allow-rdp' — protocol TCP, destPort 3389, source Any, access Allow.
Recommendation
Remove the 0.0.0.0/0 RDP rule. Use Azure Bastion or just-in-time VM access, and restrict management ports to known admin IP ranges.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-data/providers/Microsoft.Storage/storageAccounts/contosopublicdataDescription
Storage account 'contosopublicdata' has allowBlobPublicAccess enabled and a container with an anonymous access level of 'container', allowing unauthenticated enumeration and download of all blobs.
Attack vector
Unauthenticated internet user lists and downloads blobs directly over HTTPS.
Risk
Exposure of any sensitive data stored in the public container; reconnaissance aid for further attacks.
Evidence
- az storage account showallowBlobPublicAccess = true.
- az storage container listContainer 'public-assets' has publicAccess = container.
Recommendation
Set allowBlobPublicAccess=false on the storage account and set every container's public access level to 'private'. Use SAS or Entra-authenticated access for legitimate sharing.
Control mapping
Resource
/tenants/00000000-0000-0000-0000-0000000000aa/directoryRoles/GlobalAdministratorDescription
Three accounts holding the Global Administrator role have no registered MFA method and are not covered by a Conditional Access policy requiring MFA.
Attack vector
Password-only access to tenant-wide admin; phishing or credential stuffing yields Global Admin.
Risk
Compromise of any one account grants full control of the Entra tenant and all subscriptions.
Evidence
- msgraph-sdk (az rest)3 of 4 Global Administrators have no strong auth method registered.
Recommendation
Enforce phishing-resistant MFA for all privileged roles via Conditional Access, and make the roles PIM-eligible rather than permanently active.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg-ai/providers/Microsoft.CognitiveServices/accounts/contoso-openaiDescription
The Azure OpenAI account 'contoso-openai' has publicNetworkAccess=Enabled with no IP restrictions, exposing the inference endpoint and any deployed models to the internet (key-based auth only).
Attack vector
If an API key leaks (e.g. in client code), the endpoint is directly callable from anywhere.
Risk
Model abuse, data exfiltration via prompts, and unbudgeted spend.
Evidence
- az cognitiveservices account showpublicNetworkAccess = Enabled; networkAcls default action = Allow.
Recommendation
Set publicNetworkAccess=Disabled and use a private endpoint, or restrict to known IP ranges. Prefer Entra ID (managed identity) auth over API keys and rotate keys.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-web-prod/providers/Microsoft.KeyVault/vaults/kv-web-prodDescription
Key Vault 'kv-web-prod' (the vault on the Critical attack path) has no diagnostic setting sending AuditEvent logs anywhere, so secret-read activity is invisible.
Attack vector
An attacker reading secrets through the managed identity leaves no audit trail.
Risk
The most dangerous step in the Critical chain is undetectable — exploitable AND invisible.
Evidence
- az monitor diagnostic-settings listNo diagnostic settings configured on kv-web-prod.
Recommendation
Add a diagnostic setting on the vault sending AuditEvent (and AllMetrics) to a Log Analytics workspace, and alert on anomalous secret reads.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-web-prod/providers/Microsoft.Web/sites/contoso-public-portalDescription
The public portal accepts TLS 1.0/1.1 and is not fronted by Azure Front Door or Application Gateway WAF.
Attack vector
Downgrade attacks and direct exploitation of the origin without a WAF inspection layer.
Risk
Weak transport security and no edge protection for the most-exposed app.
Evidence
- az webapp config showminTlsVersion = 1.0; no WAF resource associated.
Recommendation
Set minimum TLS to 1.2+, and place the app behind Front Door or App Gateway with WAF in Prevention mode.
Control mapping
Resource
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-web-prodDescription
Production resource groups have no CanNotDelete or ReadOnly locks, so a compromised or mistaken Contributor can delete production resources.
Attack vector
Destructive action (resource deletion) by any Contributor.
Risk
Availability impact; not a confidentiality issue on its own.
Evidence
- az lock listNo management locks found on rg-web-prod.
Recommendation
Apply CanNotDelete locks to production resource groups and critical resources.
Control mapping
Recommendations
Findings consolidated into prioritized, actionable remediations. Items flagged breaks attack path sever a modeled chain and are weighted higher.
Remove roleAssignments/write from the service principal (replace with PIM-eligible, time-bound assignment). Scope the managed identity's Key Vault access to only the secrets it needs and enable Key Vault RBAC with purge protection.
Replace the standing assignment with a least-privilege deployment role that excludes roleAssignments/write. If role assignment is required, gate it behind PIM with approval.
Remove the 0.0.0.0/0 RDP rule. Use Azure Bastion or just-in-time VM access, and restrict management ports to known admin IP ranges.
Set allowBlobPublicAccess=false on the storage account and set every container's public access level to 'private'. Use SAS or Entra-authenticated access for legitimate sharing.
Enforce phishing-resistant MFA for all privileged roles via Conditional Access, and make the roles PIM-eligible rather than permanently active.
Add a diagnostic setting on the vault sending AuditEvent (and AllMetrics) to a Log Analytics workspace, and alert on anomalous secret reads.
Set publicNetworkAccess=Disabled and use a private endpoint, or restrict to known IP ranges. Prefer Entra ID (managed identity) auth over API keys and rotate keys.
Set minimum TLS to 1.2+, and place the app behind Front Door or App Gateway with WAF in Prevention mode.
Apply CanNotDelete locks to production resource groups and critical resources.
Resources & Scope
Assets referenced by findings, deduplicated and ranked by worst observed severity, with a roll-up of in-scope tenants and subscriptions.
Microsoft.Web/sites1Microsoft.Authorization/roleAssignments1Microsoft.Network/networkSecurityGroups1Microsoft.Storage/storageAccounts1tenant/directoryRoles1Microsoft.CognitiveServices/accounts1Microsoft.KeyVault/vaults1resourceGroups1| Severity | Asset | Type | Scope | Findings |
|---|---|---|---|---|
| Critical | contoso-public-portal | Microsoft.Web/sites |
00000000-0000-0000-0000-000000000000 | |
| High | sp-deploy-prod | Microsoft.Authorization/roleAssignments |
00000000-0000-0000-0000-000000000000 | |
| High | nsg-jumpbox | Microsoft.Network/networkSecurityGroups |
00000000-0000-0000-0000-000000000000 | |
| High | contosopublicdata | Microsoft.Storage/storageAccounts |
00000000-0000-0000-0000-000000000000 | |
| High | GlobalAdministrator | tenant/directoryRoles |
tenant:00000000-0000-0000-0000-0000000000aa | |
| Medium | contoso-openai | Microsoft.CognitiveServices/accounts |
00000000-0000-0000-0000-000000000001 | |
| Medium | kv-web-prod | Microsoft.KeyVault/vaults |
00000000-0000-0000-0000-000000000000 | |
| Informational | rg-web-prod | resourceGroups |
00000000-0000-0000-0000-000000000000 |
Consolidated Attack Graph
All modeled attack paths merged into a single graph. Shared assets are deduplicated so cross-path pivots are visible at a glance.
Appendix A · Coverage & Controls
Finding distribution across security domains and the control frameworks referenced by the findings.
| Domain | Findings | Crit | High | Medi | Low | Info |
|---|---|---|---|---|---|---|
| AI | 1 | · | · | 1 | · | · |
| Attack Path | 1 | 1 | · | · | · | · |
| Governance | 1 | · | · | · | · | 1 |
| Identity | 1 | · | 1 | · | · | · |
| Logging | 1 | · | · | 1 | · | · |
| Network | 1 | · | 1 | · | · | · |
| RBAC | 1 | · | 1 | · | · | · |
| Storage | 1 | · | 1 | · | · | · |
| Web | 1 | · | · | · | 1 | · |
MITRE ATT&CK
CIS Azure
Defender for Cloud
NIST 800-53
Appendix B · Methodology & Limitations
This assessment was produced by a coordinated team of read-only Azure security agents. Each agent specializes in a domain (identity, network, storage, RBAC, logging, AI, web, and governance) and contributes structured findings to a shared evidence model. An orchestrator deduplicates overlapping observations and an attack-path analyst correlates findings into multi-step chains.
Scope
Only resources and configurations represented in the supplied findings dataset are in scope. Tenants and subscriptions listed on the cover define the engagement boundary.
Approach
The methodology is read-only and evidence-driven: configuration and posture are evaluated against documented control baselines and known attack techniques. No exploitation, write operations, or live credential use is performed, and no exploit payloads are included.
Limitations
Absence of a finding is not proof of security; it reflects only what was evaluated with the supplied inputs. Severity and confidence are analytical judgments. Attack paths are models intended to prioritize remediation, not guarantees of exploitability. Findings should be validated against the live environment before remediation is finalized.
Appendix C · About This Report
This document is a self-contained HTML report. It loads no external scripts, styles, fonts, or network resources, and is safe to open offline or archive as evidence. Use Print / Save PDF to produce a paginated copy.
| Generated | 2026-06-10T13:20:06.614Z |
| Generator version | 2.0.0 |
| Findings | 9 |
| Attack paths | 2 (1 modeled, 1 derived) |