ID トークンの差替え攻撃
RP A と RP B は,同じ OP を利用する OpenID Connect の RP である。攻撃者は,自らが運営する RP B に利用者をログインさせ,OP が RP B 向けに発行した ID トークンを入手した。この ID トークンを RP A に提示して,利用者になりすまそうとしている。ID トークンは OP が数分前に発行したもので,OP の正当なデジタル署名が付いている。RP A がこの攻撃を検知するために確認すべき事項として,最も適切なものはどれか。
- アiss クレームの値が,利用している OP の発行者識別子と完全に一致すること
- イOP が公開している公開鍵を用いて,ID トークンのデジタル署名を検証できること
- ウiat クレームが示す発行時刻が,現在時刻から大きく離れていないこと
- エaud クレームに自らの client_id が含まれ,信頼しない受信者が含まれていないこと
正解と解説を見る
正解 エ
この問題の基礎知識
- OpenID Connect では,OP(OpenID プロバイダ)が利用者を認証し,RP(リライングパーティ)向けに認証結果を表す ID トークンを JWT 形式で発行する。
- ID トークンの主なクレームには,iss(発行者),sub(利用者の識別子),aud(発行先の RP の client_id),exp(有効期限),iat(発行時刻),nonce(リプレイ攻撃対策の値)がある。
- デジタル署名の検証で確かめられるのは,トークンが正当な発行者によって作られ改ざんされていないことであり,そのトークンがどの受信者に向けて発行されたかは別のクレームで確かめる。
アiss クレームの値が,利用している OP の発行者識別子と完全に一致すること
iss の検証は,信頼する OP 以外が発行したトークンを拒否するためのものである。この ID トークンは RP A も利用している同じ OP が発行したものなので,iss は一致し,攻撃を検知できない。
イOP が公開している公開鍵を用いて,ID トークンのデジタル署名を検証できること
署名の検証は,トークンが OP によって発行され改ざんされていないことを確かめるものである。RP B 向けのトークンも同じ OP の正当な署名をもつので,検証は成功し,攻撃を検知できない。
ウiat クレームが示す発行時刻が,現在時刻から大きく離れていないこと
iat は発行から時間がたち過ぎたトークンを拒否するために使えるが,この ID トークンは数分前に発行されたものなので,許容範囲内として受け入れられてしまう。
エaud クレームに自らの client_id が含まれ,信頼しない受信者が含まれていないこと正解
aud には ID トークンの発行先の RP の client_id が入る。RP B 向けのトークンの aud は RP B の client_id なので,RP A は自らが受信者でないことから拒否できる。OpenID Connect Core はこの検証を必須としている。
検証用の出典出典照合済み
OpenID Connect Core 1.0 incorporating errata set 2(3.1.3.7 ID Token Validation,16.11 Token Substitution) / RFC 7519 JSON Web Token (JWT)照合の根拠(5 件)
- エ(正解): aud に自らの client_id が含まれることの検証は必須
The Client MUST validate that the aud (audience) Claim contains its client_id value registered at the Issuer identified by the iss (issuer) Claim as an audience.
OpenID Connect Core 1.0 incorporating errata set 2 · 3.1.3.7 ID Token Validation(新しいタブで開きます) - エ(正解): 自らが受信者でない,または信頼しない受信者を含む ID トークンは拒否する
The ID Token MUST be rejected if the ID Token does not list the Client as a valid audience, or if it contains additional audiences not trusted by the Client.
OpenID Connect Core 1.0 incorporating errata set 2 · 3.1.3.7 ID Token Validation(新しいタブで開きます) - ア(誤り): iss は OP の発行者識別子との一致を見るもので,同じ OP が RP B 向けに発行したトークンでも一致する
The Issuer Identifier for the OpenID Provider (which is typically obtained during Discovery) MUST exactly match the value of the iss (issuer) Claim.
OpenID Connect Core 1.0 incorporating errata set 2 · 3.1.3.7 ID Token Validation(新しいタブで開きます) - イ(誤り): 署名は発行者(OP)の鍵で検証するので,同じ OP が署名した RP B 向けトークンも検証に成功する
The Client MUST use the keys provided by the Issuer.
OpenID Connect Core 1.0 incorporating errata set 2 · 3.1.3.7 ID Token Validation(新しいタブで開きます) - ウ(誤り): iat は発行時刻が離れすぎたトークンを拒否するもので,数分前の発行なら受け入れられる
The iat Claim can be used to reject tokens that were issued too far away from the current time, limiting the amount of time that nonces need to be stored to prevent attacks.
OpenID Connect Core 1.0 incorporating errata set 2 · 3.1.3.7 ID Token Validation(新しいタブで開きます)
トークンは同じ OP が数分前に正当に署名して発行したので iss・署名・iat の検証はすべて通り,RP A と RP B で異なるのは aud(発行先の client_id)だけである。