OAuth2.0の拡張仕様の一つであるPKCE(Proof Key for Code Exchange:ピクシーと読む)について説明します。
- PKCEは何のために使われるか
- 認可コード横取り攻撃とは
- PKCEの原理
PKCEは何であるか、何のために使われるか
OAuth2.0の認可コードフローにおいて認可コード横取り攻撃というものがあり、それへの対策方法としてPKCEが使われます。
そのため、まずは認可コード横取り攻撃から説明します。
認可コード横取り攻撃とは
認可コード横取り攻撃とは、
- (どこで)スマホアプリを持つエンド端末上で、
- (いつ)認可エンドポイントレスポンスによってアプリが起動される 1 際に、
- (誰が)同一端末上にインストールされている悪意のあるアプリが、
- (どのように)想定されたアプリに代わり起動することで、
認可コードを窃取する攻撃のことです。
まずは、ユーザーがスマホアプリにリソースアクセス許可を与える正常なフローを示します。
次に、悪意のあるアプリが介入し、発行された認可コードが窃取される場合のフローを示します。
悪意のあるアプリは正規のアプリと同じカスタムURLスキーム(図ではtheApp://)で起動するようになっているのがポイントです。悪意のあるアプリはこれによって認可コードを窃取します。
悪意のあるアプリが認可コードを窃取してからは、正規のアプリに成りすましてアクセストークンを取得し、ユーザーリソースにアクセスする等の悪用が考えられます。
この攻撃への対策として仕様が定められたのがPKCEです。
PKCEの原理
繰り返しになりますが認可コード横取り攻撃への対策として使われるのがPKCEです。
PKCEでは既存のフローに加えて以下を実施します。
①アプリは認可EPへのリクエスト時にハッシュ値であるcode_challengeを送る
- IdPサーバーはこの値を保管する
②アプリはトークンEPへのリクエスト時にハッシュ値の元の値であるcode_verifierを送る
- IdPサーバーはこの値のハッシュ値を計算しcode_challengeと照合する
本物のアプリであれば、認可EPが受け取ったハッシュ値の元の値をトークン発行時も知っているはずである、という原理です。
以下がchallengeとverifierの照合成功時のフローです。
悪意のあるアプリを登場させてみましょう。
カスタムURLスキームにより認可コードの窃取まではできるものの、その後正しいcode_verifierを用意できずにトークンリクエストが弾かれてしまいます。
アクセストークンが取得できない限り用を成さないので、PKCEは攻撃の対策に成功しています。
以上がPKCEの原理の説明でした。2