MS_OAuthThreatModelAuthCodeFlow - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

OAuth 2.0 Threat Model (Authorization code Flow)

抂芁

OAuth 2.0 Threat Model and Security Considerationsの
Flow に着目した脅嚁モデルのうち、䞻に、code 挏掩にフォヌカスした内容。

code 挏掩

攻撃

蚘録から挏掩

  • HTTP referer
    Redirect ゚ンドポむントからのリダむレクト。

  • WWW サヌバの芁求ログ

  • WWW ブラりザの履歎情報

  • 䞋蚘「オヌプン・リダむレクタ」

察策

  • SSL/TLS の利甚

  • クラむアント認蚌

  • ブラりザ・キャッシュを自動的にクリヌンアップするために、
    redirect_uri のタヌゲット・ペヌゞをリロヌドする。

  • code

    • 短い有効期限
    • 1 回限りの䜿甚制限

共通項

共通的な圱響

code 挏掩により、

  • code を甚いたアクセストヌクン・リク゚ストが可胜になる。
    access_token, refresh_token の開瀺

  • ただし、アクセストヌクン・リク゚ストには、client_secret も必芁。

補足今は code_verifier が必芁: 「client_secret も必芁」ずいう
前提は Confidential Client にしか成り立たず、ネむティブ アプリや
SPA では成立しない
秘密を隠せないため。
ここを埋めたのが PKCERFC 7636で、
code を開始したクラむアントだけが知る code_verifier を
トヌクン芁求時に芁求する。
Security BCPRFC 9700/ OAuth 2.1
では すべおのクラむアントで PKCE 必須ずなっおおり、
本節の「code 挏掩」の脅嚁は倧幅に軜枛されおいる。

Client の信頌性

Authorization Code では、Client に code が枡る。
この Client の信頌性は、Client のタむプによっお異なる。

  • Web アプリケヌション
    グロヌバルに䞀意なネットワヌク゚ンドポむント
  • ネむティブクラむアント
    デバむスロヌカルリ゜ヌスカスタムスキヌム

補足カスタム スキヌムの奪い合い: 「デバむスロヌカルリ゜ヌス
カスタムスキヌム」が䞀意でないのが、ネむティブ アプリ特有の匱点である。
同じカスタム スキヌムmyapp://を埌から入れた別アプリが
暪取りできおしたうOS が保蚌しない。
このため OAuth 2.0 for Native AppsRFC 8252は、
Claimed HTTPS スキヌムiOS の Universal Links /
Android の App Linksか、ルヌプバック アドレス
http://127.0.0.1:{port}を掚奚しおいる。

単玔な攻撃

code の盗聎

圱響

䞊蚘の「共通的な圱響」

攻撃

盗聎

察策

  • SSL/TLS の利甚

  • クラむアント認蚌

  • code

    • 短い有効期限
    • 1 回限りの䜿甚制限

code のオンラむン掚枬

圱響

䞊蚘の「共通的な圱響」

攻撃

code のオンラむン掚枬

察策

  • クラむアント認蚌

  • code

    • 短い有効期限
    • 1 回限りの䜿甚制限
    • 高い゚ントロピヌを䜿甚
    • code を redirect_uri に玐付け怜蚌する。
      • redirect_uri は、スタヌタヌずアクセストヌクン・リク゚ストで必芁ずする。
      • code のオンラむン掚枬に加えclient_id、client_secret、
        redirect_uri が必芁。

DB から code を盗難

圱響

  • すべおの code の開瀺䞊蚘の「共通的な圱響」
  • 合わせお、client_id や redirect_uri の挏掩

攻撃

  • デヌタベヌスぞのアクセス暩を取埗
  • SQL むンゞェクション攻撃

察策

  • システムのセキュリティ察策を実斜
  • 暙準の SQL むンゞェクション察策を実斜
  • code ハッシュのみを栌玍

Client ぞの誘導による盗難

オヌプン・リダむレクタや、DNS たたは ARP スプヌフィングが甚いられる。

オヌプン・リダむレクタ

OAuth 2.0 Threat Model (Role)の
「オヌプン・リダむレクタ」も参照。

圱響

䞊蚘の「共通的な圱響」

攻撃

redirect_uri を䜿甚しお任意の URL に誘導

察策

redirect_uri のフルパス登録・怜蚌

code フィッシング

圱響

䞊蚘の「共通的な圱響」

攻撃

  • Clientず蚀うより、ココでは任意の redirect_uri
    に察する DNS たたは ARP スプヌフィングが行われる。
  • 悪意のある Client に誘導しお code を入手する。

察策

セッション・ハむゞャック

䞊蚘「code フィッシング」の考慮事項に、
「Client 登録機胜で登録された悪意のある Client」を远加した版。

圱響

䞊蚘の「共通的な圱響」

攻撃

  • 悪意のある Client が登録される。
  • 悪意のある Client に察する DNS たたは ARP スプヌフィングが行われる。
  • 悪意のある Client に誘導しお code を入手する。

察策

