
Сообщение о безопасности: Портал разработчика 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.
Поставщик удостоверений для базовой аутентификации является отдельным ресурсом в экземпляре 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"
Проверка настроек регистрации:
az rest --method get --url "https://management.azure.com/subscriptions/<sub-id>/resourceGroups/<rg-name>/providers/Microsoft.ApiManagement/service/<apim-name>/portalsettings/signup?api-version=2022-08-01" --query "properties.enabled"
Критическая комбинация: Экземпляр уязвим для обхода регистрации, когда:
properties.developerPortalStatus == 'Enabled' ИidentityProviders/basic существует Иportalsettings/signup.properties.enabled == falseЮРИДИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ: Информация ниже предоставлена исключительно для идентификации и защиты собственных экземпляров Azure APIM вашей организации. Несанкционированный доступ к компьютерным системам является незаконным. Проверяйте только те системы, которые вам принадлежат или на которые у вас есть явное письменное разрешение.
Поиск порталов с регистрацией через базовую аутентификацию (наиболее вероятно уязвимы):
site:developer.azure-api.net "Sign up" "Email" "Password"
site:developer.azure-api.net "Create account" "Username"
site:developer.azure-api.net inurl:/signup "register"
Поиск порталов со страницами входа (указывает, что базовая аутентификация может быть настроена):
site:developer.azure-api.net "Sign in" "Email" "Password" -"Azure AD" -"Microsoft account"
site:developer.azure-api.net inurl:/signin "password"
Поиск порталов разработчика с открытой документацией API:
site:developer.azure-api.net inurl:/apis "Subscribe"
site:developer.azure-api.net "API" "Products" "Subscribe"
Общий поиск:
site:*.developer.azure-api.net
inurl:developer.azure-api.net "Developer Portal"
Поиск порталов разработчика APIM:
http.title:"Developer Portal" http.html:"azure-api.net"
ssl.cert.subject.cn:"*.developer.azure-api.net"
http.html:"developerPortal" http.html:"azure"
После обнаружения целей выполните сканирование с Nuclei:
# Сохраните цели в файл
echo "https://target1.developer.azure-api.net" > targets.txt
echo "https://target2.developer.azure-api.net" >> targets.txt
# Массовое сканирование
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt -o vulnerable.txt
Если ваша организация использует Azure APIM, вы можете идентифицировать свои собственные экземпляры, используя:
Портал Azure:
Azure CLI (для ваших подписок):
# Список всех экземпляров APIM в ваших подписках
az apim list --query "[].{name:name, resourceGroup:resourceGroup, url:developerPortalUrl}"
Используйте эти методы, чтобы проверить, уязвимы ли экземпляры APIM ВАШЕЙ организации:
Использование скрипта проверки:
# Проверка вашего собственного экземпляра
python apim_vuln_checker.py https://YOUR-ORG.developer.azure-api.net
# С проверкой свойств Azure RM (рекомендуется для внутренних аудитов)
python apim_vuln_checker.py --azure -s YOUR-SUB-ID -g YOUR-RG -n YOUR-APIM-NAME
Использование Nuclei для внутренних проверок безопасности:
# Сканирование экземпляров APIM вашей организации
nuclei -t azure-apim-signup-bypass.yaml -u https://YOUR-ORG.developer.azure-api.net
При аудите своих собственных экземпляров ищите:
Признаки НЕуязвимости:
Если вы специалист по безопасности, проводящий авторизованное тестирование:
Если вы обнаружили уязвимый экземпляр APIM третьей стороны:
Предоставлен скрипт на Python для проверки, является ли ваш экземпляр APIM уязвимым.
# Базовая установка (только HTTP-проверка)
pip install requests colorama
# Полная установка (включает проверку свойств Azure RM)
pip install requests colorama azure-identity
Скрипт поддерживает два режима:
# HTTP-проверка (внешняя)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net
# Проверка свойств Azure RM (требуется az login)
python apim_vuln_checker.py --azure -s <subscription-id> -g <resource-group> -n <apim-name>
# Комбинированная проверка (HTTP и Azure RM)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net \
--azure -s <subscription-id> -g <resource-group> -n <apim-name>
# Подробный вывод
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -v
# Пропустить проверку SSL
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -k
# Вывод в JSON
python apim_vuln_checker.py https://your-apim.developer.azure-api.net --json
При использовании режима --azure скрипт напрямую запрашивает Azure Resource Manager API для проверки:
| Свойство |
|---|
Предварительные требования для режима Azure RM:
azure-identity: pip install azure-identityaz login ___ __ ____
/ _ )___ __ _____ / /___ ____ __ / __ \__ __
/ _ / _ \/ // / _ \/ __/ // / // / / /_/ / // /
/____/\___/\_,_/_//_/\__/\_, /\_, / \____/\_, /
/___//___/ /___/
Автор: Mihalis Haatainen, Bountyy Oy - www.bountyy.fi
======================================================================
Azure APIM Vulnerability Checker
Обнаружение обхода регистрации между арендаторами
======================================================================
[?] Проверка доступности конечной точки регистрации...
[i] Конечная точка регистрации доступна
[?] Проверка доступности API регистрации базовой аутентификации...
[!] API регистрации базовой аутентификации АКТИВЕН (проверка captcha)
[?] Проверка, скрыта/отключена ли регистрация в пользовательском интерфейсе...
[i] Страница регистрации возвращает 404 (скрыта в пользовательском интерфейсе)
======================================================================
РЕЗУЛЬТАТЫ ОЦЕНКИ УЯЗВИМОСТИ
======================================================================
Цель: https://example.developer.azure-api.net
Уровень риска: КРИТИЧЕСКИЙ — УЯЗВИМО ДЛЯ ОБХОДА РЕГИСТРАЦИИ
Подробные проверки:
[!] signup_ui: Конечная точка регистрации доступна
[!] basic_auth_api: API регистрации базовой аутентификации АКТИВЕН (проверка captcha)
[+] signup_ui_hidden: Страница регистрации возвращает 404 (скрыта в пользовательском интерфейсе)
Рекомендации:
КРИТИЧЕСКО: ПОДТВЕРЖДЕНА УЯЗВИМОСТЬ ОБХОДА РЕГИСТРАЦИИ
API регистрации базовой аутентификации доступен, даже если пользовательский интерфейс скрывает регистрацию.
Злоумышленники могут регистрировать учетные записи, напрямую вызывая API.
Немедленные действия:
1. ОТКЛЮЧИТЕ базовую аутентификацию на портале Azure немедленно
2. Проверьте все учетные записи пользователей портала разработчика на предмет несанкционированных регистраций
3. Просмотрите журналы создания пользователей — проверьте регистрации на основе API
4. Внедрите аутентификацию только через Azure AD
Предоставлен шаблон Nuclei для автоматизированного сканирования.
# Одиночная цель
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net
# Несколько целей из файла
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt
# С прокси (для отладки)
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -proxy http://127.0.0.1:8080
# Пропустить проверку SSL
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -insecure
/signup с тестовыми данными captchaЦентр реагирования на угрозы безопасности Microsoft (MSRC) был уведомлен дважды об этой уязвимости. Оба отчета были закрыты со следующим заключением:
«Предусмотрено конструкцией»
MSRC не считает это уязвимостью безопасности, несмотря на обход административных ограничений и последствия для разных арендаторов.
apim_vuln_checker.py — скрипт проверки уязвимости на Pythonazure-apim-signup-bypass.yaml — шаблон Nuclei для автоматического сканированияREADME.md — данный файлMihalis Haatainen
Bountyy Oy — финская компания, занимающаяся тестированием на проникновение и исследованиями в области безопасности
Данное уведомление и связанные инструменты выпущены для защитных целей. Используйте ответственно.
Лицензия MIT — см. файл LICENSE для подробностей.
| Путь к свойству | Уязвимое значение | Описание |
|---|
properties.developerPortalStatus | Enabled | Портал разработчика доступен |
sku.name | Developer, Basic, Standard, Premium | Уровни, отличные от Consumption (уровень Consumption имеет ограниченные функции портала) |
| Условие | Свойство/Ресурс | Уязвимое значение |
|---|
| Портал включен | properties.developerPortalStatus | == 'Enabled' |
| SKU, отличный от Consumption | sku.name | != 'Consumption' |
| Существует базовая аутентификация | ресурс identityProviders/basic | Ресурс существует |
| Регистрация скрыта (возможен обход) | portalsettings/signup.properties.enabled | == false (с базовой аутентификацией) |
| Уязвимое значение |
|---|
properties.developerPortalStatus | == 'Enabled' |
sku.name | != 'Consumption' |
ресурс identityProviders/basic | Существует |
portalsettings/signup.properties.enabled | == false |