
सुरक्षा परामर्श: Azure APIM डेवलपर पोर्टल UI साइनअप प्रतिबंधों को बायपास करके क्रॉस-टेनेंट खाता पंजीकरण की अनुमति देता है। MSRC को दो बार रिपोर्ट किया गया - "बाय डिज़ाइन" के रूप में बंद किया गया।
स्थिति (01.12.2025): यह भेद्यता अभी भी सक्रिय और शोषण योग्य है। Microsoft ने इस समस्या को पैच नहीं किया है और इसे "by design" (डिज़ाइन द्वारा) मानता है।
Azure API Management (APIM) डेवलपर पोर्टल में एक सुरक्षा भेद्यता हमलावरों को किसी भी APIM इंस्टेंस पर खाता पंजीकृत करने की अनुमति देती है, जिसमें बेसिक प्रमाणीकरण (Basic Authentication) सक्षम है, भले ही प्रशासकों ने पोर्टल UI में उपयोगकर्ता साइनअप अक्षम कर दिया हो।
यह बाईपास क्रॉस-टेनेंट खाता निर्माण सक्षम करता है, जो संभावित रूप से API दस्तावेज़ीकरण, सदस्यता कुंजियों (subscription keys) और डेवलपर पोर्टल के माध्यम से उजागर अन्य संसाधनों तक अनधिकृत पहुँच की अनुमति देता है।
| तिथि | कार्रवाई |
|---|---|
| 2025-09-30 | भेद्यता की खोज हुई |
| 2025-09-30 | MSRC को प्रारंभिक रिपोर्ट प्रस्तुत की गई |
| 2025-10-30 | MSRC प्रतिक्रिया: "भेद्यता नहीं" के रूप में बंद |
| 2025-11-01 | अतिरिक्त विवरण के साथ MSRC को दूसरी रिपोर्ट प्रस्तुत की गई |
| 2025-11-20 | MSRC प्रतिक्रिया: "डिज़ाइन द्वारा" के रूप में बंद |
| 2025-11-20 | CERT-FI को रिपोर्ट किया गया |
| 2025-11-26 | सार्वजनिक प्रकटीकरण |
| 2025-11-27 | MITRE से CVE अनुरोध किया गया |
| 2026-07-09 | CVE-2025-66390 MITRE TL-Root/CNA-LR द्वारा निर्धारित |
जब Azure APIM डेवलपर पोर्टल के लिए बेसिक प्रमाणीकरण के साथ कॉन्फ़िगर किया जाता है, तो प्रशासक Azure पोर्टल UI के माध्यम से उपयोगकर्ता पंजीकरण अक्षम कर सकते हैं। हालाँकि, यह केवल पोर्टल इंटरफ़ेस में साइनअप फ़ॉर्म को छुपाता है।
अंतर्निहित साइनअप API एंडपॉइंट सक्रिय रहता है और सीधे पंजीकरण अनुरोध स्वीकार करता है, जिससे UI प्रतिबंध पूरी तरह से बाईपास हो जाता है।
दो समस्याएँ मिलकर यह भेद्यता उत्पन्न करती हैं:
हमले के लिए दो APIM इंस्टेंस की आवश्यकता होती है:
चरण:
Host हेडर को अपने इंस्टेंस से बदलकर लक्ष्य इंस्टेंस कर देता हैमुख्य तकनीकी विवरण: क्रॉस-टेनेंट बाईपास साइनअप POST अनुरोध में Host हेडर में हेरफेर करके काम करता है। /signup एंडपॉइंट टेनेंट सीमाओं को सत्यापित किए बिना Host हेडर के आधार पर अनुरोधों को संसाधित करता है।
अनुरोध हेरफेर का उदाहरण:
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 इंस्टेंस भेद्य है यदि:
आपका APIM इंस्टेंस भेद्य नहीं है यदि:
मुख्य बिंदु: Azure पोर्टल UI में साइनअप अक्षम करना पर्याप्त नहीं है। क्रॉस-टेनेंट साइनअप बाईपास को रोकने के लिए बेसिक प्रमाणीकरण पहचान प्रदाता को पूरी तरह से हटाया जाना चाहिए।
Azure Resource Graph, ARM टेम्पलेट या Azure Policy के माध्यम से भेद्य APIM इंस्टेंस की पहचान करने के लिए इन गुण मानों का उपयोग करें।
| गुण पथ | भेद्य मान | विवरण |
|---|---|---|
properties.developerPortalStatus | Enabled | डेवलपर पोर्टल सुलभ है |
sku.name | Developer, Basic, Standard, Premium | गैर-Consumption टियर (Consumption टियर में सीमित पोर्टल सुविधाएँ हैं) |
बेसिक प्रमाणीकरण पहचान प्रदाता APIM इंस्टेंस के अंतर्गत एक अलग संसाधन है:
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
यदि मौजूद है तो भेद्य: basic पहचान प्रदाता संसाधन की उपस्थिति इंगित करती है कि बेसिक प्रमाणीकरण कॉन्फ़िगर किया गया है।
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| गुण | मान | अर्थ |
|---|---|---|
properties.enabled | true | साइनअप UI में दृश्यमान है |
properties.enabled | false | साइनअप UI में छिपा हुआ है (यदि बेसिक प्रमाणीकरण मौजूद है तो API फिर भी काम करता है!) |
संभावित रूप से भेद्य APIM इंस्टेंस खोजने के लिए इस क्वेरी का उपयोग करें:
resources
| where type == "microsoft.apimanagement/service"
| where properties.developerPortalStatus == "Enabled"
| where sku.name != "Consumption"
| project name, resourceGroup, subscriptionId, location, sku.name, properties.developerPortalStatus
बेसिक प्रमाणीकरण पहचान प्रदाताओं की जाँच करने के लिए:
resources
| where type == "microsoft.apimanagement/service/identityproviders"
| where name endswith "/basic"
| project apimInstance=tostring(split(id, "/providers/Microsoft.ApiManagement/service/")[1]), resourceGroup, subscriptionId
डेवलपर पोर्टल स्थिति जाँचें:
az apim show --name <apim-name> --resource-group <rg-name> --query "{name:name, portalStatus:developerPortalStatus, sku:sku.name}"
पहचान प्रदाताओं की सूची बनाएँ ('basic' की जाँच करें):
az apim identity-provider list --resource-group <rg-name> --service-name <apim-name> --query "[].name"
साइनअप सेटिंग्स जाँचें:
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' |
| गैर-Consumption SKU | sku.name | != 'Consumption' |
| बेसिक प्रमाणीकरण मौजूद | identityProviders/basic संसाधन | संसाधन मौजूद है |
| साइनअप छिपा हुआ (बाईपास संभव) | portalsettings/signup.properties.enabled | == false (बेसिक प्रमाणीकरण के साथ) |