本文作者通过分析多个硬件钱包(包括Trezor、Coldcard和Ledger)在多重签名环境下的安全性,揭示了多签设置中存在的潜在陷阱,如备份不完整、接收地址验证不足、找零地址处理不当等问题。文章强调了在多签设置中,硬件签名器需要验证的关键信息,并对不同硬件钱包的实现进行了比较,为用户提供了实用的安全建议。
作者:Kaspar Etter
来源: https://blog.bitbox.swiss/en/the-pitfalls-of-multisig-when-using-hardware-wallets/
相较于仅用一组密钥来持有比特币,你也可以通过多组密钥来共同管理你的比特币。这被称为 多重签名(multisignature),简称多签(Multisig),它要求多个签名才能授权一笔比特币交易。你可以自行设定密钥的总数和花费资金所需的阈值(最小签名数量)。如果阈值大于一,那么即使攻击者获得了其中一个密钥,仍然无法窃取你的资金。正因如此,许多业内人士都 建议 每个人都应该使用多签来保护他们的比特币。然而,本文将解释为什么相较于单签而言,多签的复杂性也会带来陷阱。文中还包括我们此前从未公开披露的、向 SatoshiLabs(Trezor 制造商)和 Ledger 在这方面做出的负责任披露。
在 BitBoxApp 中实现多签的实验性支持时,我让同事 benma 意识到,他在 Trezor 显示屏上看到的多签接收地址是不可信的(详见下文)。在今年早些时候意识到对找零地址的处理和接收地址同样重要后,我们对其它硬件签名器如何处理多签变得更加好奇。我们在 9 月底推出了 BitBox02(译者注:原文发表于 2019 年 12 月),然后终于有时间研究其它硬件签名器的实现,也是为了评估我们自己若想妥善添加多签功能需要投入多少精力。在这个过程中,我们发现了几个问题,并负责任地向 Trezor、 Coldcard 和 Ledger 进行了披露(如本文所述)。
我在 之前的一篇博客文章 中有过详细说明,但简而言之,硬件签名器旨在确保,即便在电脑或手机被恶意软件感染的情况下,你仍然能够安全地接收和花费资金,并安全地将找零返回至同一账户。虽然每家制造商都可以定义他们的产品能提供何种保护、不提供何种保护。但我们认为,硬件签名器的威胁模型在多签场景下应该包括恶意或被攻破的联合签名方。这是因为许多公司喜欢将多签用作资金存储、花费速率限制(rate-limiting)或继承服务的一部分。一旦这些公司的基础设施遭到入侵,大量用户可能受到影响 —— 特别是通过服务提供商的应用程序与其硬件签名器交互的用户。
多签主要有两大应用场景:(i) 在多方之间共享资金花费权限,避免单点故障,或 (ii) 通过使用来自不同制造商的硬件签名器来降低漏洞的影响。在这两种场景下,你都需要注意一些细节。否则,你最终获得的安全性可能还不如使用普通的单签钱包。多签为硬件签名器、软件钱包和你自身都增加了复杂性,但 “复杂性是安全性的敌人”。此外,由于单签比多签流行得多,许多公司花了更多精力在它们单签工作流的安全性和可用性上,而非其多签的实现。虽然我同意多签在理论上更安全,但以下章节将阐述为何在实践中情况可能并非如此。
第一个陷阱甚至发生在你开始接收或花费资金之前。假设你创建了一个 2-3 的多签设置(阈值要小于联合签名方的数量)。换句话说,总共有 3 个可能的签名方,但只需要其中 2 个签名即可批准交易。至关重要的是,每个联合签名方的备份都必须包含所有其它联合签名方的扩展公钥(简称 xpub)(理想情况下还要包含使用的阈值、派生路径和脚本类型)。否则,一旦丢失任何一个助记词,你将无法恢复和花费资金。这是因为多签账户的未花费交易输出(UTXO)是使用所有公钥的哈希值(和阈值)锁定的。从技术上讲,如果你无法推导出所有联合签名方的公钥,你就无法确定查找和花费多签账户 UTXO 所需的 赎回脚本。例如,如果你设置了一个 2-3 的多签账户,但忘记了备份其它两个联合签名方的扩展公钥,那么只要钱包(以及各硬件签名器)功能正常,2 个签名器就足以花费和接收比特币。然而,如果你无法访问自己的钱包(不论什么原因),那么你在恢复时需要的是完整的 3 个助记词的备份,而不仅仅是 2 个。
你的硬件签名器应该验证,或允许你验证,来自不可信计算机的以下信息:
为了避免在使用接收地址时出现人为的单点故障,相同阈值的联合签名方应该向发送者确认接收地址已正确传输。如果你的多签设置是为了规避特定设备固件漏洞的风险,那么你应该在多个硬件签名器上核对接收地址。安全地接收比特币与安全地花费比特币同样重要。
那么,不同的硬件签名器如何处理这个问题?
正如其他人之前注意到的, Ledger 并没有处理这个问题。相反,用户需要信任计算机上显示的接收地址,这违背了硬件签名器的设计初衷。
Trezor 会验证其密钥是否为格式正确的接收地址的一部分,并向用户显示除了联合签名方以外的所有其它信息(再次参见上面关于 Ledger 的 推文)。为了简单起见,制造商试图让硬件签名器的固件尽可能 无状态,因此尽量避免存储除种子词以外的任何数据。直到 2019 年 11 月 6 日发布固件版本 2.1.8 之前,Trezor 的用户都无法验证计算机提供的联合签名方的扩展公钥。 换句话说,在我们上面提到的 2-3 多签示例中,攻击者可以利用恶意软件替换掉 2 个联合签名方的扩展公钥,然后就能完全控制接收到的比特币。 这是一个真实存在的问题,因为用户被教育要信任硬件签名器的屏幕,但却未曾了解过上述的替换风险,该风险使得设备的屏幕在多签场景下变得不可信。这是我们向 Trezor 披露的第二个漏洞,在其 发布说明 中有提及。他们认为这更多是一个可用性问题而非安全问题。(只要你在多个设备上检查接收地址,每个设备都确认其密钥包含在多签地址中,这确实不会是一个安全问题。)虽然新固件仍然不会持久保存多签设置,但现在你可以在显示多签接收地址时验证联合签名方的扩展公钥:
- 如何在 Trezor Model T 上检查多签联合签名方的扩展公钥。 -
不方便的是,据我们所知,Trezor 并不指明哪个扩展公钥属于你。虽然硬件签名器会提供你自己的扩展公钥,无需你亲自验证。另一方面,由于似乎没有其它方法在 Trezor 的可信屏幕上显示你自己的扩展公钥,至少现在你可以更自信地告诉联合签名方你的扩展公钥是什么。
Coldcard 拥有最佳的方案,它会在初始设置后持久保存多签配置。然而,它在派生密钥路径的清理方面存在一个问题,我们已向其 负责任地披露了这一点。
一旦你安全地接收了一些比特币,如何才能放心地花费它们?硬件签名器必须验证,或允许你验证,来自不可信计算机的以下信息:
那么,不同的硬件签名器如何处理这个问题?
通过检查多签配置,我们发现 Coldcard 的方案最为出色。然而,由于它没有对密钥路径施加足够的限制,找零的可访问性无法得到保证。我们 负责任地披露 了这个问题,并且它在 2019 年 11 月 1 日发布的 固件 3.0.2 中得到修复。
Trezor 会验证找零是否回到了同一个钱包账户(具有相同的联合签名方和阈值),但其验证过程曾存在问题。由于 Trezor 没有正确地区分单签和多签的工作流,攻击者可以 (i) 将一个共享的多签输入添加到单签交易中,然后 (ii) 将找零发送到同一个多签账户,并 (iii) 从该账户窃取用户的所有资金。我们在 2019 年 10 月 1 日报告了这个关键的远程攻击,Trezor 在 2019 年 11 月 6 日发布的固件版本 2.1.8 中修复了它。(有关更多信息,请参阅 benma 的这篇 文章。)除此之外,它们既不持久保存也不让用户确认联合签名方扩展公钥的方法,在花费的场景下是可行的。因为联合签名方公钥的 赎回脚本 是被签名哈希的一部分。因此,如果你计算机上的恶意软件在签名交易时谎报了联合签名方的扩展公钥,比特币网络中的其它节点将拒绝无效交易。
正如 Saleem Rashid 在几乎两年前已经指出的, Ledger 在多签交易的场景下会将找零输出留给用户确认,这引发了各种问题。用户应该如何验证找零地址?如果需要一台单独的、完全可信的计算机来做到这一点,为什么他们最初又何必使用硬件签名器?如果我们假设用户必须与联合签名方确认找零地址,那么这会导致以下两个问题:
“发送到多个地址交易(send-to-manay)”与 “多签交易” 没有明确区分:用户判断他们签名的是多签交易还是发送给多人的交易的唯一方法是,前者他们会收到一个关于找零密钥路径的警告,而后者不会。我们不能期望普通用户注意到这种差异,而多签用户也习惯了在 Ledger 上只检查预期接收方、其它则一路按确认。因此,被攻破的联合签名方可以提供一个由它们单独控制的发送地址,并让其被错误地确认为多签 “找零” 地址。
降低多签阈值:如果你的多签设置为 M-N,你无法检测到找零输出的多签阈值是否被降低到 1-N。如果一个被攻破的联合签名方在要确认的找零信息上对你撒谎,它们可以在交易完成后窃取找零。
虽然这两个问题能通过让用户访问一个告诉他们找零应该是什么样子的 “找零断言机” 来解决,但还有另一个用户无法防范的问题:
请注意,这些攻击要求受害者的计算机被攻破,这是 硬件签名器威胁模型 中的常见假设。我们在 2019 年 11 月 4 日向 Ledger 报告了所有这三个问题。他们回应说这些都属于预期行为,并且正在开发一个新的比特币应用程序来解决这些问题(有关更多信息,请参阅 Reddit 上的 这个评论)。 如果你确实将 Ledger 同时用于单签和多签,并且怀疑你的联合签名方会动用你的单签资金,我们建议你在签署更多的多签交易之前,首先将单签账户里资金转移到不同的钱包。 此外,我们建议一个 Trezor 或 Ledger 设备最多只用于一个多签设置,因为这些设备不会显示账户信息,你将无法得知正在从哪个账户花费资金。
Ledger Nano X 上的多签工作流
上文所提到的所有漏洞都源自一个共同的问题:硬件签名器要么试图 “智能化” 并尽可能少地显示信息(Trezor 和 Coldcard),要么试图 “简单化” 并显示更多信息(Ledger),但这两种方法都失败了。即它们既没有充分验证也没有充分显示。要想在两者之间取得平衡,恰到好处地实现静默验证和用户确认并不容易。此外,在我看来,我们需要更密切地关注这类 “改变找零” 攻击。本文提到的所有攻击都曾是(或仍然是)远程攻击,其中被攻破的计算机可以简单地滥用硬件签名器的 API。关于硬件签名器如何缓解此类攻击并提高其安全性的建议,请参阅 benma 的文章。虽然本文侧重于硬件签名器,但值得注意的是,随着多签的使用,软件钱包也同样容易遭受 API 滥用攻击,因为交易可以像传递给硬件签名器一样传递给它们。
感谢 TheCharlatan 发现在 Ledger 中可以将单签账户里的资金发送到多签找零,感谢 benma 对联合签名方值得信赖这一假设提出了质疑,而我则完善了上述攻击并报告给了 Ledger。TheCharlatan 还负责通过修改 Electrum 钱包 和 HWI 来复现这些攻击。至此,我们的漏洞披露三部曲告一段落。
- - -
什么是多签?
多签要求多方签名才能授权一笔比特币交易,从而允许通过多组密钥来共同持有比特币。
为什么推荐使用多签?
多签通过要求多组密钥才能授权交易来增强安全性,使得攻击者更难仅凭一把密钥窃取资金。
多签的主要应用场景是哪些?
多签主要用于在多方之间共享权限来避免单点故障,以及通过使用不同的硬件签名器来减少漏洞的影响。
多签如何增加复杂性?
多签会增加硬件签名器、软件钱包和用户自身的复杂性,而由于这种复杂性的存在,多签有时在实际应用中安全性更低。
如何备份多签设置?
在每个联合签名方的备份中包含所有扩展公钥(xpub)对于资金的恢复和花费至关重要。
(完)
- 本文转载自: btcstudy.org/2025/08/19/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!