OpenID Connectの仕様 必須 nonceを生成および検証する暗黙のフロークライアント:
クライアントセッションをIDトークンに関連付け、リプレイ攻撃を軽減するために使用される文字列値。
それらはどのようなリプレイ攻撃ですか?
言い換えると、暗黙のフローを使用するときにnonce
を検証しないことによるセキュリティへの影響は何ですか?
私の現在の理解は次のとおりです。
クライアント(ユーザーのブラウザーで実行されているWebアプリケーション)はナンスを生成し、それをブラウザーのセッションストレージに入れ、パラメーターとしてナンスを渡して認証サーバーにリダイレクトします。認証後、認証サーバーはクライアントにリダイレクトして戻り、ナンスを含む署名付きIDトークンを渡します。これは、クライアントがセッションストレージからのナンスに対して検証する必要があります。
ナンスが検証されていない場合、攻撃者はユーザーをだまして自分のサイトにアクセスさせ、別のリクエストから取得した有効なIDトークンでリダイレクトを送信することにより、別のIDトークンを代用する可能性があります。
認証サーバーは、IDトークンに加えて、アクセストークンで応答します。ナンスが検証されていない場合、攻撃者はユーザーを自分のサイトに誘導し、そのトークンでリダイレクトすることにより、別のアクセストークンを代用する可能性があります。これは、クライアント側のサービス拒否攻撃に使用される可能性があります(特に、ブラウザのタブがトークンストレージを共有する場合、つまりセッションストレージではなくローカルストレージを使用する場合)。
要約すると、IDトークンを信頼するにはnonce検証が必要です。 idトークンを信頼する必要がない場合は、nonce検証をスキップできます。
リプレイパケットとナンスの使用に関するワイルドなアイデアを提供します。これは私の一般的な考えであるOpenIdを扱いません。
2つの当事者AとBの通信を想定します。 Aは自分の身元を証明するために自分の鍵をBに共有していますが、その間、攻撃者Cは両者間の会話を盗聴し、自分の身元をBに証明するために必要な情報を保持しています。
その後、CはBに連絡し、その信頼性を証明します。
例:Aが疑似ランダムnonce番号を格納するnonceキャッシュを持っている場合。Bはこれを直接使用して応答パケットを作成します。 Aは、Bから最初の応答パケットを取得したときにキャッシュをクリアします。
次の送信のために、新しいランダムnonceがAのnonceキャッシュに保存され、パケットをBに送信するために使用されます。
しばらくしてからCがAへのパケットを再生しようとすると、間違ったナンスのためにAが破棄されます。
注:nonceは暗号化して送信できます。プロトコルに従ってノンスを使用する方法は複数あります。