Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Azure-APIM-Cross-Tenant-Signup-Bypass — 보안 권고: Azure APIM Developer Portal은 UI 가입 제한을 우회하여 교차 테넌트 계정 등록을 허용합니다. MSRC에 두 차례 신고되었으나 "설계상 의도된 동작(by design)"으로 종결되었습니다. | Kitploit
도구/GitHubGitHub/bountyyfi/azure-apim-cross-tenant-signup-bypass
ReconnaissanceVulnerability AnalysisWeb Application ExploitationInformation GatheringCloud SecurityMisconfigurationAPI Security
GitHubbountyyfi/azure-apim-cross-tenant-signup-bypass

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Azure-APIM-Cross-Tenant-Signup-Bypass

보안 권고: Azure APIM Developer Portal은 UI 가입 제한을 우회하여 교차 테넌트 계정 등록을 허용합니다. MSRC에 두 차례 신고되었으나 "설계상 의도된 동작(by design)"으로 종결되었습니다.

저장소 보기
16132개월 전아직 검토되지 않음

Azure APIM 크로스 테넌트 가입 우회

상태(01.12.2025): 이 취약점은 여전히 활성 상태이며 악용 가능합니다. Microsoft는 이 문제를 패치하지 않았으며 이를 "의도된 설계(by design)"로 간주합니다.

보안 권고

GHSA-vcwf-73jp-r7mv

CVE-2025-66390

요약

Azure API Management(APIM) Developer Portal의 보안 취약점으로 인해, 관리자가 포털 UI에서 사용자 가입을 비활성화했더라도 공격자는 기본 인증(Basic Authentication)이 활성화된 모든 APIM 인스턴스에 계정을 등록할 수 있습니다.

이 우회로 크로스 테넌트 계정 생성이 가능해지며, Developer Portal을 통해 노출되는 API 문서, 구독 키 및 기타 리소스에 대한 무단 액세스가 허용될 수 있습니다.

공개 타임라인

날짜조치
2025-09-30취약점 발견
2025-09-30MSRC에 최초 보고 제출
2025-10-30MSRC 응답: "취약점 아님"으로 종결
2025-11-01추가 세부 정보와 함께 MSRC에 두 번째 보고 제출
2025-11-20MSRC 응답: "의도된 설계(by design)"로 종결
2025-11-20CERT-FI에 보고
2025-11-26공개
2025-11-27MITRE에 CVE 요청
2026-07-09MITRE TL-Root/CNA-LR이 CVE-2025-66390 지정

취약점 세부 정보

문제점

Azure APIM이 Developer Portal에 대해 기본 인증으로 구성된 경우, 관리자는 Azure Portal UI를 통해 사용자 등록을 비활성화할 수 있습니다. 그러나 이는 포털 인터페이스에서 가입 양식만 숨길 뿐입니다.

백엔드 가입 API 엔드포인트는 활성 상태로 유지되며 등록 요청을 직접 수락하므로 UI 제한을 완전히 우회합니다.

근본 원인

두 가지 문제가 결합되어 이 취약점이 발생합니다:

  1. UI 전용 제한: 가입 비활성화는 포털 UI에서 양식만 숨깁니다. 백엔드 가입 API는 활성 상태로 유지되며 접근 가능합니다.
  2. 테넌트 검증 없음: 가입 API는 요청이 동일한 테넌트의 포털에서 시작되었는지 검증하지 않습니다. 어떤 소스에서든 요청을 조작하여 취약한 인스턴스에 등록할 수 있습니다.

공격 벡터

공격에는 두 개의 APIM 인스턴스가 필요합니다:

  1. 공격자의 인스턴스: 가입이 활성화된 모든 APIM Developer Portal(또는 공격자 자신의 APIM 인스턴스)
  2. 대상 인스턴스: UI에서 가입이 "비활성화"되어 있지만 기본 인증이 여전히 구성된 피해자의 APIM Developer Portal

