引言
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:
|
|
该问题同样影响方案中的其他零知识证明(dec、affg、enc、logstar和mul)。
CVE-2022-47931:哈希值碰撞
函数SHA512_256
和SHA512_256i
在哈希拼接时使用"$“作为分隔符,但该字符可能包含在输入值中导致碰撞。例如:
|
|
会产生相同哈希值。这破坏了随机预言机假设,可能被用于构造恶意参数。
CVE-2023-26556/26557:非恒定时间运算
这两个漏洞涉及敏感操作中使用Go的非常数时间算法:
big.Int
的模幂运算可能泄露Paillier私钥的lambda值crypto/elliptic
包的secp256k1曲线实现缺少恒定时间标量乘法,可能泄露秘密标量(如密钥份额x)
结论建议
密码协议实现应严格遵循论文规范,避免安全假设的偏差。公开这些漏洞细节有助于提升方案的安全性。