Cal.comでアクセス制御の不備が発覚、アカウント乗っ取りと機密データ漏洩の脅威

概要

オープンソースのスケジュール管理プラットフォームであるCal.comが、ユーザーアカウント乗っ取りや機密予約データへの不正アクセスを可能にする重大な脆弱性を修正しました。これらの脆弱性は、Gecko社のAIセキュリティエンジニアがCal.com Cloudのコードベースを自律的に分析する中で発見されたもので、既存のツールや手動ペネトレーションテストでは見逃されていた複雑な多段階の脆弱性連鎖でした。

Gecko社によると、今回の発見は、認証と認可のロジックにおける小さなローカルバグが、アカウントの完全な侵害や機密データの漏洩につながる可能性があることを浮き彫りにしています。OWASPの2025年版Top 10レポートでも、テストされたアプリケーションの100%で何らかのアクセス制御の不備が確認されており、Cal.comのようなセキュリティ意識の高いオープンソースプロジェクトでさえも、これらの問題がいかに蔓延しているかを示しています。

組織サインアップフローにおけるアカウント乗っ取りの脆弱性

最も深刻な問題は、組織のサインアップフローにおける認証バイパスでした。これにより、攻撃者は電子メールアドレスと組織招待リンクのみを使用して、既存のCal.comアカウントを乗っ取ることができました。脆弱性は、サインアッププロセスにおける以下の3つの連鎖した論理的欠陥に起因します。

  • usernameCheckForSignup関数がデフォルトでavailable: trueとなり、既に組織のメンバーであるユーザーに対する重要な検証をスキップしていました。これにより、既存の検証済みユーザーを新規登録可能なユーザーとして誤って処理していました。
  • 2つ目の検証ステップが、攻撃者の組織スコープ内でのみ既存ユーザーをチェックしていました。「このメールは私の組織に存在するか?」という形でクエリがorganizationIdでフィルタリングされていたため、他の組織の検証済みユーザーは誤って新規ユーザーとして扱われました。
  • サインアップハンドラーが、メールアドレスがグローバルに一意であるスキーマに対してprisma.user.upsert()where: { email }で実行していました。上記の2つの検証が成功すると、このupsertは被害者の既存のレコードと一致し、パスワードハッシュの上書き、新しいユーザー名の設定、メールの検証済みマーク、そしてorganizationIdを攻撃者の組織への再割り当てを行いました。

この攻撃は非常に簡単で、攻撃者は組織を作成または使用し、招待リンクを生成して、被害者のメールアドレスと新しいパスワードでサインアップフォームを送信するだけでした。サインアップは成功し、被害者は知らぬ間にロックアウトされ、攻撃者はカレンダー連携、OAuthトークン、予約、APIキーを含むアカウントへの完全なアクセス権を獲得しました。被害者には通知も送信されませんでした。

Cal.comはバージョン6.0.8で、招待トークンによるサインアップ処理の前に厳格なユーザー存在検証を追加することで、この問題を修正しました。

予約およびカレンダーエンドポイントの脆弱性

2つ目の脆弱性のクラスは、設定ミスのあるAPIルートとIDOR(Insecure Direct Object Reference)型の欠陥を介して、すべての予約記録とユーザーデータを公開するものでした。

  • Cal.comのAPI v1では、アンダースコアプレフィックスのファイル(例: _get.ts_post.ts_patch.ts_delete.ts)が内部ルートハンドラーとして使用されていました。
  • メインのindex.tsエントリポイントは、これらのハンドラーに委譲する前に認可ミドルウェアを正しく適用していました。しかし、Next.jsがルーティングを処理する方法により、アンダースコアのファイルも直接ルートとして公開されていました。

これらの内部ルートを直接呼び出すことで、有効なv1 APIキーを持つ認証済みのユーザーであれば、認可ミドルウェアを完全にバイパスすることができました。これにより、プラットフォーム全体の予約の読み取りと削除が可能になり、以下の情報が漏洩しました。

  • 出席者の氏名、メールアドレス、個人情報
  • 会議のメタデータとカレンダー情報
  • ユーザーと組織をまたがる完全な予約履歴

同様のパターンが宛先カレンダーエンドポイントにも影響し、任意のユーザーの宛先カレンダーをIDで削除することが可能になり、ルーティングルールを密かに破壊し、ビジネスワークフローを混乱させる可能性がありました。Cal.comは、/_get/_post/_patch/_delete/_auth-middlewareなどの内部ルートハンドラーへの直接アクセスを明示的にブロックするようNext.jsミドルウェアを更新し、これらのパスへの直接リクエストに対してHTTP 403を返すことでこの問題を緩和しました。

今回の教訓

今回の発見は、小さな、局所的な認証および認可ロジックのバグが、アカウントの完全な侵害や機密データの漏洩にどのように連鎖するかを明確に示しています。Cal.comの場合、管理ユーザーや有料ユーザーを含む完全なアカウント乗っ取りから、予約に埋め込まれた非常に機密性の高い個人識別情報(PII)の漏洩に至るまで、その影響は広範囲に及びました。この事件は、以下のセキュリティ対策の必要性を再認識させます。

  • 厳格なグローバルなIDチェック
  • すべてのパスにおける一貫した認可の強制
  • フレームワークのルーティング動作の慎重な取り扱い

また、コードベースのセマンティックインデックスを構築し、データフローとビジネスロジックを推論するGecko社のAI SASTエンジンなど、AIを活用したセキュリティツールの役割も浮き彫りになりました。


元記事: https://gbhackers.com/cal-com-broken-access/