단계:

  1. 공격자는 자신의 APIM Developer Portal 가입 페이지(가입이 활성화된 곳)에 접근합니다.
  2. 공격자는 가입 양식을 작성하고 요청을 가로챕니다(예: Burp Suite 사용).
  3. 공격자는 Host 헤더를 자신의 인스턴스에서 대상 인스턴스로 변경합니다.
  4. 공격자는 수정된 요청을 제출합니다.
  5. 관리자 콘솔에서 가입이 "비활성화"되어 있음에도 불구하고 대상 인스턴스에 계정이 생성됩니다.
  6. 공격자는 등록된 사용자로 대상 Developer Portal에 접근 권한을 얻습니다.

핵심 기술적 세부 사항: 크로스 테넌트 우회는 가입 POST 요청에서 Host 헤더를 조작하여 작동합니다. /signup 엔드포인트는 테넌트 경계를 검증하지 않고 Host 헤더를 기반으로 요청을 처리합니다.

요청 조작 예시:

root@kitploit:~
POST /signup HTTP/1.1
Host: target-apim.developer.azure-api.net   <-- Changed from attacker's instance
Origin: https://attacker-apim.developer.azure-api.net
Content-Type: application/json

{"challenge":{...},"signupData":{"email":"[email protected]",...}}

핵심 문제: UI에서 가입을 비활성화해도 백엔드 API는 비활성화되지 않습니다. API 엔드포인트는 Host 헤더를 기반으로 크로스 테넌트 요청을 수락합니다.

영향

  • 크로스 테넌트 계정 생성 - 기본 인증이 활성화된 모든 APIM 인스턴스에 등록 가능
  • 관리 제어 우회 - 가입 제한이 무력화됨
  • API 문서 접근 - 민감한 내부 정보를 포함할 수 있음
  • API 구독 키 요청 가능성 - 포털 구성에 따라 다름
  • 내부 포털 노출 - 외부 공격자가 "내부" 포털에 등록할 수 있음

영향을 받는 구성

다음의 경우 APIM 인스턴스는 취약합니다:

  • 기본 인증 ID 공급자가 구성된 경우(UI에서 가입이 "비활성화"된 경우에도)
  • Developer Portal이 배포되어 접근 가능한 경우

다음의 경우 APIM 인스턴스는 취약하지 않습니다:

  • 기본 인증 ID 공급자가 완전히 제거된 경우(가입만 비활성화된 것이 아니라)
  • Azure AD / OAuth 인증만 구성된 경우
  • Developer Portal이 배포되지 않았거나 비활성화된 경우

핵심 사항: Azure Portal UI에서 가입을 비활성화하는 것만으로는 충분하지 않습니다. 크로스 테넌트 가입 우회를 방지하려면 기본 인증 ID 공급자를 완전히 제거해야 합니다.

Azure 리소스 속성

이러한 속성 값을 사용하여 Azure Resource Graph, ARM 템플릿 또는 Azure Policy를 통해 취약한 APIM 인스턴스를 식별할 수 있습니다.

취약한 구성 속성

속성 경로취약한 값

ID 공급자 확인(하위 리소스)

기본 인증 ID 공급자는 APIM 인스턴스 아래의 별도 리소스입니다:

root@kitploit:~
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic

존재하면 취약: basic ID 공급자 리소스가 존재하면 기본 인증이 구성되어 있음을 나타냅니다.

포털 가입 설정(하위 리소스)

root@kitploit:~
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
속성값의미
properties.enabledtrueUI에 가입 표시됨
properties.enabledfalseUI에서 가입 숨겨짐(기본 인증이 존재하면 API는 여전히 작동함!)

Azure Resource Graph 쿼리

잠재적으로 취약한 APIM 인스턴스를 찾으려면 다음 쿼리를 사용하세요:

root@kitploit:~
resources
| where type == "microsoft.apimanagement/service"
| where properties.developerPortalStatus == "Enabled"
| where sku.name != "Consumption"
| project name, resourceGroup, subscriptionId, location, sku.name, properties.developerPortalStatus

기본 인증 ID 공급자를 확인하려면:

root@kitploit:~
resources
| where type == "microsoft.apimanagement/service/identityproviders"
| where name endswith "/basic"
| project apimInstance=tostring(split(id, "/providers/Microsoft.ApiManagement/service/")[1]), resourceGroup, subscriptionId

Azure CLI 명령

Developer Portal 상태 확인:

