MS_OAuthThreatModelROPCFlow - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

OAuth 2.0 Threat Model (Resource Owner Password Credentials Flow)

概要

OAuth 2.0 Threat Model and Security Considerations
Flow に着目した脅威モデルのうち、ここでは唯一、
サインイン・プロセスの問題を扱う(ただし非対話)。

OAuth 2.0 では IdP の仕様について言及されていないので。

補足(このフローは廃止された): Resource Owner Password Credentials
(ROPC)グラント種別は、OAuth 2.0 Security BCP
(RFC 9700)で 使用してはならないとされ、
OAuth 2.1 の仕様本体からも削除された。
本ページの脅威分析は「なぜ廃止に至ったか」の理由そのものであり、
移行を検討する際の判断材料として読むと分かりやすい。
移行先は、対話が可能なら Authorization Code + PKCE
入力手段が乏しい機器なら
Device Authorization Grant になる。

サインイン・プロセスの問題

レガシー / マイグレーションの理由でよく使用される。

攻撃

  • ユーザ ID / パスワードの漏洩
  • 非対話的問題を突いた攻撃。

対策

限定的に利用する。

  • 基本認証から移行する過渡期
  • UserAgent が Authorization Server に接続できない場合
  • Client と Authorization Server が同じ組織に利用されているケース

共通項

  • Resource Owner は認可プロセスを制御できない。
  • Client にユーザ ID / パスワードが渡る。

共通的な影響

悪意のある Client に scope の広いトークンが悪用され得る。

  • Resource Owner は、認可プロセスを制御できない。
    故に、非対話的問題を突いた攻撃を受け易い(scope の広いトークン)。

  • Client にユーザ ID / パスワードが渡る。
    故に、トークン取り消しが機能しない。

補足(MFA が成立しないのが決定打): 元ページが挙げる
「認可プロセスを制御できない」「Client に生の資格情報が渡る」に加え、
現在最も重く見られているのは
多要素認証・リスクベース認証・パスワードレスが一切使えないという点である。
ROPC は「ID とパスワードを Client が受け取って中継する」形なので、
IdP 側が追加の画面(OTP 入力、デバイス認証、同意)を出す余地がない。
FIDO
Passwordless の UX
移行できないフロー、という言い方もできる。

ユーザ ID / パスワードの漏洩

ユーザ ID / パスワードの盗難

影響

上記の「共通的な影響」

攻撃

悪意のある Client によるユーザ ID / パスワード盗難

対策

  • Resource Owner に異なるサービスに同じ
    ユーザ ID / パスワードを使用しないように促す。
    (悪意のある Client が別のサービスにログイン可能)

  • refresh_token と client_id の紐付けを検証
    aud による Client 制限を行うことが出来る)

ユーザ ID / パスワードの盗聴

影響

上記の「共通的な影響」

攻撃

エンドポイントに対するユーザ ID / パスワード盗聴

対策

  • SSL/TLS を利用する。
  • 平文認証を使用しない代替認証を使用する。

ユーザ ID / パスワードのオンライン推測

影響

単一のユーザ ID / パスワードの組み合わせの開示

攻撃

有効なユーザ ID / パスワードの組み合わせを推測

対策

  • 他のフローを使用する。

  • サインイン

    • 安全なパスワード・ポリシーを設定する。
    • ロックアウトを使用する。
    • タールピットを使用する。
    • CAPTCHA を使用する。
  • クライアント認証を併用する。

移行メモ(誤字): 元ページの「単一のユーザ ID / パスワードの
組み合わせの啓示」は「開示」の誤りと解して修正した。

補足(ロックアウトは両刃): ROPC は
IdP の画面を経由しないため、攻撃者は認可画面や CAPTCHA を
迂回して総当たりできる。一方でアカウント ロックを厳しくすると、
攻撃者が任意のアカウントを狙ってロックさせる
(サービス妨害)ことも容易になる。
現在は「ロックアウト」より
漏洩パスワード リストとの照合・IP 単位のスロットリング・
リスクベースの追加認証
を組み合わせるのが一般的である
(そしてそれらはいずれも ROPC では実施しにくい)。

Client 側でのユーザ ID / パスワードの露見アクシデント

影響

上記の「共通的な影響」

攻撃

Client が十分な保護を提供していない場合、偶発的に起きる。

対策

  • 他のフローを使用する。
  • (Client 側で)ログのパスワードを難読化
  • (Client - AuthZ 側で)
    • 要求の機密性を確保する(TLS、VPN)
    • ダイジェスト認証を使用

DB からユーザ ID / パスワードを盗難

影響

すべてのユーザ ID / パスワードの開示

攻撃

  • データベースへのアクセス権を取得
  • SQL インジェクション攻撃

対策

  • システムのセキュリティ対策を実施
  • 標準の SQL インジェクション対策を実施
  • ハッシュのみを格納

補足(「ハッシュのみを格納」の中身): パスワードは
単純なハッシュではなく、ソルト付きの低速ハッシュで保存する。
現在の推奨は Argon2id、次いで scrypt / bcrypt / PBKDF2 で、
SHA-256 などをそのまま使うのは不可である
(GPU による総当たりが現実的な速度で通るため)。

非対話的問題を突いた攻撃

ユーザ ID / パスワードのオンライン推測

上記「ユーザ ID / パスワードのオンライン推測」を参照。

意図しない不要に大きな scope

影響

悪意のある Client が、不要に大きな scope を持ったトークンを取得できる。

攻撃

悪意のある Client が、不要に大きな scope を持ったトークンを要求する。

対策

  • 他の(対話的)フローを使用する。

  • 認可される scope を、

    • 当該(非対話的)フローで制限
    • Client の信頼性によって緩和
    • 任意の通知手段によって Resource Owner に通知する。

refresh_token による長期的認可の維持

影響

長期的認可の維持
(この場合、Resource Owner の Credential 変更も有効でない)

攻撃

自動再認可で refresh_token を入手。

対策

  • 他の(対話的)フローを使用する。

  • 当該フローで refresh_token の発行を

    • しない。
    • Client の信頼性によって緩和
    • 任意の通知手段によって Resource Owner に通知する。

補足(パスワード変更で失効させる): 「Credential 変更も有効でない」
という指摘への現在の答えは、
パスワード変更・リセット時にそのユーザーの refresh_token を
一括失効させる
という運用である
(多くの IdP が既定でこの挙動を持つ)。
併せて refresh_token のローテーションを行い、
使い回しを検知したらファミリごと失効させる
Security BCP の推奨)。

参考


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

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