Your location: Home > News > Details

比特币 RBF 假充值风险分析

2021-01-25 10:09

前言

据链闻消息,加密钱包 ZenGo 发布报告称其在 Ledger、BRD 和 Edge 等主流加密货币钱包中发现了一个漏洞(命名为「BigSpender」)。该漏洞可能会使未确认的交易计入用户的总余额中,而此时,攻击者可在交易确认之前撤销该笔交易。攻击者利用了比特币协议中的一项费用替代「Replace-by-Fee」功能。该功能可通过支付更高的手续费来替换此前的一笔交易。攻击者可以连续多次使用该功能进行 BigSpender 攻击。下面,慢雾安全团队将基于此次事件分析比特币协议 RBF 特性对交易所和钱包所产生的影响。

什么是 RBF

RBF,全称 Replace-by-fee,是比特币内存池中的一种协议,允许使用其他交易将未确认交易进行替换的方式,RBF 的方案主要有以下几种:


1、Full RBF :使用更高的手续费替换前一笔交易

2、First-seen-safe RBF:初见替换,即替换交易本身的输出金额必须大于等于被替换交易

3、Opt-in RBF:选择性替换交易,通过追加手续费的形式将旧交易替换,节点可选择开启或关闭此功能

4、Delayed RBF:当旧交易首次被网络中节点接收,如果在给定数量的区块数之后,旧交易仍然未被打包,则允许新交易无条件地替换旧交易

目前 Bitcoin Core 采用的是 Opt-in RBF 的方案,即通过声明一笔交易为可替换的形式,后续可使用其他交易替换这笔交易。关于 Opt-in RBF 的详细说明可参考 Bitcoin Core 的说明 https://bitcoincore.org/en/faq/optin_rbf/

 

如何利用 RBF 进行攻击

RBF 主要针对的是 0 确认交易,即对内存池中的未确认交易进行替换,当交易所或钱包在处理 0 确认的交易时,没有正确处理交易相关的状态时,就会导致双花和假充值的问题,具体攻击手法如下:


 

1、攻击者发送一笔 RBF 交易,输出地址指向交易所或钱包,并支付低额手续费,防止交易过快被打包;

2、在交易所检索到这笔 0 确认的交易后,攻击者立刻发送一笔替换交易,并将输出地址改为攻击者可控的其他地址,替换先前的发送给交易所或钱包的交易;

3、由于交易所或钱包在对 0 确认交易的处理存在问题,没有校验交易是否为 RBF交易和交易的确认状态,直接在未确认的情况下入账 RBF 交易,导致交易所或钱包被假充值、双花、欺诈攻击及对钱包进行 DoS 攻击;

攻击流程图如下:

目前,慢雾安全团队对市面上的几款去中心化的钱包进行测试,已在部分钱包中发现此类问题,并将问题同步给相应的项目方以及协助修复。

 

防御方案

1、交易所或钱包应禁止采用 0 确认的方式对比特币充值进行入账;


2、如需要对 0 确认交易进行入账,必须检测该交易不能为 RBF 交易,具体为交易 Input 中的 nSequence 字段值必须为 0xffffff,任意未确认交易中包含非 0xffffff 值的 nSequence 应拒绝入账;

3、检查交易状态,如检查比特币交易是否被打包,或已达到相应的确认数(如 3 个);

4、钱包应展示对应的交易确认状态,防止欺诈攻击;

来源:慢雾科技

New fund password
Confirm new password
Email Verification Code

Please upgrade your browser version

You are using an old version of the browser. Please upgrade your browser for a better experience.

Notice of Legal Statements and Policy Limitations

Dear users, due to policy restrictions, mainland China IP addresses will be forbidden to access this website, registration and use are prohibited. If you are a mainland China user, please exit safely, if you continue to use the risks caused The responsibility and responsibility will be solely borne by you. At the same time, the platform has the right to refuse to provide services. Thank you for your understanding, please accept and agree!