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 官方人员的反馈,并合并进主分支。
原先的代码,对于 asset 相关的交易,只要交易的 RVN output value 不是 0,都会返回 “bad-txns-asset-tx-amount-isn't-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 上需要核心开发团队把好关。
内容来源@Cobo钱包
黑客的方法
一位微信名为「奋斗的 M4ster」的社区成员提供了他的分析思路,发现这名黑客只用了 3 行代码就成功「生成」了价值 4000 万人民币的财富。
问题出在上面这段代码,从代码表达上看,这部分与铸币有关,但这段代码只有一个 else if。
在代码语言中,else if 是「否则如果」的意思,是一种判定条件,很显然,这段代码里只判定了一个条件,没有继续判定其他条件。
于是,黑客只要发送一笔交易,就可以凭空铸出一笔新币,即便这笔新币不在正常的 RVN 总量范围内,而是超出总量之外的数量,一笔交易就可以凭空造成 50 万枚 RVN。
RVN 总量有 210 亿枚,几十万的新增几乎就是九牛一毛,谁都发现不了。黑客笑了。
从 5 月 9 日,黑客发起第一笔攻击开始,他用了近两个月时间,总共发送了 5000 笔交易,慢慢造出了约 3 亿枚 RVN,占总量的 1.4%,总价值 4000 万人民币。
黑客的最后一次攻击发生在 6 月 29 日。当时 CryptoScope 团队正在解 bug,顺便看了一眼浏览器,突然就觉得 RVN 的总量有点问题。在黑客持续攻击了 2 个月后,这一行为最终被发现了。
一般来说,代码上的漏洞都是黑客仔细研究代码发现的,需要付出极大成本才能发现一个有价值的漏洞,而 RVN 的这段代码,是黑客自己写的。
Ravencoin 作为一个开源项目,所有人都可以在 Github 上为该项目提供代码。因为开源项目的初衷就是让所有开发者齐心协力,为项目优化做贡献,每个人都可以把自己的想法写成代码,放在 Github 上。代码会由项目方审核,决定用不用这段代码。
黑客在 1 月提交了这段代码,项目方没有发现问题,直接整合进了项目里面,这才给了黑客机会。而黑客整整潜伏了 4 个月,才开始攻击。
谁受到了损失
这并不是一次普通概念的黑客攻击。一般的黑客攻击,是需要黑客攻击账户,从账户中盗走用户资产。所以黑客攻击中大部分损失的是用户,但这次的另类黑客攻击,损失的是谁?
用户并没有受到损失,因为资产价格没有波动,项目方也几乎没有损失,他们自己也无需补偿任何人。
真正损失的是矿工。
看了项目方提供的增发解决方案,基本上都是从挖矿角度解决,比如提前产量减半、强制总量达到上限后停止挖矿等。按照这样的逻辑,这场黑客攻击的损失方只能是矿工。矿工靠挖矿生存,这 3 亿枚 RVN 本应是矿工的奖励,现在他们拿不到了。
如果这一切都是黑客从头计划好的,那么这就是一场完美的攻击,1 月布局,5 月攻击,7 月收尾,如果不是意外被发现,整个过程可能还会持续更长时间。用户不会报警,因为没有损失,项目方不会报警,因为是自己审核问题,矿工也无法报警,他们损失的是若干年以后的奖励,而且,谁会去受理这样的报案呢?
区块律动BlockBeats
微信号:BlockBeats
区块律动BlockBeats专注于区块链领域科技创业分析,提供最新鲜,最具深度,最有价值的区块链行业新闻
RVN开发团队发现问题以后,面临巨大的危机。
一方面代码是肯定要修正的,修正版代码要给到矿池去更新,相当于分叉,更新分叉之后,老代码再增发的币也没啥用了。
同时,因为预谋者增发完就会倒几手转到交易所,这些币混进交易所钱包,即便代码更新后,也不影响他未来的交易。所以,RVN开发团队也需要通知交易所,暂停充币,这就是你之前看到几大交易所忽然暂停RVN充币的背后原因。
6月底到7月初,RVN开发团队做这些工作时,都是偷偷摸摸在做,生怕预谋者发现。为啥呢?怕预谋者一旦发现后想:“终于发现了,要更新了是吧!那我也不为了隐蔽而小小增发了,趁着还没更新完成,我直接巨量增发!天量砸盘!全部变现!”
如果预谋者是个极端分子,那么真按上面的做,是有可能摧毁RVN整个项目的,经济模型会直接归零。不过,预谋者似乎是个理性的人,只为求财,在7月初代码更新近乎完成前,他应该已经发现端倪,但最后也只是增发了3亿6千万个左右的RVN,并成功转入了几大交易所,折合4000万元左右。
而且,最后没来得及转入交易所的300万个币,预谋者还主动销毁了,并没有继续搞事。
现在,更新也完成了,RVN项目总算逃过一劫,慢慢把预谋者的这4000万元吃掉就好,毕竟项目背后站着Overstock这样的金主,应该能弥补上。
至于增发了这么多且已经流入市场,RVN项目之初设定的总量210亿个恒定,怎么维护不变?有的人肯定会说:RVN开发团队自己审核不严,那应该让他们销毁自己手里的代币赔偿!但是,币总告诉你,他们老早就宣布自己不预挖不预留,和比特币一样,所以,赔是不可能赔的(即便自己手里有早期挖的币),最后方案很有可能是让挖矿量提前减半,最后产出到210亿个为止。
最后,估计你想问:这个预谋者有罪吗?币总想说,漏洞代码是开发团队发布的,运行该代码也是所有矿工的共识,上哪里去说人家的罪?总结起来给这位仁兄一句评价:高!实在是高!比当年那个什么美链ERC20代码漏洞增发,不知道高到哪里去了!
这就是2行代码赚4000万的始末。
币总最后郑重提醒,很多非技术导向的团队,一定要对代码进行审核,以免未来出大事。
币早
微信号:bqzzd999
区块链第一自媒体。