「RVN 增发」事件时间线
6 月 29 日,Solus Explorer 开发团队 CryptoScope 的一个程序员在回归测试时,发现浏览器统计的 RVN 余额出了问题,在深入排查问题后,他确认主网出现了很多异常的 RVN 增发操作,随后快速联系 Ravencoin 官方团队成员反馈了这个 bug。
在与 RVN 开发团队沟通后,CryptoScope 决定暂时关闭 Solus Explorer 的部分入口,以降低其他攻击者利用漏洞的可能性,为官方团队解决问题赢得了一定时间。
7 月 3 日,RVN 团队向社区发布了紧急更新,并最终于 7 月 4 日在 1,304,352 区块上对 Ravencoin 网络进行了程序修复。
7 月 8 日,RVN 官方解释称,本次漏洞是由于黑客(Github 账号:WindowsCryptoDev)提交的恶意 PR (Pull Request)引入的 bug 导致。
此次漏洞共导致 RVN 增发 3.01 亿枚,相当于原有 210 亿总供应量的 1.44%,已有供应量的 4.6%。
根据追踪,大量增发的 RVN 被拆开发往不同的地址,并最终转到了交易所,官方定位到了以下 3 个地址:
RVhLBBsdFbKmBC1muPB2of74w19NwHzUsK
RAekzFLJDfLpaTfMonPNEvahWVYvBu2iE8
RU4C2CLwRTm4s4LbWMYdzAJFbZGL5rZqGs
RVN 团队表示已经追踪到其中一个黑客团队的线索,并已经掌握攻击者的信息,希望其将增发的 RVN 转至特定的地址进行销毁。RVN 团队称已有总计约 390 万枚增发的 RVN 被销毁。
此外,官方团队没有通过类似 ETH 硬分叉的形式来解决攻击,而是间接承认了这些增发币的有效性。为了保证总供应量不变,官方给出的建议方案是降低未来挖矿总收益,不过这个方案还需要得到社区的认可,并最终通过链上 BIP9 升级后才能生效。
此次漏洞除了增加 RVN 的通胀率之外,不会影响用户已有的 RVN 资产和转账。
RVN 原有发行总量为 210 亿,出块时间为 1 分钟,目前的区块奖励为 5,000 个 RVN,每 210 万个区块后奖励会减半,也就是约 4 年减半一次。根据官方目前给出的方案,每次减半将比之前提前 59,580 个区块(约为 41.375 天)。
攻击者行为复盘
1 月 16 日,名为 WindowsCryptoDev 的开发人员在 Ravencoin Github 提交了一个 PR(Pull Request), 表面看起来是在完善节点返回的报错信息,该 PR 很快就得到了 Ravencoin 官方人员的反馈,并合并进主分支。
PR 详情
原先的代码,对于 asset 相关的交易,只要交易的 RVN output value 不是 0,都会返回 “bad-txns-asset-tx-amount-isnt-zero” 报错信息。
该 PR 针对不同的 asset 交易类型进行了报错信息优化,表面看起来是为了方便开发者区分具体的报错原因,但是黑客留了一个后门,即没有针对 TX_REISSUE_ASSET 进行报错信息优化。注意,这样带来的后果不仅仅是报错信息不可分辨,而是将原本不合法的交易(TX_REISSUE_ASSET 且 RVN output value 不是 0)判断为合法的交易,最终导致了 RVN 的增发。
1 月 17 日,黑客在 Ravencoin 主网持续发布 TX_ISSUE_ASSET 交易,为后续的 TX_REISSUE_ASSET 攻击提供基础。
5 月 9 日,黑客开始每隔 2 小时在 Ravencoin 主网发起一个 TX_REISSUE_ASSET 交易,增发 500,000 RVN 到自己的地址,该行为一直持续到 7 月 3 日,此时黑客察觉到官方已经准备对 bug 进行修复(此时主网上的 bug 并没有完全修复)。
7 月 4 日,主网上还出现了 3 笔新的攻击交易,增发了两笔 1,000,000 RVN 和一笔 2,804,398 RVN,不过这 3 笔攻击交易应该都不是之前的黑客所为。
从 Solus Explorer 统计来看,最终总增发量为 301,804,400 RVN,也就是超过 3.01 亿 RVN。
安全提示
虽然此次漏洞只影响了 Ravencoin 网络,但是还有很多其它区块链系统也遇到过类似的安全问题。例如 Bitcoin 曾经在 2018 年被爆出过类似严重的安全漏洞,攻击窗口从 2017 年 10 月持续到 2018 年 8 月,同时影响了所有 2017 年 10 月之后基于 Bitcoin 代码开发的新币种。不过当时的 bug 并不是黑客恶意引入,而是开发人员的错误导致,值得庆幸的是,该 bug 在被开发人员修复之前没有被任何黑客利用。
对于区块链开源项目来说,代码贡献者的技术能力、贡献动机等因素都存在诸多不确定性,因此在代码 review 上需要核心开发团队把好关。