
Aviso de seguridad: Azure APIM Developer Portal permite el registro de cuentas entre inquilinos al eludir las restricciones de registro de la interfaz de usuario. Reportado a MSRC dos veces - cerrado como «por diseño».
Estado (01.12.2025): Esta vulnerabilidad sigue activa y explotable. Microsoft no ha corregido este problema y lo considera «por diseño».
Una vulnerabilidad de seguridad en el portal para desarrolladores de Azure API Management (APIM) permite a los atacantes registrar cuentas en cualquier instancia de APIM que tenga habilitada la autenticación básica, incluso cuando los administradores han deshabilitado el registro de usuarios en la interfaz del portal.
Este bypass permite la creación de cuentas entre inquilinos, lo que potencialmente permite el acceso no autorizado a la documentación de las API, las claves de suscripción y otros recursos expuestos a través del portal para desarrolladores.
| Fecha | Acción |
|---|---|
| 2025-09-30 | Vulnerabilidad descubierta |
| 2025-09-30 | Informe inicial enviado a MSRC |
| 2025-10-30 | Respuesta de MSRC: cerrado como «no es una vulnerabilidad» |
| 2025-11-01 | Segundo informe enviado a MSRC con detalles adicionales |
| 2025-11-20 | Respuesta de MSRC: cerrado como «por diseño» |
| 2025-11-20 | Notificado a CERT-FI |
| 2025-11-26 | Divulgación pública |
| 2025-11-27 | CVE solicitado a MITRE |
| 2026-07-09 | CVE-2025-66390 asignado por MITRE TL-Root/CNA-LR |
Cuando Azure APIM está configurado con autenticación básica para el portal para desarrolladores, los administradores pueden deshabilitar el registro de usuarios a través de la interfaz de Azure Portal. Sin embargo, esto solo oculta el formulario de registro en la interfaz del portal.
El endpoint subyacente de la API de registro permanece activo y acepta solicitudes de registro directamente, omitiendo por completo la restricción de la interfaz.
Dos problemas se combinan para crear esta vulnerabilidad:
El ataque requiere dos instancias de APIM:
Pasos:
Host de su instancia a la instancia objetivoDetalle técnico clave: el bypass entre inquilinos funciona manipulando la cabecera Host en la solicitud POST de registro. El endpoint /signup procesa las solicitudes basándose en la cabecera Host sin validar los límites entre inquilinos.
Ejemplo de manipulación de solicitud:
POST /signup HTTP/1.1
Host: target-apim.developer.azure-api.net <-- Changed from attacker's instance
Origin: https://attacker-apim.developer.azure-api.net
Content-Type: application/json
{"challenge":{...},"signupData":{"email":"[email protected]",...}}
El problema principal: deshabilitar el registro en la interfaz no deshabilita la API subyacente. El endpoint de la API acepta solicitudes entre inquilinos basándose en la cabecera Host.
Tu instancia de APIM es vulnerable si:
Tu instancia de APIM NO es vulnerable si:
Punto clave: deshabilitar el registro en la interfaz de Azure Portal NO es suficiente. El proveedor de identidad de autenticación básica debe eliminarse por completo para prevenir el bypass de registro entre inquilinos.
Usa estos valores de propiedad para identificar instancias de APIM vulnerables mediante Azure Resource Graph, plantillas ARM o Azure Policy.
| Ruta de la propiedad | Valor vulnerable | Descripción |
|---|---|---|
properties.developerPortalStatus | Enabled | El portal para desarrolladores es accesible |
sku.name | Developer, Basic, Standard, Premium | Niveles que no son de consumo (el nivel de consumo tiene funciones limitadas del portal) |
El proveedor de identidad de autenticación básica es un recurso independiente dentro de la instancia de APIM:
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
Vulnerable si existe: la presencia de un recurso de proveedor de identidad basic indica que la autenticación básica está configurada.
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| Propiedad | Valor | Significado |
|---|---|---|
properties.enabled | true | Registro visible en la interfaz |
properties.enabled | false | Registro oculto en la interfaz (¡la API sigue funcionando si existe autenticación básica!) |
Usa esta consulta para encontrar instancias de APIM potencialmente vulnerables:
resources
| where type == "microsoft.apimanagement/service"
| where properties.developerPortalStatus == "Enabled"
| where sku.name != "Consumption"
| project name, resourceGroup, subscriptionId, location, sku.name, properties.developerPortalStatus
Para comprobar los proveedores de identidad de autenticación básica:
resources
| where type == "microsoft.apimanagement/service/identityproviders"
| where name endswith "/basic"
| project apimInstance=tostring(split(id, "/providers/Microsoft.ApiManagement/service/")[1]), resourceGroup, subscriptionId