
استشارة أمنية: يتيح 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.
| مسار الخاصية | القيمة المعرّضة | الوصف |
|---|---|---|
properties.developerPortalStatus | Enabled | بوابة المطور قابلة للوصول |
sku.name | Developer, Basic, Standard, Premium | الطبقات غير الاستهلاكية (طبقة Consumption لها ميزات بوابة محدودة) |
مزود هوية المصادقة الأساسية هو مورد منفصل ضمن مثيل 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' |
| SKU غير استهلاكي | sku.name | != 'Consumption' |
| المصادقة الأساسية موجودة | مورد identityProviders/basic | المورد موجود |
| التسجيل مخفي (التجاوز ممكن) | portalsettings/signup.properties.enabled | == false (مع المصادقة الأساسية) |
التركيبة الحرجة: يكون المثيل معرّضًا لتجاوز التسجيل عندما:
properties.developerPortalStatus == 'Enabled' وidentityProviders/basic موجود وportalsettings/signup.properties.enabled == falseإخلاء مسؤولية قانوني: المعلومات أدناه مقدمة فقط لتحديد وتأمين مثيلات Azure APIM الخاصة بمؤسستك. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. اختبر فقط الأنظمة التي تملكها أو لديك تفويض كتابي صريح لاختبارها.