OAuth / Connect における CSRF Attack の新パターン
昨日こんなのが OAuth ML に流れてました。
[OAUTH-WG] Another CSRF attack
前提条件
RP (Relying Party a.k.a. OAuth Client) が2つ以上の IdP (Identity Provider a.k.a. OAuth Server) と連携している状況で、片方の IdP に悪意がある。
- 悪意ある IdP = AIdP (A は Attacker の略)
- その他の IdP = HIdP (H は Honest の略)
攻撃フロー
- Victim が AIdP を使って RP へのログインを試みる。
- RP は Authorization Request を AIdP に送る。
- AuthZ Req には Browser Session と紐付いた
state
パラメータをつけている。
- AuthZ Req には Browser Session と紐付いた
- AIdP は Victim を認証し、必要に応じて同意を取得する (ふりをする)
- 同時に AIdP は裏で HIdP から
code
を取得する。 - HIdP の code は Attacker の HIdP 上のアカウントに紐付いているもの。
- 同時に AIdP は裏で HIdP から
- AIdP は HIdP から取得した
code
を、RP の HIdP 用redirect_uri
に返す。- この時 Step2 で RP が発行した
state
を付与する。
- この時 Step2 で RP が発行した
- RP は Browser Session と紐付いた
state
を検証した上でcode
を HIdP の Token Endpoint に送る。 - HIdP は Attacker のアカウントに紐付いた
access_token
を返す。 - RP は Victim をログインさせる。
- ここで HIdP 上の Attacker アカウントと RP 上の Victim アカウントが紐づけられる。
そして、Attacker は任意のタイミングで自身の HIdP 上のアカウントを使って、RP 上の Victim のアカウントにログインできる。
防御策
state
をリクエスト先の IdP とも紐づけましょう。