PKCE:パブリッククライアントの保護
Proof Key for Code Exchangeの仕組みと、認可コードインターセプト攻撃を防ぐ方法を理解します。
「PKCE:パブリッククライアントの保護」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
認可コードの傍受
PKCEがない場合、モバイルアプリケーションは認可コード傍受攻撃に対して脆弱です。認可サーバーがアプリに登録されたカスタムURIスキーム(例:myapp://callback)へ認可コードをリダイレクトすると、同じデバイス上で同じURIスキームを登録した悪意のあるアプリがリダイレクトを傍受してコードを盗めます。
傍受の仕組み
攻撃の流れは次のとおりです。悪意のあるアプリが、正規のアプリと同じカスタムURIスキームを登録します。認可サーバーがコードをmyapp://callbackへリダイレクトすると、OSは両方のアプリをハンドラーとして提示することがあります。ユーザーが悪意のあるアプリを選択した場合や、OSがそのアプリを既定として選択した場合、攻撃者は認可コードを受け取り、クライアントシークレットを知らなくてもトークンと交換できます。
PKCEコードベリファイア
PKCE(RFC 7636)は、認可コードフローに動的に生成された秘密情報を追加します。フローを開始する前に、クライアントはコードベリファイアと呼ばれる43~128文字の暗号学的に安全なランダム文字列を生成します。この文字列は認可リクエストごとに一意であり、トークン交換の段階まで送信されることはありません。
コードチャレンジの計算
クライアントは、ベリファイアからコードチャレンジを計算します:code_challenge = BASE64URL(SHA256(code_verifier))。RFC 7636ではSHA256を使用する方法が必須です(ベリファイアをそのまま送信する "plain" メソッドは推奨されません)。コードチャレンジはベリファイアを一方向変換したものなので、チャレンジを知ってもベリファイアはわかりません。
認可リクエストへのコードチャレンジの追加
認可リクエストには、次の2つの追加パラメーターを含めます:"code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256"。認可サーバーは、発行した認可コードに対応付けてコードチャレンジを保存します。この段階では、傍受される可能性のある秘密情報をサーバーに送信しません。
コードベリファイアを使ったトークン交換
トークン交換(トークンエンドポイントへのPOST)の際、クライアントは認可コードとともに "code_verifier=ORIGINAL_RANDOM_STRING" を含めます。認可サーバーはBASE64URL(SHA256(code_verifier))を計算し、保存されているcode_challengeと一致することを確認します。ベリファイアを生成した正規のクライアントだけが、この検証に合格できます。
PKCEで傍受が失敗する理由
攻撃者が認可コードを傍受しても、受け取れるのはコードと公開情報であるコードチャレンジだけです。コードをトークンと交換するには、コードベリファイアを提示する必要があります。ベリファイアは正規のクライアントが生成し、トークン交換まで送信されないため(トークン交換は安全に行われます)、攻撃者はベリファイアを計算することも取得することもできません。
PKCEによる認可コードインジェクションの防止
PKCEは、攻撃者がリダイレクト中の有効なコードを盗んだコードに置き換える、認可コードインジェクション攻撃も防ぎます。盗まれたコードに対応するチャレンジは、被害者のクライアントが提示するコード検証子と一致しないため、トークン交換は失敗します。PKCEは、複数の攻撃ベクトルに対する多層防御を同時に提供します。
すべてのクライアントでPKCEを使用
RFC 7636は当初、パブリッククライアント(クライアントシークレットを持たないクライアント)向けのソリューションとして説明されていました。しかし、OAuth Security BCPとOAuth 2.1では、クライアントシークレットを持つコンフィデンシャルクライアントを含め、すべてのクライアントにPKCEを要求しています。PKCEはクライアント認証とは独立した保護を提供するため、あらゆるクライアントに有効です。
OAuth 2.1におけるPKCE
OAuth 2.1(draft-ietf-oauth-v2-1)は、OAuth 2.0 Security BCPにまとめられたセキュリティのベストプラクティスを1つの文書に統合しています。OAuth 2.1では、すべての認可コードフローでPKCEを必須とし、インプリシットフローを非推奨とし、リフレッシュトークンローテーションを要求しています。PKCEは事実上、新しいOAuth 2.0実装に必要な基本要件です。
実装上の注意点
PKCEを正しく実装するには、コード検証子の生成に暗号学的に安全な乱数生成器を使用すること(少なくとも32バイトの乱数を生成してからbase64urlエンコードすること)、クライアント内でコード検証子を安全に保管すること(URLやログには保存しないこと)、S256メソッドを使用すること(plainは使用しないこと)、そしてトークン交換後にコード検証子を破棄することが必要です。最新のOAuthライブラリの多くはPKCEを自動的に処理します。
PKCEにおけるコード検証子の確認
PKCEでは、コード検証子とコードチャレンジにはどのような関係がありますか?
レッスンのまとめ:PKCEのセキュリティ
PKCE(RFC 7636)は、正規のクライアントだけが知る動的に生成されたコード検証子に各コードを結び付けることで、認可コードのインターセプトを防ぎます。コード検証子をハッシュ化してコードチャレンジを生成し、コードチャレンジは公開で送信します。トークン交換には元のコード検証子が必要です。PKCEはインターセプト攻撃とインジェクション攻撃の両方を防ぎます。OAuth 2.1では、すべての認可コードフローでPKCEが必須です。
よくある質問
「PKCE:パブリッククライアントの保護」レッスンは無料ですか?
はい。「PKCE:パブリッククライアントの保護」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「PKCE:パブリッククライアントの保護」で何を学びますか?
Proof Key for Code Exchangeの仕組みと、認可コードインターセプト攻撃を防ぐ方法を理解します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「PKCE:パブリッククライアントの保護」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- OAuth 2.0のフローとトークンの種類
- PKCE:パブリッククライアントの保護
- OpenID ConnectのクレームとIDトークン
- OAuthの脆弱性と攻撃パターン