PKCE
2023-03-25 (土) 20:16:14
PKCE †
名称 †
- Proof Key for Code Exchange by OAuth Public Clients
- ピクシー
概要 †
- RFC7636
- OAuthの拡張仕様
- 認可コード横取り攻撃対策
- パブリッククライアント(主にスマホアプリ)でOAuth を利用する場合の脆弱性を防ぐ仕組み
- 攻撃者は認可レスポンスのリダイレクト先(リダイレクトエンドポイント)で待機して認可コードを窃取する
- 攻撃者によるトークンリクエストに対してアクセストークンを発行することを防ぐ
攻撃手法 †
- 攻撃者が用意した不正なスマホアプリを誤ってインストールさせる
- 正規のスマホアプリからの認可リクエストに対する認可サーバからの認可レスポンスを不正アプリが受信して、認可コードを不正に入手する
- 認可レスポンスがブラウザ経由でアプリに連携される際に、ブラウザは送り先のアプリをカスタムスキームとクライアントIDで判別する
- 不正アプリは正規のアプリと同じカスタムスキームとクライアントIDを利用することで横取りが成立してしまうことがある
PKCE の仕組み(攻撃の対策方法) †
使うもの †
- code_verifier
- 検証コード
- ランダムな文字列
- code_challenge
- チャレンジコード
- code_verifierに対してcode_challenge_methodで指定した処理をして生成した値
- code_challenge_method
- code_challengeを生成する際の計算方法
- plain(検証コードそのまま)
- S256(Base64-URL(SHA-256(検証コード)))
- code_challengeを生成する際の計算方法
フロー †
- スマホアプリでcode_challengeを生成する
- code_verifierを生成する
- code_verifierに対してcode_challenge_methodで指定された処理をしてcode_challengeを生成する
- スマホアプリが認可サーバに送る認可リクエストにcode_challengeとcode_challenge_methodを追加する
- 認可サーバはcode_challengeとcode_challenge_methodを保存する
- スマホアプリが認可サーバに送るトークンリクエストにcode_verifierを追加する
- 認可サーバはcode_verifierを検証する
- code_verifierに対してcode_challenge_methodで指定された処理をしてcode_challengeを生成する
- 生成したcode_challengeと保存していたcode_challengeが一致しているか確認する