BCH客户端Bitcoin-ABC 分叉漏洞分析

2018-05-15 18,501

漏洞描述

在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类型测试来检查交易签名中可能存在的每个值。

image.png

通过上图,我们可以分析得出:之前是& 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,
};

image.png


通过分析他们的测试用例,我们可以猜想到:写这个程序时之前假设了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 矿工在升级后转发给值得信赖的矿工。

我们建议使用 Bitcoin ABC 0.17.0 用户尽快升级到最新版本。

致谢

冰山,隶属 Meowww Security,比特大陆安全风控技术负责人。
余弦,慢雾科技联合创始人。



Tags:
评论  (0)
快来写下你的想法吧!

冰山

文章数:1 积分: 0

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号