阈值密码学实现中的多个CVE漏洞分析

本文披露了tss-lib阈值ECDSA实现中的四个高危漏洞(CVE-2022-47930至26557),涉及零知识证明重放攻击、哈希碰撞以及非恒定时间运算等安全问题,并提供了具体的技术分析和修复建议。

引言

io.finnet委托我们对基于Canetti等人论文《UC Non-Interactive, Proactive, Threshold ECDSA with Identifiable Aborts》的Go语言实现tss-lib进行代码审计。审计发现的高危漏洞已分配CVE编号:CVE-2022-47930、CVE-2022-47931、CVE-2023-26556和CVE-2023-26557。

安全问题描述

CVE-2022-47930:涉及证明的重放攻击

多数MPC阈值方案使用零知识证明防止参与者作弊。但该实现中Fiat-Shamir变换的挑战值未包含会话ID、上下文字符串或随机数,导致可能重放攻击。具体表现为Schnorr知识证明的挑战计算未使用会话ID:

1
2
3
4
5
// Fig 22.2 e
var e* big.Int {
    eHash:= common.SHA512_256i(X.X(), X.Y(), g.X(), g.Y(), A.X(), A.Y())
    e= common.RejectionSample(q, eHash)
}

该问题同样影响方案中的其他零知识证明(dec、affg、enc、logstar和mul)。

CVE-2022-47931:哈希值碰撞

函数SHA512_256SHA512_256i在哈希拼接时使用"$“作为分隔符,但该字符可能包含在输入值中导致碰撞。例如:

1
["a$", "b"]  ["a", "$b"] 

会产生相同哈希值。这破坏了随机预言机假设,可能被用于构造恶意参数。

CVE-2023-26556/26557:非恒定时间运算

这两个漏洞涉及敏感操作中使用Go的非常数时间算法:

  1. big.Int的模幂运算可能泄露Paillier私钥的lambda值
  2. crypto/elliptic包的secp256k1曲线实现缺少恒定时间标量乘法,可能泄露秘密标量(如密钥份额x)

结论建议

密码协议实现应严格遵循论文规范,避免安全假设的偏差。公开这些漏洞细节有助于提升方案的安全性。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计