#author("2023-03-25T20:15:39+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 --検証コード --ランダムな文字列 -code_challenge --チャレンジコード --code_verifierに対してcode_challenge_methodで指定した処理をして生成した値 -code_challenge_method --code_challengeを生成する際の計算方法 ---plain(検証コードそのまま) ---S256(Base64-URL(SHA-256(検証コード))) **フロー [#o4138676] +スマホアプリで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が一致しているか確認する +スマホアプリで&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]]