
Spring Cloud Azure B2C 리소스 서버의 교차 발급자 인증 우회(cross-issuer authentication bypass)를 위한 CVE-2026-50338 개념 증명 익스플로잇. AAD 앱 등록을 통한 토큰 위조로 보호된 B2C 엔드포인트에 접근하는 방법을 시연합니다.
Spring Cloud Azure B2C 리소스 서버 교차 발급자 인증 우회
spring-cloud-azure-autoconfigure의 AadB2cResourceServerAutoConfiguration은 AadB2cTrustedIssuerRepository.java:30을 통해 AadTrustedIssuerRepository에서 상속된 6개의 AAD 계열 발급자(login.microsoftonline.com, sts.windows.net, sts.chinacloudapi.cn, 각각 v1 및 v2)를 신뢰하는 JwtDecoder를 구성합니다. tid 클레임 검증기를 설치하지 않으며, aud 조건자는 containsAll을 사용합니다(빈 audiences에서는 공허 참).
동일한 테넌트에 AAD 앱 등록을 보유한 공격자는 iss가 https://sts.windows.net/<tenant>/이고 aud가 B2C 앱의 client-id와 일치하는 client_credentials 토큰을 발행합니다. B2C 리소스 서버는 AAD 발급자가 신뢰 집합에 포함되어 있고 추가 클레임 검증이 교차 ID 시스템 토큰을 거부하지 않기 때문에 이를 수락합니다.
이는 CVE-2026-33117(AAD 리소스 서버)의 B2C 대응 취약점입니다. PR #49033은 AAD 경로를 수정했습니다. B2C 경로는 PR #49252(2026-06-02 병합, 2026년 7월 보안 업데이트에 릴리스)까지 수정되지 않았습니다.
tenant-id=common을 사용하면 모든 Entra 테넌트의 토큰이 수락됩니다.
영향: spring-cloud-azure-starter-active-directory-b2c <= 5.19.0.
2026년 7월 보안 업데이트에서 수정됨
(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
공격자 앱 등록에는 다음이 필요합니다:
msal, requestsspring-cloud-azure-starter-active-directory-b2c <= 5.19.0을 사용하는 Spring Boot 앱| 파일 | 설명 |
|---|---|
poc.py | Python PoC: AAD 토큰을 발행하고 B2C 엔드포인트로 전송하여 우회를 보고합니다 |
README.md | 취약점 세부 정보 및 사용법 |
LICENSE | GPLv3 라이선스 |
이 프로젝트는 GNU GPLv3에 따라 배포됩니다.
방어적 보안 연구, 교육 및 승인된 테스트를 위해 제공됩니다. 소유자의 명시적 허가 없이 이 코드를 시스템이나 서비스에 사용하지 마십시오.
무단 사용은 관련 법률을 위반할 수 있습니다. 저자는 제3자 시스템을 테스트할 권한을 부여하지 않으며 오용에 대한 책임을 지지 않습니다.
보증 및 책임 조건은 LICENSE 파일을 참조하십시오.