美文网首页区块链技术
BCH客户端Bitcoin-ABC 分叉漏洞分析

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

作者: wolf4j | 来源:发表于2018-05-10 17:08 被阅读97次

    漏洞描述

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

    图1.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,
    };
    
    图2.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矿工在升级后转发给值得信赖的矿工。

    我们建议任何比特币ABC 0.17.0用户尽快升级到最新版本。

    致谢

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


    本文由比特大陆风控部&慢雾科技联合编写!

    相关文章

      网友评论

      • 三秋3Q:Bitcoin ABC开发团队正在策划一个漏洞赏金计划,以保证对漏洞第一时间发现、第一时间修复。

      本文标题:BCH客户端Bitcoin-ABC 分叉漏洞分析

      本文链接:https://www.haomeiwen.com/subject/scktdftx.html