
Сообщение о безопасности: Портал разработчика Azure APIM позволяет регистрацию учетных записей между арендаторами, обходя ограничения регистрации в пользовательском интерфейсе. Дважды сообщалось в MSRC — закрыто как «по замыслу».
Статус (01.12.2025): Эта уязвимость по-прежнему активна и эксплуатируема. Microsoft не исправила эту проблему и считает её «предусмотренной конструкцией».
Уязвимость безопасности на портале разработчика Azure API Management (APIM) позволяет злоумышленникам регистрировать учетные записи на любом экземпляре APIM, где включена базовая аутентификация, даже если администраторы отключили регистрацию пользователей в пользовательском интерфейсе портала.
Этот обход позволяет создавать учетные записи между арендаторами, что может привести к несанкционированному доступу к документации API, ключам подписки и другим ресурсам, доступным через портал разработчика.
| Дата | Действие |
|---|---|
| 2025-09-30 | Уязвимость обнаружена |
| 2025-09-30 | Первоначальный отчет отправлен в MSRC |
| 2025-10-30 | Ответ MSRC: закрыто как «не уязвимость» |
| 2025-11-01 | Второй отчет отправлен в MSRC с дополнительными деталями |
| 2025-11-20 | Ответ MSRC: закрыто как «предусмотрено конструкцией» |
| 2025-11-20 | Сообщено в CERT-FI |
| 2025-11-26 | Публичное раскрытие |
| 2025-11-27 | Запрошен CVE у MITRE |
| 2026-07-09 | CVE-2025-66390 назначен MITRE TL-Root/CNA-LR |
Когда Azure APIM настроен с базовой аутентификацией для портала разработчика, администраторы могут отключить регистрацию пользователей через пользовательский интерфейс портала Azure. Однако это только скрывает форму регистрации в интерфейсе портала.
Соответствующая конечная точка API регистрации остается активной и принимает запросы на регистрацию напрямую, полностью обходя ограничение, установленное в пользовательском интерфейсе.
Две проблемы вместе создают эту уязвимость:
Для атаки требуется два экземпляра APIM:
Шаги:
Host со своего экземпляра на целевойКлючевая техническая деталь: Обход между арендаторами осуществляется путем манипуляции заголовком Host в POST-запросе на регистрацию. Конечная точка /signup обрабатывает запросы на основе заголовка Host без проверки границ арендатора.
Пример манипуляции запросом:
POST /signup HTTP/1.1
Host: target-apim.developer.azure-api.net <-- Изменено с экземпляра злоумышленника
Origin: https://attacker-apim.developer.azure-api.net
Content-Type: application/json
{"challenge":{...},"signupData":{"email":"[email protected]",...}}
Основная проблема: отключение регистрации в пользовательском интерфейсе НЕ отключает соответствующий API. Конечная точка API принимает запросы между арендаторами на основе заголовка Host.
Ваш экземпляр APIM уязвим, если:
Ваш экземпляр APIM НЕ уязвим, если:
Ключевой момент: Отключение регистрации в пользовательском интерфейсе портала Azure НЕДОСТАТОЧНО. Для предотвращения обхода регистрации между арендаторами поставщик удостоверений для базовой аутентификации должен быть полностью удален.
Используйте эти значения свойств для идентификации уязвимых экземпляров APIM через Azure Resource Graph, шаблоны ARM или Azure Policy.
| Путь к свойству | Уязвимое значение | Описание |
|---|---|---|
properties.developerPortalStatus | Enabled | Портал разработчика доступен |
sku.name | Developer, Basic, Standard, Premium | Уровни, отличные от Consumption (уровень Consumption имеет ограниченные функции портала) |
Поставщик удостоверений для базовой аутентификации является отдельным ресурсом в экземпляре APIM:
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
Уязвим, если существует: Наличие ресурса поставщика удостоверений basic указывает, что базовая аутентификация настроена.
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| Свойство | Значение | Значение |
|---|---|---|
properties.enabled | true | Регистрация видна в пользовательском интерфейсе |
properties.enabled | false | Регистрация скрыта в пользовательском интерфейсе (API всё ещё работает, если существует базовая аутентификация!) |
Используйте этот запрос для поиска потенциально уязвимых экземпляров APIM:
resources
| where type == "microsoft.apimanagement/service"
| where properties.developerPortalStatus == "Enabled"
| where sku.name != "Consumption"
| project name, resourceGroup, subscriptionId, location, sku.name, properties.developerPortalStatus
Для проверки поставщиков удостоверений с базовой аутентификацией:
resources
| where type == "microsoft.apimanagement/service/identityproviders"
| where name endswith "/basic"
| project apimInstance=tostring(split(id, "/providers/Microsoft.ApiManagement/service/")[1]), resourceGroup, subscriptionId
Проверка статуса портала разработчика:
az apim show --name <apim-name> --resource-group <rg-name> --query "{name:name, portalStatus:developerPortalStatus, sku:sku.name}"
Список поставщиков удостоверений (проверьте наличие 'basic'):
az apim identity-provider list --resource-group <rg-name> --service-name <apim-name> --query "[].name"