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を指定するだけで、未認証ユーザーが他ユーザーのファイルを取得できる。【まとめ】 MongoDB の ObjectId() を秘密情報のIDとして扱うことは危険であり、Rocket.Chat ではそれに加えてルームIDの検証欠如が重なることで未認証の全ファイル漏洩が成立していた。Rocket.Chat インスタンスを運用中の場合は上記の修正済みバージョン以降へ直ちにアップグレードすること。また、MongoDBを使用するアプリケーション全般において ObjectId() をアクセス制御の根拠にしないよう設計を見直すべきである。
原文を読む
Aikido Security Blog
英語で詳細な技術情報を確認