摘要:针对这个攻击,Trezor在三个月前就已开始调研,直至最近发布了新固件,其解决方案是:所有隔离见证(SegWit)地址的交易,全部附带上对应UTXO的前一笔交易的所有信息。当然,如果第三方钱包(比如Electrum)未来采用Trezor的解决方案,Cobo金库也会采用完全一样的方案。...
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-1.jpg)
免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
小编:记得关注哦
来源:Cobo钱包
撰文 |Cobo金库大掌柜
上周(2020年6月3日),海外比特币社区爆出了一个波及所有硬件钱包的新型攻击形式——费用超付攻击(Fee Attacks),这种攻击仅限于隔离见证(SegWit)地址。发现这个攻击的是来自英国的一位少年黑客Saleem Rashid,他也是第一个找到 Ledger 的严重漏洞并攻击成功的黑客。
大掌柜和Cobo金库产品技术团队在攻击爆出的当天就及时作出了反应,并提出了我们的解决方案。该解决方案将会在6月17日发布的最新固件升级包V1.2.0中覆盖。
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-2.jpg)
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-3.jpg)
这篇文章会详细说明费用超付攻击的原理,以及Cobo金库的对应解决方案。国内其他硬件钱包厂商可以参考我们的解决方案,尽快修复漏洞。
阐述具体的攻击原理之前,先强调两个点:
- 这个攻击会波及所有硬件钱包的原因,不是硬件钱包本身的设计缺陷,而是由隔离见证(SegWit)的天然特性所决定的。
- 这个攻击在理论上是可行的,但是实操中黑客大概率不会实施这个攻击手段(敲重点,只是大概率不会实施,不代表不会实施)。因为攻击成功后的BTC,很难直接落进黑客的口袋。
大家知道,硬件钱包是一个脱网设备,它依赖配套App构建交易(比如Ledger的Ledger Live,以及Trezor的网页App),并且把待签名交易通过USB/蓝牙/二维码发送到硬件钱包,然后用硬件钱包脱网保存的私钥进行签名。所有硬件钱包的基本运作原理都是如此。
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-4.jpg)
硬件钱包的基本运作原理
如果你使用的是一个隔离见证(SegWit)地址,当你把待签名交易从配套App发往硬件钱包进行签名时,会有两个由隔离见证(SegWit)的天然特性所决定的特点:
- 待签名交易包含的所有UTXO不会带上其前一笔交易的完整信息。也就是说,所有UTXO的真实余额数据,硬件钱包是没有能力做检查的。
- 签名过程中,会对每一个UTXO分别进行签名。
基于这两个隔离见证(SegWit)的特点,费用超付攻击的具体攻击路径如下:
1. 被攻击者的某一隔离见证地址有两个UTXO,UTXO A的余额是15 BTC,UTXO B的余额是20 BTC。
2. 被攻击者要发送一笔20 BTC的交易,手续费是0.000001 BTC。正常情况下的交易信息如下所示:
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-5.jpg)
3. 攻击者篡改了配套App,发送了第一笔篡改交易给硬件钱包签名。这笔交易中,input 1来自于UTXO A,15 BTC,input 2来自于UTXO B,但不是20 BTC而是5.000001 BTC。此时由于隔离见证(SegWit)的天然特性,硬件钱包无法识别input 2是不合法的input(因为没有UTXO B的前一笔交易的所有信息,从而无法判断UTXO B的真实余额),并完成了对input 1和input 2的分别签名,并传到被篡改的配套App。交易信息如下:
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-6.jpg)
4. 被篡改的配套App弹出一个消息——签名有误,请重新用硬件钱包进行签名。此时,被篡改配套App向硬件钱包发送了第二笔篡改交易。这笔交易中,input 3来自于UTXO A,0.000001 BTC,input 4来自于UTXO B,20 BTC。此时,input 3是一笔不合法的input,但是硬件钱包依旧无法识别,并分别对input 3和input 4进行了签名,并传到被篡改的配套App。(为方便叙述和区分,这里把第二笔篡改交易的input序号顺位为3,4)交易信息如下:
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-7.jpg)
5. 被篡改的配套App将input 1和input 4这两个合法的签名合并,作为一笔新的交易发送了出去。交易信息如下:
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-8.jpg)
6. 此时,用户花费了UTXO A的15 BTC和UTXO B的20 BTC,向目标地址发送了20 BTC,消耗了15 BTC的手续费。
我们从攻击路径中可总结出,攻击者实施费用超付攻击的必要条件:两笔篡改交易的output必须与攻击者最终广播交易的output保持一致,合法的两笔input才能被合并成一笔合法交易,以此来实现费用超付攻击。
但是,黑客要从这个攻击中获利,就变得非常困难。因为正常情况下,这多出来的15 BTC的手续费,会通过矿池分发到矿工的手里。如果黑客要通过成功挖出一个块来独吞这15 BTC,需要进行以下操作:
- 黑客拿到签完名的交易,不发送给mempool,自己掌握这个交易并尝试挖出一个区块。
- 假设黑客使用的是蚂蚁 S19 Pro矿机,每台矿机的算力是 110 TH/s,当前全网算力是105 EH/s。
- 由于受害者可能会察觉问题,所以假定黑客要在24小时内挖出这个区块并将手续费15 BTC的这个交易打包进去。那么,黑客需要购买约6600台蚂蚁 S19 Pro矿机(官方售价是20770元/台)。
- 大家可以自行计算这里的攻击成本。
- 如果考虑黑客和大矿工甚至矿池合谋,攻击成本会有所降低,但依旧非常高。何况24小时是个非常非常保守的估计,可能大部分用户几个小时甚至一个小时内就会发现问题。
海外大神级的硬件黑客LazyNinja(也是Cobo金库的内测用户之一),提出了另一种攻击路径。简单来说就是黑客握着高手续费的交易不进mempool,然后向受害者勒索(转为Ransom Attack)。同时,黑客会监控mempool,一旦发现受害者自己用同样的UTXO再发一笔交易的话,就立即把自己手里的交易发到mempool,矿工会优先选择巨额手续费的交易,从而让用户遭受损失。这样的攻击路径会降低一定的成本,但依旧会比较难以实施。
针对这个攻击,Trezor在三个月前就已开始调研,直至最近发布了新固件,其解决方案是:所有隔离见证(SegWit)地址的交易,全部附带上对应UTXO的前一笔交易的所有信息。但这样的方案又引出两个问题:
- 隔离见证(SegWit)的优势被削弱了。
- Trezor硬件钱包现在几乎与所有第三方钱包的适配都出了问题(这也是Trezor在这次事件中广受诟病的一点)。
针对这个攻击的特性,Cobo金库使用了另一种解决方案:
前面提到,黑客的攻击路径中,必须要向硬件钱包发送两笔output完全相同的交易。在Cobo金库硬件钱包端,可以记录用户的签名记录,然后直接禁止用户签第二笔output完全相同的交易并给出相关提醒。如果用户由于种种原因,的确是想重新签名一笔交易,这种情况下,input和output和前一笔交易应是完全一致的,说明未发生手续费攻击,Cobo金库则会放行这笔签名。
![一种全新的硬件钱包攻击方式——超付费攻击 | 火星号精选](/images/20240112/6838404654603174414-9.jpg)
这个解决方案最大的优势在于,各个第三方钱包的兼容性不会有任何问题。当然,如果第三方钱包(比如Electrum)未来采用Trezor的解决方案,Cobo金库也会采用完全一样的方案。
从一个更高的维度来看这个解决方案,一定程度上,Cobo金库扮演了一个交易签名风控的角色,这也可能是硬件钱包未来的一个重要发展方向。
参考链接:
[1]https://medium.com/cobo-vault/a-potential-solution-to-fee-attacks-cfb90defe1ce
[2]https://blog.trezor.io/details-of-firmware-updates-for-trezor-one-version-1-9-1-and-trezor-model-t-version-2-3-1-1eba8f60f2dd
[3]https://twitter.com/FreedomIsntSafe/status/1268572922911887360