redirect_uri を SSL/TLS
サヌバ蚌明で保護

悪意のある Client の登録・誘導による盗難

  • 登録機胜で登録された Client なので、クラむアント認蚌は察策ずしお無効。

  • 埓っお、アクセストヌクン・リク゚ストをパスされる可胜性が高たる。

  • ただし、code ず client䟋えば、redirect_uri などを、
    玐付ける仕組みを導入すれば、察策は可胜ず思われる。

補足この「玐付ける仕組み」が PKCE: 元ペヌゞが
「察策は可胜ず思われる」ず掚枬しおいる仕組みは、
code を「それを開始したクラむアント自身」に瞛るずいうもので、
たさに PKCE が実珟したこずである
redirect_uri ではなく、クラむアントが毎回生成する
code_verifier のハッシュで瞛る点が、より匷い。
本ペヌゞの原文が 2013 幎、PKCE の RFC 7636 が 2015 幎なので、
著者の芋立おは埌の暙準化を先取りしおいたこずになる。

セッション・ハむゞャック

䞊蚘「セッション・ハむゞャック」を参照。

WebView などの組蟌ブラりザResource Owner 停装

圱響

攻撃者は、Resource Owner の認蚌資栌情報を盗み、リ゜ヌスにアクセス

攻撃

  • 悪意のある Client が登録される。

  • 既存ログむン・セッションを持っおいる。

    • 倖郚ブラりザで既存のセッションを乱甚
    • 特定のデバむスでブラりザ間のクッキヌを乱甚
  • 悪意のある Client は、

    • 以䞋の方法で認可画面の POST バックをプログラムで送信

      • WebView などの組蟌ブラりザを組み蟌み、
      • Authorization Server によっお送信された HTML Form を解釈し、
      • HTML Form に察応する POST バックを自動的に送信。
    • これにより、別の scope のアクセストヌクンを同意なしで取埗可胜。

察策

  • これは、CSRF 察策を䜿甚しお防止するこずはできない。

  • 自動再認蚌、認可画面非衚瀺を䜿甚しない行わない。

  • パスワヌド認蚌ずナヌザ同意を 1 ぀のフォヌムにたずめ、

    • CAPTCHA を䜿甚するか、
    • ワンタむム秘密を Resource Owner に䜿甚する。
  • 任意の通知手段によっお認可を Resource Owner に通知する。

スクリヌン・スクレむピング

圱響

悪意のある Client が、アクセストヌクンを取埗できる。

攻撃

  • 悪意のある Client が登録される。
  • 悪意のある Client は、フロヌ䞭のナヌザ同意を、
    スクリヌン・スクレむピング技術を利甚しおシミュレヌトするなど。

察策

  • redirect_uri 怜蚌

  • 画面の衚瀺

    • 自動再認蚌の抑止
    • 認可画面の衚瀺
      • 目的scopeの提瀺
      • client_id に察応する名称
      • access_token の期間
      • スクリヌン・スクレむピングの防止CAPTCHA

code の眮換・泚入

  • 既存 Client を利甚した攻撃なので、Client 登録機胜が無くおも攻撃可胜。

  • code の眮換・泚入があり、其々以䞋のような特城がある。

    • code の眮換「被害者のアカりント」でリ゜ヌスにアクセス
    • code の泚入「攻撃者のアカりント」でリ゜ヌスにアクセス

※ 䞊蚘の「共通的な圱響」には合臎しないアクセストヌクンの取埗が可胜。

挏掩した利甚者の code 眮換

圱響

攻撃者は、「被害者のアカりント」でリ゜ヌスにアクセス可胜。
被害者のアカりントに玐付いたリ゜ヌスの CRUD が可胜

攻撃

  • 被害者の codestateを入手する。

    • 䞊蚘「単玔な攻撃」では、state を入手できない。
    • 脆匱な Authorization Server の既存のクラむアントの redirect_uri を
      線集・远加する。
      ココでは、redirect_uri パラメタではなく、
      登録されおいるデヌタそのものの線集・远加を蚀っおいる暡様
  • codestateを他の正芏のクラむアントに向けお眮換する。

察策

  • redirect_uri の改ざんなどがされないようにする。

  • その他

    • クラむアント認蚌
    • 他のフロヌを䜿甚する。

CSRF による攻撃者の code 泚入

圱響

脆匱な Client によっお被害者は「攻撃者のアカりント」でリ゜ヌスにアクセス可胜。
攻撃者のアカりントに玐付いたリ゜ヌスのストアに
被害者のデヌタを登録させるこずが出来る

攻撃

攻撃者は、脆匱な Client をタヌゲットずしお、

  • Client を察象ずした code を収集する。
  • その code を含む Client ぞの CSRF リンクを螏たせる。

察策

  • state パラメタを䜿甚し、CSRFを防止する。
  • ナヌザの教育停造サむトの CSRF のリンクの識別

code 眮換による OAuth ログむン

圱響

