PKCE

2023-03-25 (土) 20:16:14

PKCE

名称

  • Proof Key for Code Exchange by OAuth Public Clients
  • ピクシー

概要

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

攻撃手法

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

PKCE の仕組み(攻撃の対策方法)

使うもの

  • code_verifier
    • 検証コード
    • ランダムな文字列
  • code_challenge
    • チャレンジコード
    • code_verifierに対してcode_challenge_methodで指定した処理をして生成した値
  • code_challenge_method
    • code_challengeを生成する際の計算方法
      • plain(検証コードそのまま)
      • S256(Base64-URL(SHA-256(検証コード)))

フロー

  1. スマホアプリでcode_challengeを生成する
    1. code_verifierを生成する
    2. code_verifierに対してcode_challenge_methodで指定された処理をしてcode_challengeを生成する
  2. スマホアプリが認可サーバに送る認可リクエストにcode_challengecode_challenge_methodを追加する
  3. 認可サーバはcode_challengecode_challenge_methodを保存する
  4. スマホアプリが認可サーバに送るトークンリクエストにcode_verifierを追加する
  5. 認可サーバはcode_verifierを検証する
    1. code_verifierに対してcode_challenge_methodで指定された処理をしてcode_challengeを生成する
    2. 生成したcode_challengeと保存していたcode_challengeが一致しているか確認する

関連用語