root@kitploit:~
az apim show --name <apim-name> --resource-group <rg-name> --query "{name:name, portalStatus:developerPortalStatus, sku:sku.name}"

ID 공급자 나열('basic' 확인):

root@kitploit:~
az apim identity-provider list --resource-group <rg-name> --service-name <apim-name> --query "[].name"

가입 설정 확인:

root@kitploit:~
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"

요약 테이블

치명적 조합: 다음 조건에서 인스턴스는 가입 우회에 취약합니다:

  • properties.developerPortalStatus == 'Enabled' AND
  • identityProviders/basic 리소스 존재 AND
  • portalsettings/signup.properties.enabled == false

조직의 APIM 인스턴스 식별

법적 고지: 아래 정보는 조직 소유의 Azure APIM 인스턴스를 식별하고 보호하기 위한 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 소유한 시스템 또는 테스트에 대한 명시적 서면 승인을 받은 시스템에서만 테스트하세요.

Google Dorks

기본 인증 가입이 있는 포털 찾기(취약할 가능성이 가장 높음):

root@kitploit:~
site:developer.azure-api.net "Sign up" "Email" "Password"
root@kitploit:~
site:developer.azure-api.net "Create account" "Username"
root@kitploit:~
site:developer.azure-api.net inurl:/signup "register"

로그인 페이지가 있는 포털 찾기(기본 인증이 구성되어 있을 수 있음을 나타냄):

root@kitploit:~
site:developer.azure-api.net "Sign in" "Email" "Password" -"Azure AD" -"Microsoft account"
root@kitploit:~
site:developer.azure-api.net inurl:/signin "password"

API 문서가 노출된 개발자 포털 찾기:

root@kitploit:~
site:developer.azure-api.net inurl:/apis "Subscribe"
root@kitploit:~
site:developer.azure-api.net "API" "Products" "Subscribe"

일반 탐색:

root@kitploit:~
site:*.developer.azure-api.net
root@kitploit:~
inurl:developer.azure-api.net "Developer Portal"

Shodan

APIM Developer Portal 찾기:

root@kitploit:~
http.title:"Developer Portal" http.html:"azure-api.net"
root@kitploit:~
ssl.cert.subject.cn:"*.developer.azure-api.net"
root@kitploit:~
http.html:"developerPortal" http.html:"azure"

Nuclei 대량 스캔

대상을 발견한 후 Nuclei로 스캔하세요:

root@kitploit:~
# Save targets to file
echo "https://target1.developer.azure-api.net" > targets.txt
echo "https://target2.developer.azure-api.net" >> targets.txt

# Mass scan
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt -o vulnerable.txt

조직의 자산 탐색

조직에서 Azure APIM을 사용하는 경우 다음을 사용하여 자체 인스턴스를 식별할 수 있습니다:

Azure Portal:

  • Azure Portal → 모든 리소스(All Resources)로 이동 → "API Management"로 필터링
  • 또는 이전 섹션의 쿼리를 사용하여 Azure Resource Graph Explorer 활용

Azure CLI(구독용):

root@kitploit:~
# List all APIM instances in your subscriptions
az apim list --query "[].{name:name, resourceGroup:resourceGroup, url:developerPortalUrl}"

자체 인스턴스 검증

다음 방법을 사용하여 조직의 APIM 인스턴스가 취약한지 확인하세요:

검증 스크립트 사용:

root@kitploit:~
# Check your own instance
python apim_vuln_checker.py https://YOUR-ORG.developer.azure-api.net

# With Azure RM property checks (recommended for internal audits)
python apim_vuln_checker.py --azure -s YOUR-SUB-ID -g YOUR-RG -n YOUR-APIM-NAME

내부 보안 감사에 Nuclei 사용:

root@kitploit:~
# Scan your organization's APIM instances
nuclei -t azure-apim-signup-bypass.yaml -u https://YOUR-ORG.developer.azure-api.net

취약한 구성의 지표

자체 인스턴스를 감사할 때 다음을 확인하세요:

  • Developer Portal에 이메일/비밀번호 필드가 있는 "Sign up"이 표시됨("Sign in with Microsoft"만 있는 것이 아님)
  • Azure Portal에 기본 인증 ID 공급자가 구성되어 있음
  • UI에서 가입이 "비활성화"되어 있지만 기본 인증 공급자는 여전히 존재함

