漏洞描述
在2018年4月26日上,Bitcoin-ABC 的开发者被不明身份的人告知,当前
Bitcoin-ABC 0.17.0
版本存在漏洞。如果被利用,这个漏洞会导致 Bitcoin Cash 网络意外分裂。
对于此漏洞的描述大致如下:
攻击者会构造一个被
Bitcoin-ABC 0.17.0
版本所接受并且能够打包进 block 的恶意交易。 这个 block 将被其他相互兼容版本的 Bitcoin Cash 实现拒绝。 恶意交易的 signature hash 类型中的0x20的比特标志位会被设置。
漏洞分析
在 commit c3804927eb8a中,他们重构sighash类型测试来检查交易签名中可能存在的每个值。
通过上图,我们可以分析得出:之前是& 0x1f
, 但是构造出个交易的sighash是0x20就会不通过。
在 /src/script/interpreter.h
文件中有如下定义:
/** Signature hash types/flags */
enum {
SIGHASH_ALL = 1,
SIGHASH_NONE = 2,
SIGHASH_SINGLE = 3,
SIGHASH_FORKID = 0x40,
SIGHASH_ANYONECANPAY = 0x80,
};
通过分析他们的测试用例,我们可以猜想到:写这个程序时之前假设了sighashtype的范围是0~0x1f, 但现在实际现在可能出现的是0~0xff, 有可能是后来情况扩展了。基于前一个假设时,像判断一个sig hash的基本类型, 之前是用的sighash & 0x1f。但是如果一个sighash是0x21时会被判定为是SIGHASH_ALL
,可以猜想到这个地方只想过滤出0x01, 0x02, 0x03这三种情况。
从二进制的层次我们继续分析:0x1f = 0b00011111、0x21 = 0b00100001、0x3f = 0b00111111。右边数第6位&0x1f每次都会是0,如果左边的3位无效了, 实际应该是被过滤掉的。同理0x20的sig hash也会有问题。在0.17.0 版本时,校验位是 0x1f,在 0.17.1 版本更新为 0x3f,以前0x21 & 0x1f = 1, 0x01 & 0x1f也是1。但改成3f, 0x21 & 0x3f就不在有效范围内了, 被过滤掉了。所以 0.17.1 这个版本主要修复了0x20的问题。
abc team对此漏洞的处理
在分析了漏洞和可能的响应后, Bitcoin-ABC 开发人员为此漏洞准备了一个补丁,并发布了一个私有版本,以便直接分发给矿池运营商。 由于挖矿社区的分散性,不可能直接与每个人取得联系。 提供此版本是为了验证Bitcoin Cash矿工在升级后转发给值得信赖的矿工。
我们建议任何比特币ABC 0.17.0用户尽快升级到最新版本。
致谢
冰山,隶属 Meowww Security,比特大陆安全风控技术负责人。
余弦,慢雾科技联合创始人。
本文由比特大陆风控部&慢雾科技
联合编写!
家境清寒,整理不易。