OAuthのディスカバリmetadataで返るエンドポイントはissuerと同一オリジン検証する
セキュリティ
認証
OAuth
問題
OAuth クライアントが /.well-known/oauth-authorization-server(や oauth-protected-resource)から token_endpoint / registration_endpoint / revocation_endpoint を取得し、オリジン検証せずそのまま使うと、metadata 応答を制御できる相手に認可コードやリフレッシュトークンを送らせる mix-up 攻撃の余地が生まれる。発火条件は、ユーザーが誤って悪意ある API URL を指定した場合や、http:// 指定で MITM された場合。
判断基準
- ディスカバリで得た各エンドポイントの URL オリジンが、issuer(接続先 API のオリジン)と一致することを検証する。
https:以外は拒否する(ループバック127.0.0.1/localhostの開発用途のみ例外)。- トークンや認可コードの送信先は issuer 同一オリジンに固定し、metadata 由来の任意ホストへ bearer を送らない。
適用場面
外部 OAuth サーバーに対する CLI / MCP クライアント / SPA など、ディスカバリ文書からエンドポイントを動的取得する実装全般。RFC 8414/9728 に沿う実装でも、取得値の検証は実装側責務になりやすく抜けやすい。
検証方法
metadata の各エンドポイントを issuer と別オリジンに差し替えたモックを返し、クライアントがそれを拒否することを確認する。http://(非ループバック)も拒否されることを確認する。