メインコンテンツまでスキップ

7.3.7. 署名値の署名 (Signing Signature Values)

7.3.7. 署名値の署名 (Signing Signature Values)

req パラメータ (2.4 節) または複数の署名 (4.3 節) をメッセージに適用するとき, 既存の Signature フィールドの値に署名し, 新しい署名の値の中で既存の署名出力のバイトをカバーしうる. この慣行は, 元の署名の下のコンポーネントを検証可能な形で推移的にカバーするように見えるが, [JACKSON2019] で述べられる攻撃は, 無関係なメッセージ上の署名出力値になりすますのに用いられる.

この例では, Alice は Bob に署名付きリクエストを送るつもりであり, Bob は Alice の着信メッセージに応答していることを暗号学的に証明する署名付きレスポンスを Alice に返したい. Mallory はこのトラフィックを傍受し, Alice のメッセージを自身のものに差し替えたいが, Alice が傍受に気づかないようにしたい.

  1. Alice はメッセージ Req_A を作成し, 自身の秘密鍵 Key_A_Sign を用いて署名 Sig_A を適用する.

  2. Alice は Req_A を Bob に送っていると信じている.

  3. Mallory は Req_A を傍受し, このメッセージから値 Sig_A を読み取る.

  4. Mallory は代わりに Bob に送る別のメッセージ Req_M を生成する.

  5. Mallory は, 自身のリクエスト Req_M にこの鍵を用いて有効な署名 Sig_M を作成でき, かつ Sig_M のバイト値が Sig_A と完全に一致するような署名鍵 Key_M_Sign を用意する.

  6. Mallory は Sig_M 付きの Req_M を Bob に送る.

  7. Bob は Mallory の検証鍵 Key_M_Verify に対して Sig_M を検証する. Bob が Alice に応答していると考える瞬間はない.

  8. Bob は Req_M に対するレスポンスメッセージ Res_B で応答し, 自身の鍵 Key_B_Sign を用いてこのメッセージに署名 Sig_B を作成する. Bob は Sig_B のカバーされるコンポーネントの下に Sig_M の値を含めるが, リクエストメッセージから他には何も含めない.

  9. Mallory は Bob から Res_B を受け取り, 署名 Sig_B の値を含む. Mallory はこのレスポンスを Alice にリプレイする.

  10. Alice は Mallory から Res_B を読み, Bob の検証鍵 Key_B_Verify を用いて Sig_B を検証する. Alice は署名ベースに自身の元の署名 Sig_A のバイトを含め, 署名は検証を通過する.

  11. Alice は Bob が自身のメッセージに応答したと信じ, それが起きたことの暗号学的証拠を持っていると考えるが, 実際には Bob は Mallory の悪意あるリクエストに応答しており, Alice は気づかない.

これを緩和するには, Bob は Signature フィールドだけでなくリクエストメッセージのより多くの部分に署名し, Alice のメッセージと Mallory のメッセージをより明確に区別できるようにできる. この機能を用いるアプリケーション, 特に否認防止を目的とする場合, 元の署名で要求されるコンポーネントは第 2 の署名でも別個にカバーされることを規定できる. 署名付きメッセージでは, 第 1 の署名に対応する Signature-Input フィールドのカバーを要求すると, nonce やタイムスタンプなどの一意の項目も第 2 の署名で十分にカバーされる.