OAuthの脆弱性と攻撃パターン
リダイレクトURIの改ざん、認可エンドポイントに対するCSRF、トークン漏洩の脆弱性について学習します。
「OAuthの脆弱性と攻撃パターン」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
redirect_uriにおけるオープンリダイレクト
OAuth認可サーバーは、redirect_uriパラメーターを厳密に検証する必要があります。サーバーが前方一致やワイルドカード一致を許可すると(たとえば「https://app.example.com」で始まる任意のURLを受け入れる場合)、攻撃者は「https://app.example.com.attacker.com/steal」や、正規のドメイン上にあるオープンリダイレクトへリダイレクトする認可リクエストを作成し、認可コードを盗むことができます。
認可エンドポイントに対するCSRF
CSRF対策がない場合、攻撃者はOAuthフローを開始し、被害者のブラウザーをだまして認可を完了させることができます。被害者は意図せず攻撃者のクライアントを認可してしまいます。「state」パラメーター(RFC 6749)はこれを防ぎます。クライアントがランダムなstateを生成してリクエストに含め、コールバックで一致することを検証します。一致しなければフローを中止します。
認可コードのインターセプト
モバイルプラットフォームでは、悪意のあるアプリが正規のOAuthクライアントと同じカスタムURIスキームを登録し、ユーザー認証後にリダイレクトされた認可コードをインターセプトする可能性があります。PKCE(RFC 7636)が完全な防御策となります。インターセプトされたコードは、フローの開始時に正規のアプリだけが生成したコード検証子がなければ利用できません。
Refererヘッダーによるトークン漏えい
IDトークンやアクセストークンがURLフラグメントまたはクエリパラメーターに含まれていると、そのページから以降のページへ移動する際にURLがRefererヘッダーに含まれ、サードパーティの分析スクリプトやCDNプロバイダーにトークンが漏えいする可能性があります。トークンがURLに現れないように、必ず認可コードフローとバックチャネルでのトークン配信を使用してください。
複数プロバイダー構成におけるミックスアップ攻撃
クライアントが複数のOAuthプロバイダーに対応している場合、ミックスアップ攻撃によって、Provider Aから取得した認可コードをProvider Bのトークンエンドポイントに送信させられる可能性があります。クライアントは、IDトークンの「iss」クレームを検証し、stateパラメーターまたはJARM(JWT-Secured Authorization Response Mode)を使って、コールバックをフローを開始した特定のプロバイダーに結び付ける必要があります。
redirect_uriを介したSSRF
サーバーサイドリクエストフォージェリ(SSRF)攻撃は、redirect_uriに対してサーバー側のHTTPリクエストを行うOAuth実装を標的にします。認可サーバーが検証のためにredirect_uriを取得する場合、攻撃者は内部IPアドレス(たとえば http://169.254.169.254/latest/meta-data/)を指定し、クラウドインスタンスのメタデータや内部サービスにアクセスできます。厳密な許可リスト方式でredirect_uriを検証すれば、この攻撃を防止できます。
メールクレームの衝突によるアカウント乗っ取り
多くのアプリケーションは、OIDC IDトークンのemailクレームを使ってプロバイダー間のアカウントを関連付けています。攻撃者が、別のプロバイダーにある被害者のアカウントと一致するメールアドレスを管理している場合、そのメールアドレスを使って別のプロバイダーに登録し、被害者のアカウントにアクセスできる可能性があります。対策は、メールアドレスだけでなく、(iss、sub)の組み合わせだけでアカウントを関連付けることです。
JWTアルゴリズム混同
JWTアルゴリズム混同攻撃は、「alg」ヘッダーを信頼して検証アルゴリズムを選択する実装の弱点を悪用します。攻撃では、「alg」を「RS256」から「HS256」に変更し、サーバーの公開鍵をHMACの秘密鍵としてトークンに署名します(公開鍵は公開されているためです)。対策として、検証コードで想定するアルゴリズムを必ず明示し、トークンヘッダーのalgクレームを決して信頼しないでください。
同意画面の偽装によるOAuthフィッシング
攻撃者は、正規アプリに見える名前とロゴで悪意のあるOAuthクライアントを登録し、標的にフィッシングリンクを送ります。被害者には、悪意のあるアプリケーションに対する本物のOAuth同意画面(GoogleやMicrosoftなどがホストするもの)が表示され、アクセスを許可してしまいます。対策として、client_idが想定するアプリケーションに対応していることを確認してください。GoogleとMicrosoftは、正規アプリ向けにクライアント検証プログラムを提供しています。
スコープエスカレーション攻撃
スコープエスカレーションは、クライアントがユーザーの認可した範囲を超える、より広い権限を持つトークンを取得したときに発生します。トークンエンドポイントでのスコープ検証を省略すること、異なるリクエストのスコープを統合してトークンをキャッシュすること、発行したトークンのスコープが認可されたスコープを超えていないことを検証しないことなどの実装上の欠陥は、OAuthを介した権限昇格につながる可能性があります。
セキュリティのベストプラクティスのまとめ
OAuth実装を防御するには、redirect_uriを完全一致で検証し、すべてのパブリッククライアントにPKCEを要求し、CSRF対策としてstateパラメーターを検証し、IDトークンをメールアドレスではなく(iss、sub)で結び付け、想定するJWTアルゴリズムを明示し、最小限のスコープを要求し、短期間で期限切れになるアクセストークンとリフレッシュトークンローテーションを使用し、ブランド偽装のリスクがないか同意画面の表示を監査します。
OAuth redirect_uriの確認
OAuth認可サーバーが、「https://app.example.com」で始まるredirect_uriをすべて受け入れるとします。これによって、どのような攻撃が可能になりますか?
レッスンのまとめ:OAuthの攻撃パターン
主なOAuth攻撃には、redirect_uriの検証が緩いことによるオープンリダイレクト(完全一致を使用)、stateパラメーターの欠如によるCSRF、モバイルでのコードインターセプト(PKCEで緩和)、URL内のトークン漏えい、複数プロバイダー構成でのミックスアップ(issを検証)、サーバーが取得したredirect_uriを介したSSRF、メールクレームの衝突(iss+subを使用)、JWTアルゴリズム混同(想定するalgを固定)、偽の同意画面によるフィッシングがあります。
よくある質問
「OAuthの脆弱性と攻撃パターン」レッスンは無料ですか?
はい。「OAuthの脆弱性と攻撃パターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「OAuthの脆弱性と攻撃パターン」で何を学びますか?
リダイレクトURIの改ざん、認可エンドポイントに対するCSRF、トークン漏洩の脆弱性について学習します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「OAuthの脆弱性と攻撃パターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。