Velas中国
5 min readOct 5, 2021

反恐精英:阈值攻击

阈值 ECDSA 的潜在攻击被阻止,反恐胜利!

免责声明

本说明中讨论的代码在撰写本文时仍在进行中,尚未经过审核。 使用未经审计的代码时请务必小心。

简介

阈值钱包利用阈值签名方案 (TSS) 在发布区块链交易时在多方之间分配签名权。 它们通常被视为在去中心化环境中消除内部欺诈和提高安全保证的一种方式。

虽然 TSS 的概念并不新鲜,但它在实践中被 Binance、Thorchain、RenVM 等广泛使用还是第一次。

如此流行的热潮促使学术界发明了更好的 TSS,因此该领域最近进行了大量研究也就不足为奇了:参见Lin17, GG18, CCLST19, GG20。 后者被认为是最好的多方 ECDSA TSS,因为它具有阈值和轮次最优性,以及存在可识别的中止。

理论上,上述所有 TSS 在实际合理的假设下都是安全的,如相应论文中所证明的那样。 然而,在实践中,特定的实现可能会受到 TSS 软件引入的漏洞的影响。

GG20 最广为人知的 Rust 实现是由行业领导者ZenGo-X 实现的。 事实上,它非常好,我们将其用作基于 TSS 的解决方案的起点。 然而,在阅读了Omer Shlomovits向我们建议的这篇论文后,我们在他们的代码中发现了一个微妙的问题。 它引导我们进行本说明中描述的严重攻击。

作为真正的去中心化安全爱好者,我们很快与 ZenGo 取得了联系,并在拉取请求中修复了发现的安全漏洞。 它很快被批准并合并到他们的 TSS 库中。 发现这次攻击的研究人员获得了 ZenGo 历史上最大的漏洞赏金。

背景

在本笔记的其余部分,我们将使用来自 GG18.的符号。 我们还将由元素 g 生成的循环子群表示为 ⟨g⟩,其阶表示为 |g|。

首先,在分布式密钥生成过程中,每一方生成值 h₁h₂,、N,并在零知识中证明

h₁ 和 h₂ 的离散对数相对于彼此模 N 存在(即 h₁ 和 h₂ 生成相同的子群: ⟨h₁⟩ = ⟨h₂⟩).

这些值随后在签名期间被其他方用于计算 z = h₁ᵏ h₂ʳ (mod N),其中 k 是他们的秘密值,而 r 是用于“隐藏”k 的随机值。

请注意,k 与秘密密钥 sk 的份额直接相关,这意味着如果我们知道 k 和相应的签名,我们就可以恢复 sk。

攻击

如果 h₁ 和 h₂ 生成一个大阶的相同子群,那么我们就没有关于它们的幂 h₁ᵏ 和 h₂ʳ 的特殊信息,我们可以用这些信息来了解有关 k 的一些信息。 正式地,这个属性被称为统计零知识。

然而,在密钥生成阶段,ZenGoonly 的实现证明了 h₂ 相对于 h₁ 的离散对数存在,即⟨h₂⟩ 是⟨h₁⟩ 的子群(反之亦然)。 特别是,它对 |h₂| 没有限制。 以及它与 |h₁| 的关系。

攻击背后的主要思想是我们希望同时保持以下三个属性:
- |h2| 必须足够小,以便我们可以对 h₂ʳ 的所有可能值进行暴力破解;
- |h₁| ⟨h₁⟩ 必须足够大才能包含足够的元素来唯一地从 h₁ᵏ 映射到 k;
- 从 h₁ᵏ 到 k 的映射必须是可有效计算的,即我们必须能够快速找到模 N 的离散对数。

小 |h₂|

在没有第二个 dlog 证明的情况下,实现第一个属性的一种简单方法是设置 h₂ = 1,然后无论 r 的选择如何,h₂ʳ = 1 和 z = h₁ᵏ (mod N)。

一个自然的反应是明确禁止 h₂ = 1,但这并没有多大帮助。 对于对手来说,一种更复杂(但完全实用)的方法是选择 h₂ 作为小阶统一的随机根。 因为我们知道 N 的因式分解,所以可以有效地生成这样的 h2。

高效的日志

有多种选择 N 的方法可以让我们有效地获取 dlog。 一种可能的选择是设置 N = ²²⁵⁶ > q,并使用此处描述的逐位算法。
另一个实用的选择是选择 N 作为一个大的平滑数。 那么我们可以使用通用的Pohlig — Hellman算法。

开发

由于缺少第二个 dlog 证明(h₁ w.r.t. h₂),恶意方很容易满足上述所有三个属性。

然后他们可以了解每一方的秘密份额并轻松恢复共享的秘密。 结果,他们获得了单枪匹马签署交易的权力。 这让他们可以通过将所有资产转移给自己来清空组织的钱包。

要查看直到私钥暴露点的攻击,请查看我们的存储库。值得注意的是,基于 TSS 的实用解决方案通常具有多层防御,并且可以进一步阻止此类漏洞利用。

同时,这绝不是理想的情况。 事实上,共享的秘密可能不是钱包密钥,而是一些敏感信息,我们的用户希望安全地存储在区块链上 — 我们的 TSS 实现将在其发布时支持的一个用例。

结束语

实际上,GG20 需要第三个证明 — 证明 N 是两个安全素数的乘积,而且 ZenGo 的库中也没有。 但是,如果 h₁ 和 h₂ 确实生成了相同的组,则该证明的缺失不会导致任何信息泄漏 — ,无论 N 是多少,该协议都是统计零知识的。

N 假设背后的原始推理是我们不希望其他方能够快速考虑这个数字。 然而,正如 Rivest 和 Silverman 在他们1999年的文章中所解释的那样,这种与保理相关的问题不再相关,因为当前最先进的保理方法也适用于安全素数。

Velas中国
Velas中国

Written by Velas中国

Velas TM是一个自我学习和自我优化的区块链平台,它上面的交易和智能合约安全、可互操作、且高度扩容。Velas区块链采用经过AI技术优化的神经网络,来改善自己的共识算法,保证算法去中心化、高扩容和安全。VELAS是整个系统,比如交易所、多签名钱包和商业平台的主心骨。

No responses yet