OAuth・OIDCへの攻撃と対策を整理して理解できる本で攻撃方法や各種パラメータの役割が理解できた。
ただ、上記の本の切り口としては、攻撃方法、フローごとで説明されており、パラメータでの切り口がなかったので改めて整理してみる。
パラメータ | 付与する主体 | 検証する主体 | 付与するタイミング | 検証するタイミング | 対応可能なフロー | 対応可能な攻撃 | 概要 | メモ |
---|---|---|---|---|---|---|---|---|
state | RP | RP | 認可リクエスト | 認可レスポンス | - code flow - implicit flow |
- CSRF | 認可リクエストの際にstate(ランダムな文字列)を付与し、セッションに紐づけておく 認可レスポンスの際にセッションに紐づいたstateが返ってくることを検証 |
|
nonce(ナンス) | RP | RP | 認可リクエスト | 認可レスポンス / トークンレスポンス (ID Tokenを受け取ったタイミング) |
- implicit flow - code flow |
- リプレイアタック - CSRF - コードインジェクション |
認可リクエストの際にnonce(ランダムな文字列)を付与し、認証リクエストに紐づけておく 認可レスポンスの際に認証リクエストに紐づいたnonceが返ってくること、nonceが一度も使われていないことを検証 |
|
PKCE | RP | IdP | 認可リクエスト | トークンリクエスト | - code flow | - 認可コード横取り攻撃 - CSRF - コードインジェクション |
認可リクエストの際にcode_challenge(ランダムな文字列)とcode_challenge_method(plainまたはS256)を付与 トークンリクエストにcode_challenge_methodで指定した方法にしたがってcode_verifierを決定して付与 IdPはトークンリクエストに付与されたcode_verifierが正しいことを検証 |
|
at_hash | IdP | RP | 認可レスポンス | 認可レスポンス | - implicit flow - hybrid flow |
- トークンインジェクション | ID Tokenの署名と同じハッシュアルゴリズムでアクセストークンのハッシュ値を算出し、その左半分を Base64URL エンコードした文字列 をID Tokenのペイロードに含める RPがコールバックを受け取った際にアクセストークンがID Tokenに紐づくものかを検証 |
OAuthにはID Tokenがないので使えない |
c_hash | IdP | RP(アプリ) | 認可レスポンス | 認可レスポンス | - hybrid flow(response_typeにid_tokenとcodeを含む) | - コードインジェクション | ID Tokenの署名と同じハッシュアルゴリズムで認可コードのハッシュ値を算出し、その左半分を Base64URL エンコードした文字列 をID Tokenのペイロードに含める 認可レスポンスを受け取ったアプリがcodeがID Tokenに紐づくかを検証 |
OAuthにはID Tokenがないので使えない |
代表的な攻撃
代表的な攻撃の概要についてもメモしておく
CSRF
Authorization Code Flow
, Implicit Flow
, Hybrid Flow
で可能
攻撃者の認可コード・アクセストークンを第三者の管理下にあるアプリに適用 する攻撃
リプレイ攻撃
response_type
に id_token
を含むフローで可能
不正に入手したID Tokenを使って第三者になりすます攻撃
認可コード横取り
response_type
に code
を含むフローで可能
不正に入手した認可コードを使ってログインしたり、第三者のアクセストークンを取得してしまう攻撃
主にネイティブアプリで悪意のあるアプリがアプリへのリダイレクトで認可コードを横取りするようなケースを想定している
トークンインジェクション
response_type
に token
を含むフローで可能
第三者の有効なアクセストークンを攻撃者自身の管理下にあるアプリに適用する攻撃
コードインジェクション
response_type
に code
を含むフローで可能
OAuth・OIDC のリダイレクト部分で認可コードを他者のものに入れ替える攻撃