
セキュリティアドバイザリ: Azure APIM Developer Portal は、UI のサインアップ制限をバイパスすることで、クロステナントのアカウント登録を許可します。MSRC に2回報告されましたが、「by design」としてクローズされました。
ステータス (2025年12月1日): この脆弱性は現在も有効であり、悪用可能です。Microsoft はこの問題を修正しておらず、「仕様 (by design)」と見なしています。
Azure API Management (APIM) Developer Portal のセキュリティ脆弱性により、管理者がポータル UI でユーザー登録を無効にしている場合でも、Basic 認証が有効になっている任意の APIM インスタンスに攻撃者がアカウントを登録できます。
このバイパスによりクロステナントでのアカウント作成が可能になり、開発者ポータルを通じて公開されている API ドキュメント、サブスクリプションキー、その他のリソースへの不正アクセスにつながる可能性があります。
| 日付 | 対応 |
|---|---|
| 2025-09-30 | 脆弱性を発見 |
| 2025-09-30 | MSRC に初回レポートを提出 |
| 2025-10-30 | MSRC の応答:「脆弱性ではない」としてクローズ |
| 2025-11-01 | 追加情報を添えて MSRC に 2 回目のレポートを提出 |
| 2025-11-20 | MSRC の応答:「仕様 (by design)」としてクローズ |
| 2025-11-20 | CERT-FI に報告 |
| 2025-11-26 | 公開開示 |
| 2025-11-27 | MITRE に CVE を申請 |
| 2026-07-09 | MITRE TL-Root/CNA-LR により CVE-2025-66390 が割り当て |
Azure APIM が開発者ポータル用に Basic 認証で構成されている場合、管理者は Azure Portal UI からユーザー登録を無効化できます。しかし、これはポータルインターフェースで登録フォームを非表示にしているだけです。
基盤となる登録 API エンドポイントはアクティブなまま残り、登録リクエストを直接受け付けるため、UI の制限を完全にバイパスします。
次の 2 つの問題が組み合わさってこの脆弱性が生じます。
この攻撃には 2 つの APIM インスタンスが必要です。
手順:
Host ヘッダーを自身のインスタンスから対象インスタンスに変更します主要な技術的詳細: クロステナントバイパスは、登録 POST リクエストの Host ヘッダーを操作することで機能します。/signup エンドポイントはテナント境界を検証せず、Host ヘッダーに基づいてリクエストを処理します。
リクエスト操作の例:
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]",...}}
核心的な問題: UI で登録を無効化しても、基盤となる API は無効化されません。API エンドポイントは Host ヘッダーに基づいてクロステナントのリクエストを受け入れます。
次の場合、APIM インスタンスは脆弱です:
次の場合、APIM インスタンスは脆弱ではありません:
重要なポイント: Azure Portal UI で登録を無効化するだけでは不十分です。クロステナント登録バイパスを防ぐには、Basic 認証 ID プロバイダーを完全に削除する必要があります。
これらのプロパティ値を使用して、Azure Resource Graph、ARM テンプレート、または Azure Policy で脆弱な APIM インスタンスを特定できます。
| プロパティパス | 脆弱な値 |
|---|
Basic 認証 ID プロバイダーは、APIM インスタンス配下の独立したリソースです:
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
存在する場合は脆弱: basic ID プロバイダーリソースが存在することは、Basic 認証が構成されていることを示します。
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| プロパティ | 値 | 意味 |
|---|---|---|
properties.enabled | true | UI で登録が表示される |
properties.enabled | false | UI で登録が非表示 (Basic 認証が存在する場合、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
Basic 認証 ID プロバイダーを確認するには:
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}"
ID プロバイダーの一覧を取得する ('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 インスタンスを特定し保護する目的のみで提供されます。コンピューターシステムへの不正アクセスは違法です。所有しているシステム、または明示的な書面によるテスト許可を得たシステムのみをテストしてください。
Basic 認証の登録があるポータルを検索 (脆弱性の可能性が最も高い):
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"
サインインページがあるポータルを検索 (Basic 認証が構成されている可能性を示す):
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 でスキャンします:
# Save targets to file
echo "https://target1.developer.azure-api.net" > targets.txt
echo "https://target2.developer.azure-api.net" >> targets.txt
# Mass scan
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt -o vulnerable.txt
組織が Azure APIM を使用している場合、次の方法で自社のインスタンスを特定できます:
Azure Portal:
Azure CLI (ご自身のサブスクリプション用):
# List all APIM instances in your subscriptions
az apim list --query "[].{name:name, resourceGroup:resourceGroup, url:developerPortalUrl}"
次の方法を使用して、ご自身の組織の APIM インスタンスが脆弱かどうかを確認します:
検証スクリプトの使用:
# Check your own instance
python apim_vuln_checker.py https://YOUR-ORG.developer.azure-api.net
# With Azure RM property checks (recommended for internal audits)
python apim_vuln_checker.py --azure -s YOUR-SUB-ID -g YOUR-RG -n YOUR-APIM-NAME
内部セキュリティ監査での Nuclei の使用:
# Scan your organization's APIM instances
nuclei -t azure-apim-signup-bypass.yaml -u https://YOUR-ORG.developer.azure-api.net
自社インスタンスを監査する際は、次の点に注意してください:
脆弱ではない兆候:
セキュリティ専門家として許可を得たテストを実施する場合:
脆弱な第三者機関の APIM インスタンスを発見した場合:
APIM インスタンスが脆弱かどうかを確認するための Python スクリプトが提供されています。
# Basic installation (HTTP probe only)
pip install requests colorama
# Full installation (includes Azure RM property checks)
pip install requests colorama azure-identity
スクリプトは 2 つのモードをサポートしています:
# HTTP probe (external check)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net
# Azure RM property check (requires az login)
python apim_vuln_checker.py --azure -s <subscription-id> -g <resource-group> -n <apim-name>
# Combined check (both HTTP probe and Azure RM)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net \
--azure -s <subscription-id> -g <resource-group> -n <apim-name>
# Verbose output
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -v
# Skip SSL verification
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -k
# JSON output
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 ___ __ ____
/ _ )___ __ _____ / /___ ____ __ / __ \__ __
/ _ / _ \/ // / _ \/ __/ // / // / / /_/ / // /
/____/\___/\_,_/_//_/\__/\_, /\_, / \____/\_, /
/___//___/ /___/
Author: Mihalis Haatainen, Bountyy Oy - www.bountyy.fi
======================================================================
Azure APIM Vulnerability Checker
Cross-Tenant Signup Bypass Detection
======================================================================
[?] Checking signup endpoint accessibility...
[i] Signup endpoint is accessible
[?] Checking if Basic Auth signup API is accessible...
[!] Basic Auth signup API ACTIVE (captcha validation)
[?] Checking if signup is hidden/disabled in UI...
[i] Signup page returns 404 (hidden in UI)
======================================================================
VULNERABILITY ASSESSMENT RESULTS
======================================================================
Target: https://example.developer.azure-api.net
Risk Level: CRITICAL - VULNERABLE TO SIGNUP BYPASS
Detailed Checks:
[!] signup_ui: Signup endpoint is accessible
[!] basic_auth_api: Basic Auth signup API ACTIVE (captcha validation)
[+] signup_ui_hidden: Signup page returns 404 (hidden in UI)
Recommendations:
CRITICAL: SIGNUP BYPASS VULNERABILITY CONFIRMED
The Basic Auth signup API is accessible even though UI hides signup.
Attackers can register accounts by calling the API directly.
Immediate actions:
1. DISABLE Basic Authentication in Azure Portal immediately
2. Audit all developer portal user accounts for unauthorized signups
3. Review user creation logs - check for API-based registrations
4. Implement Azure AD authentication only
自動スキャン用の Nuclei テンプレートが提供されています。
# Single target
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net
# Multiple targets from file
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt
# With proxy (for debugging)
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -proxy http://127.0.0.1:8080
# Skip SSL verification
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -insecure
/signup エンドポイントに POST リクエストとして送信するMicrosoft Security Response Center (MSRC) には、この脆弱性について 2 回通知されました。両方のレポートは次の判断でクローズされました:
「仕様 (By design)」
MSRC は、管理者制御のバイパスとクロステナントへの影響にもかかわらず、これをセキュリティ脆弱性とは見なしていません。
apim_vuln_checker.py - Python 製の脆弱性検証スクリプトazure-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' |
| Consumption 以外の SKU | sku.name | != 'Consumption' |
| Basic 認証が存在 | identityProviders/basic リソース | リソースが存在する |
| 登録が非表示 (バイパス可能) | portalsettings/signup.properties.enabled | == false (Basic 認証あり) |
properties.developerPortalStatus | == 'Enabled' |
sku.name | != 'Consumption' |
identityProviders/basic リソース | 存在する |
portalsettings/signup.properties.enabled | == false |