MS_OAuthThreatModel - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

OAuth 2.0 Threat Model and Security Considerations

概要

OAuth 2.0 の脅威モデルとセキュリティ考慮事項 (RFC 6819)

  • OAuth 2.0 の実装にあたり、脅威モデルとセキュリティ考慮事項を列挙
  • セクション4以降からの内容で、OAuth 2.0 の前提は飛ばしている。

補足(RFC 6819 と Security BCP の関係): RFC 6819(2013 年)は
OAuth 2.0 公開当時の脅威を網羅的に洗い出した文書である。
その後に見つかった攻撃(ミックスアップ、コード注入など)と
現在の推奨事項は、後継の
OAuth 2.0 Security Best Current Practice
(RFC 9700)にまとめられている。
本ページは「何が脅威か」の分類、Security BCP は「今どうすべきか」を
押さえる、という読み分けになる。

脅威モデル

OAuth 2.0 の包括的なグループ化された脅威モデル。

Role毎の脅威モデル

OAuth 2.0 Threat Model (Role)

Flow毎の脅威モデル

OAuth 2.0 Threat Model (Flow)

Access毎の脅威モデル

OAuth 2.0 Threat Model (Access)

移行メモ(アンカーの重複): 元ページでは「Flow 毎」と「Access 毎」の
見出しに同じアンカー ID が振られていた(PukiWiki 側の記述ミス)。
移行先では見出しの文字列がそのままアンカーになるため影響はないが、
区別が付くよう見出しに対象を補った。

セキュリティ考慮事項

脅威を緩和するために推奨される対策。

General のセキュリティ考慮事項

OAuth 2.0 Security Considerations (General)

Role毎のセキュリティ考慮事項

OAuth 2.0 Security Considerations (Role)

ざっくり

対策

漏洩対策

  • SSL/TLS(サーバ証明)を利用する。
    OAuth 2.0 Security Considerations (General)を参照)
  • 正規の Client へ発行されたトークンの漏洩に注意。
    • code(state):code 置換攻撃が可能。
    • access_token:access_token を利用可能。

エンドポイント防御

  • state を付与・検証する。
  • redirect_uri 検証を行う。
  • クライアント認証を行う。

トークン堅牢化

  • トークン

    • refresh_token
    • access_token
    • code
    • , etc.
  • 低いエントロピーの値を使用しない。

  • バインドする。

    • Client(aud: client_id)
    • Resource Owner(sub: sub)
    • Resource Server(aud: client_id or Endpoint)
  • access_token を JWT 化する。

補足(「バインドする」の狙い): トークンに aud / sub を入れて
「誰が・誰に向けて・誰の権限で」発行されたかを刻んでおくと、
盗まれたトークンや取り違えたトークンを受け取った側が拒否できる。
上の 3 つのバインドは、
OAuth 2.0 Threat Model (Implicit Flow)
「access_token 置換による OAuth ログイン」への直接の対策になっている。
なお aud に Resource Server を指定する仕組みは、後に
Resource Indicators for OAuth 2.0 として
標準化された。

トークン検証

  • JWT 化した場合、)Client、Resource Server でも、

    • 署名検証する。

    • クレームセット検証する。

      • iss(issuer)
        iss は署名検証があるので偽装困難
      • aud(client_id)
        Resource Server でも aud によるクライアント検証を行う。
      • sub(ユーザ ID)
        ユーザへの明示に加え、
        Client、Resource Server で認証済みリクエストで sub 検証するなど。
  • Authorization Server を用いた access_token 検証

    • 署名検証する。

    • クレームセット検証する。

      • iss(issuer)
      • aud(client_id)
      • sub(ユーザ ID)
      • jti(無効化状況)
    • クレームセットを JSON で返却
      Client、Resource Server で検証を容易にする。

ユーザの教育

  • 偽造サーバの識別
  • 組み込みブラウザに注意

(組み込みブラウザについては
OAuth 2.0 for Native Apps」「AppAuth」を参照)

注意

オープン・リダイレクタ

  • 完全な redirect_uri の事前登録と検証
  • スターターとアクセストークン・リクエストでの redirect_uri の要求

自動再認証、認可画面非表示

  • 悪意のあるクライアントと組み合わさる。
  • その際の scope など注意が必要。

クライアント登録機能

  • 悪意のあるクライアントが容易に登録可能。
  • 悪意のあるクライアント対策の実装が必要。

OpenID Connect - Dynamic Client Registration
初期アクセス トークンの節を参照)

パブリック・クライアント

ネイティブアプリや JS アプリのように secret を秘匿に保てないタイプ。

  • サーバより脅威が多い。

    • 盗難
    • リエンジ
    • ストレージ
    • ウィルス
    • 脆弱性
  • JS アプリ(SPA)の場合は、
    Implicit Flowを使用する。

  • ネイティブの場合は、
    OAuth PKCEを利用する。

移行メモ(現在は逆): 「JS アプリ(SPA)の場合は Implicit Flow を使用する」は
RFC 6819 当時(2013 年)の前提である。
その後 Implicit Flow は
OAuth 2.0 Security Best Current Practice
OAuth 2.1廃止され、
現在は SPA でもネイティブと同じく Authorization Code +
PKCE
を使うのが正しい。
元ページの記述は当時の記録として残す。
詳しくは「OAuth 2.0 for Browser-Based Apps」を参照。

参考


Tags: IT国際標準, 認証基盤, クレームベース認証, OAuth

⚠️ **GitHub.com Fallback** ⚠️