倖郚ログむン・シナリオで、攻撃者は、「被害者のアカりント」でログむン可胜
堎合によっおは、悪意のあるアプリケヌションにログむンさせるこずが出来る

※ 倖郚ログむン・シナリオでは、userinfo ゚ンドポむントに察する
リク゚ストによっおログむンが完了する。

攻撃

䞊蚘「挏掩した利甚者の code 眮換」を倖郚ログむン・シナリオで利甚する。

察策

code を access_token に亀換する際、

  • 事前のナヌザ認蚌
  • ナヌザ ID ず code の察応付け
    OpenID / OpenID Connectや
    SAMLを利甚
    aud による Client 制限を行うこずが出来る

補足state だけでは足りない、が結論: 本節に䞊ぶ 3 ぀の攻撃
眮換・泚入・OAuth ログむンは、いずれも
state パラメタだけでは防げないずいう点で共通しおいる
state は「自分が始めたフロヌか」しか確かめられない。
珟圚の暙準的な察策は次の 2 ぀である。

  • PKCERFC 7636
    code を開始したクラむアント自身に瞛る。code 泚入ぞの盎接の答え。
  • iss パラメタRFC 9207
    認可レスポンスに発行者を明瀺し、耇数 IdP 構成での取り違えを防ぐ。

倖郚ログむンOAuth ログむンに぀いおは、
OpenID Connect の ID トヌクンを䜿い、
aud / nonce / iss を怜蚌するのが正解である
OAuth による倖郚ログむン認蚌の研究を参照。

アクセストヌクンたで取埗が可胜な攻撃

※ 䞊蚘の「共通的な圱響」には合臎しないアクセストヌクンの取埗が可胜。

  • 䞊蚘「WebView などの組蟌ブラりザResource Owner 停装」
  • 䞊蚘「スクリヌン・スクレむピング」
  • 䞊蚘「挏掩した利甚者の code 眮換」
  • 䞊蚘「CSRF による攻撃者の code 泚入」
  • 䞊蚘「code 眮換による OAuth ログむン」

クリック・ゞャッキング

圱響

攻撃者は、Resource Owner の認蚌資栌情報を盗み、リ゜ヌスにアクセス

攻撃

  • 䞊蚘「スクリヌン・スクレむピング」に近いが、

    • 「悪意のある Client」の
      • 「POST バックを自動的」や、
      • 「スクリヌン・スクレむピング技術」ではなく
    • 「停造サむト」の「クリック・ゞャッキング」ずする。
  • 以䞋で認蚌枈みアクセスする。

    • Resource Owner を停造サむトに誘導する。
    • ダミヌボタンのセットの䞊に、透明な iFrame でタヌゲットサむトを読み蟌む。
    • ボタンをクリックするず、実際には隠しペヌゞの Authorize ボタンなどをクリック。

察策

  • ナヌザの教育停造サむトのクリック・ゞャッキングの識別

  • IFrame の回避

    • 新しいブラりザ
      X-FRAME-OPTIONS ヘッダ
    • 叀いブラりザ
      アンチフレヌム、フレヌムバストの JavaScript
      すべおのブラりザで効果的でない

補足珟圚は frame-ancestors: X-Frame-Options は今も
互換のために送られるが、暙準ずしおは
Content-Security-Policy の
frame-ancestors 'none' が埌継である。
認可゚ンドポむントは iframe 埋め蟌みを䞀切蚱さないのが原則で、
「フレヌムバストの JavaScript」は珟圚では䞍芁
か぀、sandbox 属性付き iframe では無力。

DoS によるサヌバ機胜のダりン

DoS によるリ゜ヌス枯枇

圱響

リ゜ヌス枯枇によるサヌバ機胜のダりン

攻撃

DoS により、code プヌルなどのリ゜ヌスを枯枇させる。

察策

  • Resource Owner 毎に付䞎されるアクセストヌクンの数を制限
  • code に十分な量の゚ントロピヌを含める。

移行メモ意味の取れない箇所: 元ペヌゞの
「code に些现ではない量の゚ントロピヌを含める」は、
RFC 6819 の "non-trivial amount of entropy" の盎蚳ず思われる。
趣旚は「掚枬されない皋床に十分な゚ントロピヌを持たせる」なので
その旚に曞き改めた。
なお、この項ではcode を保存せずステヌトレスに怜蚌する
眲名付き code にするこずが、プヌル枯枇に察する
より盎接的な回避策になる。

生成 code による DoS

圱響

リ゜ヌス枯枇によるサヌバ機胜のダりン

攻撃

生成 code を䜿甚しお、redirect_uri にボットネットで攻撃する。

察策

  • state パラメタを䜿甚し負荷軜枛を行う。
  • 無効な code 芁求の数がしきい倀を超える
    • クラむアントからの接続を制限 / 犁止する。
    • ナヌザ・アカりントからの接続を制限 / 犁止するClient 偎で認蚌が必芁。

参考


Tags: IT囜際暙準, 認蚌基盀, クレヌムベヌス認蚌, OAuth

⚠ **GitHub.com Fallback** ⚠