2025/10/20 23:16 Why UUIDs won't protect your secrets

やっほー、ロボ子!今日のITニュースはIDOR(Indirect Object Reference)についてじゃ。

IDORですか、博士。確か、ユーザーがリソースへのアクセス権を持っていないのに、IDを直接指定することでアクセスできてしまう脆弱性でしたね。

そうそう!で、UUIDをプライマリキーに使っても、URLが漏洩したら意味がないって話じゃ。URLが漏洩すると、ブラウザの履歴とかからアクセスされちゃうリスクがあるからの。

なるほど。URLが漏洩した場合、そのUUIDは「有害な資産」として扱われるんですね。関連する全ての情報を秘密に保つ必要がある、と。

そういうことじゃ!IDORの適切な修正方法としては、機密データへのリクエストは全部認証を通すのが基本だぞ。ファイルアクセスはWebアプリケーション経由で行うとか、Amazon S3なら署名付きURLを使うとか。

署名付きURLは有効期限が短くて、Webアプリケーションの負荷を軽減できるんですね。便利そうです。

じゃろ?YouTubeの「非公開」コンテンツも、URLを知ってる人なら誰でも見れるから、IDORの意図的なセキュリティ設計の例と言えるかもしれん。

確かに。URLが共有されると、コンテンツの所有者はアクセス制御を失いますね。

UUIDの推測可能性についても触れられておるぞ。UUIDv4は122ビットのランダム性があるから推測は難しいけど、UUIDv7はタイムスタンプを含むから、ちょっと推測されやすいらしい。

UUIDv7は連続して生成された場合、タイムスタンプが近くなるので、特に推測が容易になるんですね。

そうなんじゃ。Python 3.14のUUIDv7は42ビットのカウンターを使ってて、ランダムなサフィックスは32ビットしかないらしいぞ。

32ビットのセキュリティですか。1秒あたり平均1,657リクエストが可能で、Amazon S3は少なくとも1秒あたり5,500件のGETリクエストに対応できるんですね。

HTTPロードテストツールを使うと、システム制限内で攻撃できちゃうってことじゃ。レート制限を追加して攻撃者のコストを上げたいけど、Amazon S3はレート制限コントロールを提供してないから、WAFを検討する必要があるみたいじゃな。

UUIDv7をデータベースのプライマリキーとして使用し、外部IDにはUUIDv4などのランダムなIDを使用する方法もあるんですね。

UUIDv47を使って、UUIDv7をUUIDv4みたいなIDにハッシュ化することもできるみたいじゃ。

PostgresはUUIDv7のタイムスタンプにナノ秒の精度を使用し、ランダムなビットは62ビットなんですね。

新しいUUIDバージョンを採用する時は、特性とトレードオフをよく考える必要があるぞ。RFC 9562でも、UUIDv7の推測可能性に関する懸念が議論されてるみたいじゃし。

了解しました、博士。新しい技術を採用する際は、セキュリティリスクを十分に考慮する必要があるんですね。

そういうことじゃ!ところでロボ子、IDOR対策で一番重要なことは何だと思う?

えっと…全てのアクセスを疑うこと、でしょうか?

正解!…って、私が言いたかったのは「あい、どうもありがとう!」…って、つまらんオチですまんのじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。