
Exploit de preuve de concept pour CVE-2026-50338 : contournement de l'authentification inter-émetteurs dans les serveurs de ressources Spring Cloud Azure B2C. Démontre la falsification de jetons via l'enregistrement d'application AAD pour accéder aux points de terminaison B2C protégés.
Contournement de l'authentification inter-émetteurs du serveur de ressources B2C Spring Cloud Azure
AadB2cResourceServerAutoConfiguration dans spring-cloud-azure-autoconfigure
construit un JwtDecoder qui fait confiance à six émetteurs de la famille AAD
(login.microsoftonline.com, sts.windows.net, sts.chinacloudapi.cn, v1 et
v2 chacun), hérités de AadTrustedIssuerRepository via
AadB2cTrustedIssuerRepository.java:30. Il n'installe aucun validateur de
revendication tid, et le prédicat aud utilise containsAll (vraie par
vacuité pour des audiences vides).
Un attaquant disposant d'un enregistrement d'application AAD dans le même
locataire génère un jeton client_credentials dont l'iss est
https://sts.windows.net/<tenant>/ et dont l'aud correspond au client-id de
l'application B2C. Le serveur de ressources B2C l'accepte car l'émetteur AAD
fait partie de son ensemble de confiance et qu'aucune validation supplémentaire
de revendications ne rejette le jeton inter-systèmes d'identité.
Il s'agit de l'équivalent B2C de CVE-2026-33117 (serveur de ressources AAD). La PR #49033 a corrigé le chemin AAD ; le chemin B2C n'a pas été modifié jusqu'à la PR #49252 (fusionnée le 2026-06-02, publiée dans la mise à jour de sécurité de juillet 2026).
Avec tenant-id=common, le jeton de n'importe quel locataire Entra est accepté.
Versions concernées : spring-cloud-azure-starter-active-directory-b2c <= 5.19.0.
Corrigé dans la mise à jour de sécurité de juillet 2026
(PR #49252).
pip install msal requests
# Against a vulnerable Spring Boot B2C resource server:
python3 poc.py \
--target http://localhost:8080/profile \
--tenant-id <TENANT_ID> \
--client-id <ATTACKER_APP_CLIENT_ID> \
--client-secret <ATTACKER_APP_SECRET> \
--victim-api <B2C_APP_CLIENT_ID>
# Without MSAL (raw HTTP token request):
python3 poc.py \
--target http://localhost:8080/profile \
--tenant-id <TENANT_ID> \
--client-id <ATTACKER_APP_CLIENT_ID> \
--client-secret <ATTACKER_APP_SECRET> \
--victim-api <B2C_APP_CLIENT_ID> \
--no-msal
# Verbose output (full token claims and response):
python3 poc.py ... -v
L'enregistrement de l'application attaquante nécessite :
msal, requestsspring-cloud-azure-starter-active-directory-b2c
<= 5.19.0 comme cible| Fichier | Description |
|---|---|
poc.py | PoC Python : génère un jeton AAD, l'envoie au point de terminaison B2C, signale le contournement |
README.md | Détails de la vulnérabilité et utilisation |
LICENSE | Licence GPLv3 |
Ce projet est publié sous la licence GNU GPLv3.
Il est fourni à des fins de recherche défensive en sécurité, d'éducation et de tests autorisés. N'utilisez pas ce code contre des systèmes ou des services sans l'autorisation explicite de leur propriétaire.
Toute utilisation non autorisée peut enfreindre la législation applicable. Les auteurs n'accordent pas la permission de tester des systèmes tiers et ne sont pas responsables d'une mauvaise utilisation.
Consultez le fichier LICENSE pour les conditions de garantie et de responsabilité.