PKCE のバックアップの現在との差分(No.4)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#author("2023-03-25T16:10:52+09:00","default:k1rou","k1rou")
#author("2023-03-25T20:16:14+09:00","default:k1rou","k1rou")
*PKCE [#ea019304]
**名称 [#ddc1723f]
-Proof Key for Code Exchange by OAuth Public Clients
-ピクシー

**概要 [#mf0ac42e]
-RFC7636
--[[OAuth]]の拡張仕様
-認可コード横取り攻撃対策
-パブリッククライアント(主にスマホアプリ)で[[OAuth]] を利用する場合の[[脆弱性]]を防ぐ仕組み
--攻撃者は認可レスポンスのリダイレクト先(リダイレクトエンドポイント)で待機して認可コードを窃取する
--攻撃者によるトークンリクエストに対してアクセストークンを発行することを防ぐ

*攻撃手法 [#ra075fbb]
+攻撃者が用意した不正なスマホアプリを誤ってインストールさせる
+正規のスマホアプリからの認可リクエストに対する認可サーバからの認可レスポンスを不正アプリが受信して、認可コードを不正に入手する
--認可レスポンスがブラウザ経由でアプリに連携される際に、ブラウザは送り先のアプリをカスタムスキームとクライアントIDで判別する
--不正アプリは正規のアプリと同じカスタムスキームとクライアントIDを利用することで横取りが成立してしまうことがある

*PKCE の仕組み(攻撃の対策方法) [#d2f523a7]
**使うもの [#t0c85ac7]
-検証コードとチャレンジコードを使う
-検証コード
-code_verifier
--検証コード
--ランダムな文字列

-チャレンジコード
--検証コードを元に生成する
---plain(検証コードそのまま)
---S256(Base64-URL(SHA-256(検証コード)))
-code_challenge
--チャレンジコード
--code_verifierに対してcode_challenge_methodで指定した処理をして生成した値

-code_challenge_method
--code_challengeを生成する際の計算方法
---plain(検証コードそのまま)
---S256(Base64-URL(SHA-256(検証コード)))

**フロー [#o4138676]
+スマホアプリが認可サーバに送る認可リクエストにチャレンジコードを追加する
+認可サーバはチャレンジコードを保存する
+スマホアプリが認可サーバに送るトークンリクエストに検証コードを追加する
+認可サーバは検証コードを検証する
++検証コードからチャレンジコードを生成する
++生成したチャレンジコードと保存していたチャレンジコードが一致しているか確認する
+スマホアプリで&color(white,green){code_challenge};を生成する
++&color(white,blue){code_verifier};を生成する
++&color(white,blue){code_verifier};に対して&color(black,yellow){code_challenge_method};で指定された処理をして&color(white,green){code_challenge};を生成する
+スマホアプリが認可サーバに送る認可リクエストに&color(white,green){code_challenge};と&color(black,yellow){code_challenge_method};を追加する
+認可サーバは&color(white,green){code_challenge};と&color(black,yellow){code_challenge_method};を保存する
+スマホアプリが認可サーバに送るトークンリクエストに&color(white,blue){code_verifier};を追加する
+認可サーバは&color(white,blue){code_verifier};を検証する
++&color(white,blue){code_verifier};に対して&color(black,yellow){code_challenge_method};で指定された処理をして&color(yellow,green){code_challenge};を生成する
++生成した&color(yellow,green){code_challenge};と保存していた&color(white,green){code_challenge};が一致しているか確認する

*関連用語 [#te149d08]
-[[OAuth]]
-[[OAuth2.0]]
-[[FAPI]]