
استشارة أمنية: يتيح Azure APIM Developer Portal تسجيل حسابات عبر المستأجرين عن طريق تجاوز قيود التسجيل في UI. أُبلغ إلى MSRC مرتين - وأُغلق باعتباره «حسب التصميم».
الحالة (01.12.2025): ما تزال هذه الثغرة نشطة وقابلة للاستغلال. لم تقم Microsoft بإصلاح هذه المشكلة وتعتبرها "تصميمًا مقصودًا".
تسمح ثغرة أمنية في بوابة مطوّري Azure API Management (APIM) للمهاجمين بتسجيل حسابات على أي مثيل APIM تم فيه تمكين المصادقة الأساسية، حتى عندما يكون المسؤولون قد عطّلوا تسجيل المستخدمين في واجهة مستخدم البوابة.
يتيح هذا التجاوز إنشاء حسابات عبر المستأجرين، مما قد يسمح بالوصول غير المصرح به إلى توثيقات واجهات برمجة التطبيقات ومفاتيح الاشتراك وموارد أخرى معروضة من خلال بوابة المطور.
| التاريخ | الإجراء |
|---|---|
| 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 | طلب CVE من MITRE |
| 2026-07-09 | تم تعيين CVE-2025-66390 من قبل MITRE TL-Root/CNA-LR |
عند تكوين Azure APIM مع المصادقة الأساسية لبوابة المطور، يمكن للمسؤولين تعطيل تسجيل المستخدمين من خلال واجهة مستخدم Azure Portal. ومع ذلك، فإن هذا يخفي نموذج التسجيل في واجهة البوابة فقط.
تبقى نقطة نهاية واجهة برمجة تطبيقات التسجيل الأساسية نشطة وتقبل طلبات التسجيل مباشرة، متجاوزةً قيد واجهة المستخدم بالكامل.
تتضافر مشكلتان لتكوين هذه الثغرة:
يتطلب الهجوم مثيلين من APIM:
الخطوات:
Host من مثيله إلى المثيل المستهدفتفصيل تقني أساسي: يعمل التجاوز عبر المستأجرين عن طريق التلاعب بترويسة Host في طلب POST الخاص بالتسجيل. تعالج نقطة النهاية /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]",...}}
المشكلة الأساسية: تعطيل التسجيل في واجهة المستخدم لا يعطّل واجهة برمجة التطبيقات الأساسية. تقبل نقطة نهاية واجهة برمجة التطبيقات الطلبات عبر المستأجرين استنادًا إلى ترويسة Host.
يكون مثيل APIM الخاص بك معرّضًا للخطر إذا:
مثيل APIM الخاص بك ليس معرّضًا للخطر إذا:
نقطة أساسية: تعطيل التسجيل في واجهة مستخدم Azure Portal ليس كافيًا. يجب إزالة مزود هوية المصادقة الأساسية بالكامل لمنع تجاوز التسجيل عبر المستأجرين.
استخدم قيم الخصائص هذه لتحديد مثيلات APIM المعرّضة للخطر عبر Azure Resource Graph أو قوالب ARM أو Azure Policy.
مزود هوية المصادقة الأساسية هو مورد منفصل ضمن مثيل APIM:
Resource Type: Microsoft.ApiManagement/service/identityProviders
Name: basic
معرّض للخطر إذا كان موجودًا: وجود مورد مزود هوية basic يشير إلى أن المصادقة الأساسية مُكوّنة.
Resource Type: Microsoft.ApiManagement/service/portalsettings/signup
Property: properties.enabled
| الخاصية | القيمة | المعنى |
|---|---|---|
properties.enabled | true | التسجيل ظاهر في واجهة المستخدم |
properties.enabled | false | التسجيل مخفي في واجهة المستخدم (واجهة برمجة التطبيقات ما تزال تعمل إذا كانت المصادقة الأساسية موجودة!) |
استخدم هذا الاستعلام للعثور على مثيلات 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' وidentityProviders/basic موجود وportalsettings/signup.properties.enabled == falseإخلاء مسؤولية قانوني: المعلومات أدناه مقدمة فقط لتحديد وتأمين مثيلات Azure APIM الخاصة بمؤسستك. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. اختبر فقط الأنظمة التي تملكها أو لديك تفويض كتابي صريح لاختبارها.
العثور على بوابات مع تسجيل المصادقة الأساسية (الأكثر احتمالًا للتعرّض للخطر):
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"
العثور على بوابات تحتوي على صفحات تسجيل دخول (يشير إلى أن المصادقة الأساسية قد تكون مُكوّنة):
site:developer.azure-api.net "Sign in" "Email" "Password" -"Azure AD" -"Microsoft account"
site:developer.azure-api.net inurl:/signin "password"
العثور على بوابات مطور تحتوي على توثيقات واجهات برمجة تطبيقات مكشوفة:
site:developer.azure-api.net inurl:/apis "Subscribe"
site:developer.azure-api.net "API" "Products" "Subscribe"
اكتشاف عام:
site:*.developer.azure-api.net
inurl:developer.azure-api.net "Developer Portal"
العثور على بوابات مطور APIM:
http.title:"Developer Portal" http.html:"azure-api.net"
ssl.cert.subject.cn:"*.developer.azure-api.net"
http.html:"developerPortal" http.html:"azure"
بعد اكتشاف الأهداف، افحصها باستخدام Nuclei:
# 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 CLI (لاشتراكاتك):
# List all APIM instances in your subscriptions
az apim list --query "[].{name:name, resourceGroup:resourceGroup, url:developerPortalUrl}"
استخدم هذه الطرق للتحقق مما إذا كانت مثيلات APIM الخاصة بمؤسستك معرّضة للخطر:
باستخدام سكربت التحقق:
# 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 لعمليات التدقيق الأمني الداخلية:
# Scan your organization's APIM instances
nuclei -t azure-apim-signup-bypass.yaml -u https://YOUR-ORG.developer.azure-api.net
عند تدقيق مثيلاتك الخاصة، ابحث عن:
مؤشرات عدم التعرّض للخطر:
إذا كنت مختصًا أمنيًا تجري اختبارات مصرحًا بها:
إذا اكتشفت مثيل APIM تابعًا لجهة خارجية معرّضًا للخطر:
يتم توفير سكربت Python للتحقق مما إذا كان مثيل APIM الخاص بك معرّضًا للخطر.
# Basic installation (HTTP probe only)
pip install requests colorama
# Full installation (includes Azure RM property checks)
pip install requests colorama azure-identity
يدعم السكربت وضعين:
# 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، يستعلم السكربت مباشرة من واجهة Azure Resource Manager API للتحقق من:
| الخاصية |
|---|
المتطلبات الأساسية لوضع Azure RM:
azure-identity: pip install azure-identityaz login ___ __ ____
/ _ )___ __ _____ / /___ ____ __ / __ \__ __
/ _ / _ \/ // / _ \/ __/ // / // / / /_/ / // /
/____/\___/\_,_/_//_/\__/\_, /\_, / \____/\_, /
/___//___/ /___/
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 للفحص الآلي.
# 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 مع بيانات captcha اختباريةتم إخطار مركز استجابة أمان Microsoft (MSRC) مرتين بشأن هذه الثغرة. تم إغلاق التقريرين مع التحديد التالي:
"تصميم مقصود"
لا يعتبر MSRC هذه ثغرة أمنية على الرغم من تجاوز الضوابط الإدارية والآثار عبر المستأجرين.
apim_vuln_checker.py - سكربت التحقق من الثغرة بلغة Pythonazure-apim-signup-bypass.yaml - قالب Nuclei للفحص الآليREADME.md - هذا الملفMihalis Haatainen
Bountyy Oy - شركة فنلندية لاختبار الاختراق وأبحاث الأمن السيبراني
تم إصدار هذه الاستشارة والأدوات المرتبطة بها لأغراض دفاعية. استخدمها بمسؤولية.
MIT License - راجع ملف LICENSE للحصول على التفاصيل.
| مسار الخاصية |
|---|
| القيمة المعرّضة |
|---|
| الوصف |
|---|
properties.developerPortalStatus | Enabled | بوابة المطور قابلة للوصول |
sku.name | Developer, Basic, Standard, Premium | الطبقات غير الاستهلاكية (طبقة Consumption لها ميزات بوابة محدودة) |
| الشرط | الخاصية/المورد | القيمة المعرّضة |
|---|
| البوابة مفعّلة | properties.developerPortalStatus | == 'Enabled' |
| SKU غير استهلاكي | sku.name | != 'Consumption' |
| المصادقة الأساسية موجودة | مورد identityProviders/basic | المورد موجود |
| التسجيل مخفي (التجاوز ممكن) | portalsettings/signup.properties.enabled | == false (مع المصادقة الأساسية) |
| القيمة المعرّضة |
|---|
properties.developerPortalStatus | == 'Enabled' |
sku.name | != 'Consumption' |
مورد identityProviders/basic | موجود |
portalsettings/signup.properties.enabled | == false |