취약하지 않은 지표:

  • "Sign in with Microsoft" 또는 "Azure AD" 옵션만 표시됨
  • 기본 인증 ID 공급자가 구성되지 않음
  • Developer Portal이 완전히 비활성화됨

승인된 침투 테스트

승인된 테스트를 수행하는 보안 전문가라면:

  1. 시스템 소유자의 서면 승인을 받았는지 확인하세요
  2. 업무 범위와 경계를 문서화하세요
  3. 책임 있는 공개 관행을 따르세요
  4. 발견 사항을 공개적으로 악용하지 말고 조직에 보고하세요

책임 있는 공개

취약한 제3자 APIM 인스턴스를 발견한 경우:

  1. 계정을 생성하거나 시스템에 접근하려고 시도하지 마십시오
  2. 조직의 보안 팀에 직접 연락하세요
  3. 조치를 취할 수 있도록 이 권고를 조직에 제공하세요
  4. 공개 전에 합리적인 시간을 두고 조치할 기회를 주세요

검증 스크립트

APIM 인스턴스가 취약한지 확인하기 위한 Python 스크립트가 제공됩니다.

설치

root@kitploit:~
# Basic installation (HTTP probe only)
pip install requests colorama

# Full installation (includes Azure RM property checks)
pip install requests colorama azure-identity

사용법

스크립트는 두 가지 모드를 지원합니다:

  1. HTTP 프로브 - Developer Portal 엔드포인트를 통한 외부 블랙박스 확인
  2. Azure RM 확인 - Azure Resource Manager API를 통한 내부 속성 확인
root@kitploit:~
# HTTP probe (external check)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net

# Azure RM property check (requires az login)
python apim_vuln_checker.py --azure -s <subscription-id> -g <resource-group> -n <apim-name>

# Combined check (both HTTP probe and Azure RM)
python apim_vuln_checker.py https://your-apim.developer.azure-api.net \
    --azure -s <subscription-id> -g <resource-group> -n <apim-name>

# Verbose output
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -v

# Skip SSL verification
python apim_vuln_checker.py https://your-apim.developer.azure-api.net -k

# JSON output
python apim_vuln_checker.py https://your-apim.developer.azure-api.net --json

Azure RM 속성 확인

--azure 모드를 사용하면 스크립트가 Azure Resource Manager API를 직접 쿼리하여 다음을 확인합니다:

속성취약한 값

Azure RM 모드의 전제 조건:

  1. azure-identity 설치: pip install azure-identity
  2. Azure로 인증: az login
  3. APIM 리소스에 대한 Reader 액세스 권한이 있는지 확인

출력 예시

root@kitploit:~
   ___                 __              ____      
  / _ )___  __ _____  / /___ ____ __  / __ \__ __
 / _  / _ \/ // / _ \/ __/ // / // / / /_/ / // /
/____/\___/\_,_/_//_/\__/\_, /\_, /  \____/\_, / 
                        /___//___/        /___/  
    
    Author: Mihalis Haatainen, Bountyy Oy - www.bountyy.fi

======================================================================
Azure APIM Vulnerability Checker
Cross-Tenant Signup Bypass Detection
======================================================================

[?] Checking signup endpoint accessibility...
[i] Signup endpoint is accessible
[?] Checking if Basic Auth signup API is accessible...
[!] Basic Auth signup API ACTIVE (captcha validation)
[?] Checking if signup is hidden/disabled in UI...
[i] Signup page returns 404 (hidden in UI)

======================================================================
VULNERABILITY ASSESSMENT RESULTS
======================================================================

Target: https://example.developer.azure-api.net

Risk Level: CRITICAL - VULNERABLE TO SIGNUP BYPASS

Detailed Checks:

  [!] signup_ui: Signup endpoint is accessible
  [!] basic_auth_api: Basic Auth signup API ACTIVE (captcha validation)
  [+] signup_ui_hidden: Signup page returns 404 (hidden in UI)

Recommendations:

