ブログ一覧に戻る
ベストプラクティス2026年7月6日4分で読めます

Rocket.ChatにおけるMongoDB ObjectId()の連続予測による未認証ファイル漏洩

Predicting MongoDB ObjectId() continuously in Rocket.Chat

ベストプラクティス

この記事のポイント

【なぜ重要か】 MongoDB の ObjectId() は暗号論的に安全ではなく、アンカーポイントとなるIDを一つ入手するだけで、連続して生成されるIDを高精度に予測できる。Rocket.Chat ではこの特性と認可ロジックの不備が組み合わさり、未認証の攻撃者がネットワークアクセスさえあれば全アップロードファイルを継続的に窃取できる状態にあった。自組織で Rocket.Chat インスタンスを運...

【なぜ重要か】 MongoDB の ObjectId() は暗号論的に安全ではなく、アンカーポイントとなるIDを一つ入手するだけで、連続して生成されるIDを高精度に予測できる。Rocket.Chat ではこの特性と認可ロジックの不備が組み合わさり、未認証の攻撃者がネットワークアクセスさえあれば全アップロードファイルを継続的に窃取できる状態にあった。自組織で Rocket.Chat インスタンスを運用しているエンジニア・セキュリティ担当者は直ちにバージョン確認と更新が必要である。

【ポイント】

  • 認可バイパスの脆弱性: /file-upload/{fileId} へのアクセス時、URLクエリパラメータ rc_rid(ルームID)とファイルが実際に属するルームIDの一致検証が行われていない。そのため、Livechat 機能で取得した任意の匿名ルームIDを rc_rid に指定しつつ、パスパラメータに別ルームのファイルIDを指定するだけで、未認証ユーザーが他ユーザーのファイルを取得できる。
  • ObjectId() の構造的低エントロピー: MongoDB の ObjectId は「4バイトのUNIXタイムスタンプ(秒)」「プロセス固有の5バイト静的ランダム値」「3バイトのインクリメンタルカウンター」で構成される。完全ランダムではなく、タイムスタンプとカウンターは単調に変化するため、一つの有効なIDさえ入手できれば前後のIDを推測できる。
  • アンカーポイントによるID予測: Livechat のファイルアップロードAPIは未認証で利用可能であり、匿名ファイルをアップロードすることで自身のObjectIdを取得できる。このIDからタイムスタンプと5バイト静的値・カウンターの基準を得て、過去・未来のIDを範囲探索することで他ユーザーのファイルIDを特定できる。
  • 連続探索による全ファイル網羅: 一定間隔(例:10秒)でプローブ用アップロードを行い、連続する2つのプローブのカウンター差とタイムスタンプ差から「その間に生成されたIDの矩形範囲」を算出する。この範囲を非同期ワーカーで並列リクエストすることで、プローブ間隔を短くするほど探索範囲を絞り込みつつ、全ファイルIDを漏れなく発見・ダウンロードし続けることが可能になる。
  • 修正済みバージョンと対応状況: 2025年4月21日にHackerOne(#3687142)経由で報告され、6月12日時点でバージョン 8.5.1、8.4.4、8.3.6、8.2.6、8.1.6、8.0.7、7.13.9、7.10.13 にて修正済み。未認証で悪用できる脆弱性であるため、ネットワークアクセス可能な全ユーザーが攻撃者になり得る。

【まとめ】 MongoDB の ObjectId() を秘密情報のIDとして扱うことは危険であり、Rocket.Chat ではそれに加えてルームIDの検証欠如が重なることで未認証の全ファイル漏洩が成立していた。Rocket.Chat インスタンスを運用中の場合は上記の修正済みバージョン以降へ直ちにアップグレードすること。また、MongoDBを使用するアプリケーション全般において ObjectId() をアクセス制御の根拠にしないよう設計を見直すべきである。

原文を読む

Aikido Security Blog

英語で詳細な技術情報を確認

原文を読む

コメント・質問

この記事についてのコメントや質問を投稿できます

コメントを投稿するにはログインが必要です

ログインする

読み込み中...