OIDCへの攻撃とパラメータの役割の整理

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_typeid_token を含むフローで可能

不正に入手したID Tokenを使って第三者になりすます攻撃

認可コード横取り

response_typecode を含むフローで可能

不正に入手した認可コードを使ってログインしたり、第三者のアクセストークンを取得してしまう攻撃

主にネイティブアプリで悪意のあるアプリがアプリへのリダイレクトで認可コードを横取りするようなケースを想定している

トークンインジェクション

response_typetoken を含むフローで可能

三者の有効なアクセストークンを攻撃者自身の管理下にあるアプリに適用する攻撃

コードインジェクション

response_typecode を含むフローで可能

OAuth・OIDC のリダイレクト部分で認可コードを他者のものに入れ替える攻撃