
Avis de sécurité : le portail développeur Azure APIM permet l'enregistrement de comptes entre locataires en contournant les restrictions d'inscription de l'interface utilisateur. Signalé deux fois à MSRC - fermé comme 'by design'.
Statut (01.12.2025) : Cette vulnérabilité est toujours active et exploitable. Microsoft n'a pas corrigé ce problème et le considère comme « by design ».
Une vulnérabilité de sécurité dans le portail développeur d'Azure API Management (APIM) permet à des attaquants de créer des comptes sur n'importe quelle instance APIM qui a l'authentification de base activée, même lorsque les administrateurs ont désactivé l'inscription des utilisateurs dans l'interface utilisateur du portail.
Ce contournement permet la création de comptes inter-locataires, pouvant potentiellement autoriser un accès non autorisé à la documentation des API, aux clés d'abonnement et à d'autres ressources exposées via le portail développeur.
| Date | Action |
|---|---|
| 2025-09-30 | Vulnérabilité découverte |
| 2025-09-30 | Premier rapport soumis à MSRC |
| 2025-10-30 | Réponse MSRC : Fermé comme « pas une vulnérabilité » |
| 2025-11-01 | Deuxième rapport soumis à MSRC avec détails supplémentaires |
| 2025-11-20 | Réponse MSRC : Fermé comme « by design » |
| 2025-11-20 | Signalé à CERT-FI |
| 2025-11-26 | Divulgation publique |
| 2025-11-27 | CVE demandé auprès de MITRE |
| 2026-07-09 | CVE-2025-66390 attribué par MITRE TL-Root/CNA-LR |
Lorsque Azure APIM est configuré avec l'authentification de base pour le portail développeur, les administrateurs peuvent désactiver l'enregistrement des utilisateurs via l'interface utilisateur du portail Azure. Cependant, cela ne fait que masquer le formulaire d'inscription dans l'interface du portail.
Le point de terminaison API d'inscription sous-jacent reste actif et accepte les demandes d'enregistrement directement, contournant ainsi entièrement la restriction de l'interface utilisateur.
Deux problèmes se combinent pour créer cette vulnérabilité :
L'attaque nécessite deux instances APIM :
Étapes :
Host de son instance vers l'instance cibleDétail technique clé : Le contournement inter-locataire fonctionne en manipulant l'en-tête Host dans la demande POST d'inscription. Le point de terminaison /signup traite les demandes en fonction de l'en-tête Host sans valider les limites du locataire.
Exemple de manipulation de demande :
POST /signup HTTP/1.1
Host: target-apim.developer.azure-api.net <-- Changé depuis l'instance de l'attaquant
Origin: https://attacker-apim.developer.azure-api.net
Content-Type: application/json
{"challenge":{...},"signupData":{"email":"[email protected]",...}}
Le problème principal : désactiver l'inscription dans l'interface utilisateur ne désactive pas l'API sous-jacente. Le point de terminaison API accepte les demandes inter-locataires en fonction de l'en-tête Host.
Votre instance APIM est vulnérable si :
Votre instance APIM n'est PAS vulnérable si :
Point clé : Désactiver l'inscription dans l'interface utilisateur du portail Azure n'est PAS suffisant. Le fournisseur d'identité Authentification de base doit être complètement supprimé pour empêcher le contournement de l'inscription inter-locataire.
Utilisez ces valeurs de propriété pour identifier les instances APIM vulnérables via Azure Resource Graph, les modèles ARM ou Azure Policy.
Le fournisseur d'identité Authentification de base est une ressource distincte sous l'instance APIM :
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
Vulnérable si existe : La présence d'une ressource de fournisseur d'identité basic indique que l'authentification de base est configurée.
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| Propriété | Valeur | Signification |
|---|---|---|
properties.enabled | true | Inscription visible dans l'interface utilisateur |
properties.enabled | false | Inscription masquée dans l'interface utilisateur (l'API fonctionne toujours si Auth de base existe !) |
Utilisez cette requête pour trouver les instances APIM potentiellement vulnérables :
resources
| where type == "microsoft.apimanagement/service"
| where properties.developerPortalStatus == "Enabled"
| where sku.name != "Consumption"
| project name, resourceGroup, subscriptionId, location, sku.name, properties.developerPortalStatus
Pour vérifier les fournisseurs d'identité Auth de base :
resources
| where type == "microsoft.apimanagement/service/identityproviders"
| where name endswith "/basic"
| project apimInstance=tostring(split(id, "/providers/Microsoft.ApiManagement/service/")[1]), resourceGroup, subscriptionId
Vérifier l'état du portail développeur :
az apim show --name <apim-name> --resource-group <rg-name> --query "{name:name, portalStatus:developerPortalStatus, sku:sku.name}"
Lister les fournisseurs d'identité (vérifier 'basic') :
az apim identity-provider list --resource-group <rg-name> --service-name <apim-name> --query "[].name"
Vérifier les paramètres d'inscription :
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"
Combinaison critique : Une instance est vulnérable au contournement d'inscription lorsque :
properties.developerPortalStatus == 'Enabled' ETidentityProviders/basic existe ETportalsettings/signup.properties.enabled == falseAVERTISSEMENT JURIDIQUE : Les informations ci-dessous sont fournies uniquement pour identifier et sécuriser les instances Azure APIM de votre propre organisation. L'accès non autorisé à des systèmes informatiques est illégal. Testez uniquement les systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite.
Trouver les portails avec inscription Auth de base (probablement les plus vulnérables) :
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"
Trouver les portails avec pages de connexion (indique que l'Auth de base peut être configurée) :
site:developer.azure-api.net "Sign in" "Email" "Password" -"Azure AD" -"Microsoft account"
site:developer.azure-api.net inurl:/signin "password"
Trouver les portails développeur avec documentation API exposée :
site:developer.azure-api.net inurl:/apis "Subscribe"
site:developer.azure-api.net "API" "Products" "Subscribe"
Découverte générale :
site:*.developer.azure-api.net
inurl:developer.azure-api.net "Developer Portal"
Trouver les portails développeur APIM :
http.title:"Developer Portal" http.html:"azure-api.net"
ssl.cert.subject.cn:"*.developer.azure-api.net"
http.html:"developerPortal" http.html:"azure"
Après avoir découvert les cibles, scannez avec Nuclei :
# Enregistrer les cibles dans un fichier
echo "https://target1.developer.azure-api.net" > targets.txt
echo "https://target2.developer.azure-api.net" >> targets.txt
# Scan de masse
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt -o vulnerable.txt
Si votre organisation utilise Azure APIM, vous pouvez identifier vos propres instances en utilisant :
Portail Azure :
Azure CLI (pour vos abonnements) :
# Lister toutes les instances APIM dans vos abonnements
az apim list --query "[].{name:name, resourceGroup:resourceGroup, url:developerPortalUrl}"
Utilisez ces méthodes pour vérifier si les instances APIM de VOTRE organisation sont vulnérables :
En utilisant le script de vérification :
# Vérifier votre propre instance
python apim_vuln_checker.py https://VOTRE-ORG.developer.azure-api.net
# Avec les vérifications des propriétés Azure RM (recommandé pour les audits internes)
python apim_vuln_checker.py --azure -s VOTRE-ID-ABONNEMENT -g VOTRE-GR -n VOTRE-NOM-APIM
En utilisant Nuclei pour les audits de sécurité internes :
# Scanner les instances APIM de votre organisation
nuclei -t azure-apim-signup-bypass.yaml -u https://VOTRE-ORG.developer.azure-api.net
Lors de l'audit de vos propres instances, recherchez :
Indicateurs NON vulnérables :
Si vous êtes un professionnel de la sécurité effectuant des tests autorisés :
Si vous découvrez une instance APIM tierce vulnérable :
Un script Python est fourni pour vérifier si votre instance APIM est vulnérable.
# Installation de base (sonde HTTP uniquement)
pip install requests colorama
# Installation complète (inclut les vérifications des propriétés Azure RM)
pip install requests colorama azure-identity
Le script prend en charge deux modes :
# Sonde HTTP (vérification externe)
python apim_vuln_checker.py https://votre-apim.developer.azure-api.net
# Vérification des propriétés Azure RM (nécessite az login)
python apim_vuln_checker.py --azure -s <id-abonnement> -g <groupe-ressources> -n <nom-apim>
# Vérification combinée (sonde HTTP et Azure RM)
python apim_vuln_checker.py https://votre-apim.developer.azure-api.net \
--azure -s <id-abonnement> -g <groupe-ressources> -n <nom-apim>
# Sortie verbose
python apim_vuln_checker.py https://votre-apim.developer.azure-api.net -v
# Ignorer la vérification SSL
python apim_vuln_checker.py https://votre-apim.developer.azure-api.net -k
# Sortie JSON
python apim_vuln_checker.py https://votre-apim.developer.azure-api.net --json
Lors de l'utilisation du mode --azure, le script interroge directement l'API Azure Resource Manager pour vérifier :
| Propriété |
|---|
Prérequis pour le mode Azure RM :
azure-identity : pip install azure-identityaz login ___ __ ____
/ _ )___ __ _____ / /___ ____ __ / __ \__ __
/ _ / _ \/ // / _ \/ __/ // / // / / /_/ / // /
/____/\___/\_,_/_//_/\__/\_, /\_, / \____/\_, /
/___//___/ /___/
Auteur : Mihalis Haatainen, Bountyy Oy - www.bountyy.fi
======================================================================
Vérificateur de vulnérabilité Azure APIM
Détection de contournement d'inscription inter-locataire
======================================================================
[?] Vérification de l'accessibilité du point de terminaison d'inscription...
[i] Le point de terminaison d'inscription est accessible
[?] Vérification de l'accessibilité de l'API d'inscription Auth de base...
[!] API d'inscription Auth de base ACTIVE (validation captcha)
[?] Vérification si l'inscription est masquée/désactivée dans l'interface utilisateur...
[i] La page d'inscription renvoie 404 (masquée dans l'interface utilisateur)
======================================================================
RÉSULTATS DE L'ÉVALUATION DE VULNÉRABILITÉ
======================================================================
Cible : https://example.developer.azure-api.net
Niveau de risque : CRITIQUE - VULNÉRABLE AU CONTOURNEMENT D'INSCRIPTION
Vérifications détaillées :
[!] signup_ui : Le point de terminaison d'inscription est accessible
[!] basic_auth_api : API d'inscription Auth de base ACTIVE (validation captcha)
[+] signup_ui_hidden : La page d'inscription renvoie 404 (masquée dans l'interface utilisateur)
Recommandations :
CRITIQUE : VULNÉRABILITÉ DE CONTOURNEMENT D'INSCRIPTION CONFIRMÉE
L'API d'inscription Auth de base est accessible même si l'interface utilisateur masque l'inscription.
Les attaquants peuvent créer des comptes en appelant directement l'API.
Actions immédiates :
1. DÉSACTIVEZ l'authentification de base dans le portail Azure immédiatement
2. Auditez tous les comptes d'utilisateurs du portail développeur pour les inscriptions non autorisées
3. Examinez les journaux de création d'utilisateurs - recherchez les enregistrements basés sur l'API
4. Implémentez uniquement l'authentification Azure AD
Un modèle Nuclei est fourni pour le scan automatisé.
# Cible unique
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net
# Plusieurs cibles depuis un fichier
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt
# Avec proxy (pour débogage)
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -proxy http://127.0.0.1:8080
# Ignorer la vérification SSL
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -insecure
/signup avec des données de test captchaMicrosoft Security Response Center (MSRC) a été informé deux fois de cette vulnérabilité. Les deux rapports ont été fermés avec la détermination suivante :
« By design »
MSRC ne considère pas cela comme une vulnérabilité de sécurité malgré le contournement des contrôles administratifs et les implications inter-locataires.
apim_vuln_checker.py - Script Python de vérification de vulnérabilitéazure-apim-signup-bypass.yaml - Modèle Nuclei pour le scan automatiséREADME.md - Ce fichierMihalis Haatainen
Bountyy Oy - Société finlandaise de tests d'intrusion et de recherche en sécurité
Cet avis et les outils associés sont publiés à des fins défensives. À utiliser de manière responsable.
Licence MIT - Voir le fichier LICENSE pour plus de détails.
| Propriété | Valeur vulnérable | Description |
|---|
properties.developerPortalStatus | Enabled | Le portail développeur est accessible |
sku.name | Developer, Basic, Standard, Premium | Niveaux non-Consommation (le niveau Consommation a des fonctionnalités de portail limitées) |
| Condition | Propriété/Ressource | Valeur vulnérable |
|---|
| Portail activé | properties.developerPortalStatus | == 'Enabled' |
| SKU non-Consommation | sku.name | != 'Consumption' |
| Auth de base existe | ressource identityProviders/basic | La ressource existe |
| Inscription masquée (contournement possible) | portalsettings/signup.properties.enabled | == false (avec Auth de base) |
| Valeur vulnérable |
|---|
properties.developerPortalStatus | == 'Enabled' |
sku.name | != 'Consumption' |
ressource identityProviders/basic | Existe |
portalsettings/signup.properties.enabled | == false |