7.3.7. Signing Signature Values (对签名值签名)
7.3.7. Signing Signature Values (对签名值签名)
对消息应用 req 参数 (第 2.4 节) 或多个签名 (第 4.3 节) 时, 可能对现有 Signature 字段的值签名, 从而在新签名值中覆盖现有签名输出的字节. 虽然看似此实践会以可验证方式传递覆盖原始签名下的组成部分, [JACKSON2019] 描述的攻击可用于冒充无关消息上的签名输出值.
此例中 Alice 打算向 Bob 发送签名请求, Bob 希望向 Alice 提供签名响应, 其中包含密码学证明表明 Bob 正在响应 Alice 的传入消息. Mallory 希望截获流量并将 Alice 的消息替换为自己的, 而 Alice 不知道截获发生.
-
Alice 创建消息 Req_A 并使用私钥 Key_A_Sign 应用签名 Sig_A.
-
Alice 认为她正将 Req_A 发送给 Bob.
-
Mallory 截获 Req_A 并从消息读取 Sig_A 值.
-
Mallory 生成不同消息 Req_M 发送给 Bob.
-
Mallory 构造签名密钥 Key_M_Sign, 使其能使用此密钥对请求 Req_M 创建有效签名 Sig_M, 但 Sig_M 的字节值恰好等于 Sig_A.
-
Mallory 将 Req_M 与 Sig_M 发送给 Bob.
-
Bob 相对 Mallory 的验证密钥 Key_M_Verify 验证 Sig_M. Bob 从不认为他在响应 Alice.
-
Bob 以响应消息 Res_B 响应 Req_M 并使用其密钥 Key_B_Sign 创建签名 Sig_B. Bob 将 Sig_M 值纳入 Sig_B 的被覆盖组成部分, 但不纳入请求消息的其他任何内容.
-
Mallory 从 Bob 接收包含签名 Sig_B 值的响应 Res_B. Mallory 将此响应重放给 Alice.
-
Alice 从 Mallory 读取 Res_B 并使用 Bob 的验证密钥 Key_B_Verify 验证 Sig_B. Alice 在其签名基中包含其原始签名 Sig_A 的字节, 签名通过验证.
-
Alice 认为 Bob 已响应她的消息并相信她有此事发生的密码学证明, 但事实上 Bob 响应了 Mallory 的恶意请求而 Alice 不知情.
为缓解此点, Bob 可以签名请求消息的更多部分而不仅是 Signature 字段, 以更充分区分 Alice 的消息与 Mallory 的消息. 使用此特性的应用, 特别用于不可否认目的, 可以规定原始签名中要求的任何组成部分也必须在第二签名中单独覆盖. 对签名消息, 要求覆盖第一签名的对应 Signature-Input 字段确保 nonce 与时间戳等唯一项也被第二签名充分覆盖.