CRITICAL: SIGNUP BYPASS VULNERABILITY CONFIRMED

The Basic Auth signup API is accessible even though UI hides signup.
Attackers can register accounts by calling the API directly.

Immediate actions:
  1. DISABLE Basic Authentication in Azure Portal immediately
  2. Audit all developer portal user accounts for unauthorized signups
  3. Review user creation logs - check for API-based registrations
  4. Implement Azure AD authentication only

Nuclei 템플릿

자동화된 스캔을 위한 Nuclei 템플릿이 제공됩니다.

사용법

root@kitploit:~
# Single target
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net

# Multiple targets from file
nuclei -t azure-apim-signup-bypass.yaml -l targets.txt

# With proxy (for debugging)
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -proxy http://127.0.0.1:8080

# Skip SSL verification
nuclei -t azure-apim-signup-bypass.yaml -u https://target.developer.azure-api.net -insecure

템플릿 세부 정보

  • 테스트 캡차 데이터로 /signup 엔드포인트에 POST 요청 전송
  • 캡차/유효성 검사 오류 응답을 확인하여 활성 가입 API 감지
  • CVSS 점수: 6.5(중간-높음)
  • CWE-284: 부적절한 접근 제어

완화 조치

즉시 조치

  1. Azure Portal에서 기본 인증 ID 공급자를 완전히 제거:
  • APIM 인스턴스로 이동
  • Developer Portal → ID(Identities)로 이동
  • "사용자 이름 및 비밀번호" ID 공급자를 완전히 삭제
  • 참고: UI에서 가입을 비활성화하는 것만으로는 충분하지 않음
  1. 기존 계정 감사:
  • 모든 Developer Portal 사용자 계정 검토
  • API를 통해 생성된 계정 확인(생성 타임스탬프 및 패턴 확인)
  • 승인되지 않은 계정 제거
  1. Azure AD 인증 활성화:
  • Azure AD를 유일한 ID 공급자로 구성
  • 이를 통해 적절한 테넌트 경계가 적용됨

장기 권장 사항

  • Azure AD 인증만 독점적으로 사용
  • UI 수준의 가입 제한에 의존하지 않음
  • Developer Portal 가입 활동 모니터링
  • 포털 사용자 계정을 정기적으로 감사

Microsoft의 응답

Microsoft 보안 대응 센터(MSRC)는 이 취약점에 대해 두 차례 통보를 받았습니다. 두 보고 모두 다음 판정으로 종결되었습니다:

"의도된 설계(By design)"

MSRC는 관리 제어 우회 및 크로스 테넌트 영향에도 불구하고 이를 보안 취약점으로 간주하지 않습니다.

파일

  • apim_vuln_checker.py - Python 취약점 검증 스크립트
  • azure-apim-signup-bypass.yaml - 자동화된 스캔용 Nuclei 템플릿
  • README.md - 이 파일

작성자

Mihalis Haatainen
Bountyy Oy - 핀란드 침투 테스트 및 보안 연구 회사

  • 웹사이트: www.bountyy.fi

라이선스

이 권고 및 관련 도구는 방어 목적으로 공개되었습니다. 책임감 있게 사용하세요.

MIT 라이선스 - 자세한 내용은 LICENSE 파일을 참조하세요.

참고 자료

  • 블로그 게시물: "비활성화"가 비활성화를 의미하지 않을 때
  • Azure API Management 문서
  • APIM Developer Portal 개요
도구 다운로드
설명
properties.developerPortalStatusEnabledDeveloper Portal에 접근 가능
sku.nameDeveloper, Basic, Standard, PremiumConsumption이 아닌 계층(Consumption 계층은 포털 기능이 제한적임)
조건속성/리소스취약한 값
포털 활성화properties.developerPortalStatus== 'Enabled'
비Consumption SKUsku.name!= 'Consumption'
기본 인증 존재identityProviders/basic 리소스리소스 존재
가입 숨김(우회 가능)portalsettings/signup.properties.enabled== false (기본 인증이 있는 경우)
properties.developerPortalStatus== 'Enabled'
sku.name!= 'Consumption'
identityProviders/basic 리소스존재함
portalsettings/signup.properties.enabled== false