文章源自【字节脉搏社区】-字节脉搏实验室
作者-毕竟话少
存在漏洞代码片段如下:
在validation.cpp文件中没检查重复输入,可导致产生拒绝访问漏洞以及矿工可控制的双重支出漏洞。
具体可参考https://bitcoincore.org/en/2018/09/20/notice/
该漏洞是由于项目引用了bitcoin core存在漏洞的代码,导致也存在CVE-2018-17144漏洞,该漏洞的危害在上方链接中有详细说明。
细节
这段代码位于src/validation.cpp中的CheckBlock()函数,该函数在节点接收到新的区块时被调用
CheckTransaction()函数对于传入的交易消息(CTransaction& tx)进行检测,其中包括了检测一笔交易是否发生双花。检测方案非常简单,将这比交易中使用的所有Coin(即代码中的txin.prevout,代表比特币交易中的UTXO,本文后续均采用Coin一词进行表述,以便与代码持一致)记入std::set中,如果发现某项记录被重复记录了两次,就会返回处理失败的信息(state.DoS),这一消息最终会通过P2P通道,反馈给该区块的发送者。基于代码段中的备注部分,可以看出,这段检测代码在被CheckBlock()函数的调用过程中被认为是冗余和费时的,并通过将函数的第三个参数设置为False的方式,使其跳过。
CheckBlock()执行选择跳过双花检查,是由于其后续会对于整个区块中的交易进行更为复杂而全面的检查。然而,这些检查代码未能像预期的那样对某些异常情况进行检测和处置,导致了漏洞的存在。
Pigeoncoin也同样存在该漏洞(CVE-2018-17144),并已经被黑客攻击造成了实际危害。
https://bcsec.org/index/detail/tag/1/id/302
关于双花攻击和拒绝服务攻击的PoC在这里可以看:https://bcsec.org/index/detail/tag/2/id/379
修复方案:
把
if (!CheckTransaction(*tx, state, false))
改为
if (!CheckTransaction(*tx, state, true))