Testnet2 启动于西方圣诞节和新年之后,开始于我国新年来临之前。短短几天,跌宕起伏,看的人心惊肉跳。
Testnet2 的上线,参与者的积极性明显高于Testnet1,算力增长速度10倍于Testnet1。大家很多时候拿算力总占比或出块效率作为比较指标,这其实可能仅仅看到了表面,如果细心一些,就会发现,这一周发生了太多更有趣的事情。
这一周,是Filecoin测试以来,网络最为繁忙,安全话题和问题出现的最多的一周。本文按照时间线进行一个回顾。
本文提到的矿工代号:
t01346,t01201,t01475,t01205...
本周发生的攻击方式:
内存溢出攻击(利用RLE+ 实现缺陷)
区块空指针攻击(利用惩罚机制实现缺陷)
签名空指针攻击(利用惩罚机制实现缺陷)
同块惩罚攻击(利用惩罚机制实现缺陷)
无符号整数下溢攻击(利用 sector 缺失,算力扣减实现缺陷)
本周发现的其它重大bug:
AMT 删除错误
注一:本文仅列出问题和现象,但不做技术探讨。
注二:本文数据均从Filecoin链上消息分析,或从Github公开渠道,以及私下沟通得来。
注三:Filecoin 短时间内暴露这么多问题,这是好事,区块链项目只有通过开源和大众积极参与才能真正提升效率和安全性,闭门造车只有死路一条。问题暴露得多,说明一方面参与者众多,另一方面问题都暴露出来,安全性就提高了。
时间回溯到 2020年1月8日,Filecoin团队刚刚从圣诞节和新年的休假中回来。经过了长达两周的假期,第一天,团队就提交了不少更新,其中之一是:Fix faults handling (#1205),目的是为了修复一个RLE+问题。
当晚,这个问题被利用,Testnet1 遭受攻击内存溢出攻击,所有爆块的矿工内存全部爆掉,程序崩溃。有意思的是,有人在 Slack 发言称,自己的128G内存的机器报内存不够,马上256G的机器就要到了,到了再跑。很遗憾,伙计,256G也不够,你内存即使达到256T都不会够。
这次攻击是一次高质量的攻击,需要对Filecoin的编码和消息机制都非常了解才能实施,因为这次攻击是一个组合消息攻击。Filecoin 创造性地使用很短的编码(RLE+)来表示一个大的集合,这个可以大大节省链上数据量。但是,这个大的集合在计算的时候是要展开的。看过《三体》的同学们都知道,一个质子的二位展开是个什么概念。这样,攻击者就可以发送一个很短的消息,利用展开时占据大量内存。在没有保护机制的代码中,几乎是要占用无限内存的。这犹如一颗氢弹,很快就把所有内存都爆了。此次攻击的发起者风之舞:
“实际上我们在核心团队休假前就了解这个问题所在,但因为团队休假,所以一直没有采取任何行动。在团队休假回来之后,确保代码定位和官方修复工作已经就绪,才采取行动进行验证。”
在紧锣密鼓准备工作,完成了几十个代码合并之后,Testnet2 v0.2.0版本按计划于北京时间2020年1月14日上午开始。经过数个小时的潜水练功,数个矿工冒了出来,其中有意思的是在Testnet1中出现过的大矿工 t01475 再次出现。为什么能够再次出现呢?很简单,因为矿工号是按顺序产生的,把握时机,连续抢,争取抢到这个号就可以了。t01475的矿主 simon686:
“为什么我们能继续得到1475个节点?我写了个脚本批量创建矿工,就这么简单。”据我所知,抢矿工号的不止一家,如果你在网上看到靓号,不要惊讶,脚本不复杂,真正是抢来的。
网络的启动和顺畅运行并不容易,尤其是在大量代码修改过后。
网络启动不到10个小时,当天(14日)晚上8点,第一次攻击到来(#1074),这是一次区块空指针攻击。此次攻击由一条举报共识错误的消息触发。
攻击实施者 Anonymous:“Filecoin是我所看到的第一个真正实现惩罚的链。正因为是第一个,完善起来还需要时间,现在问题不少。”
攻击发生后,团队马上行动,因为出问题的地方非常明显,修复起来相对比较容易,但需要代码评审等等程序,问题直到晚11:30左右得到完全解决。此时,戏剧性的一幕出现了,在Magik6k发布消息两分钟后,下一次攻击再次到来。所以我们看到这么一段话:
手法与上一次攻击如出一辙。只不过这一次是挖得更深一些,这次是利用签名检查不完善实施的攻击,因此成为签名空指针攻击。相信这两次攻击为同一人所为。
因为两次攻击,每一次修复出一个新版本,此时版本为 v0.2.2。
接下来两天相对平静,15日数个节点已经上榜,其中排名靠前的有:t01201, t01005, t01475, t01227, t01205,呈现群雄逐鹿之势。
16日开始,t01201 和 t01346 率先突破 50T 算力,呈两强争霸局面。
16日,t01201团队进行设计中的错误测试,模拟主网上线后由于服务器或硬盘原因造成数据不可恢复的情况。Lotus代码对此有相应设计,可以通过报告错误来通知网络。
但是,在数据量比较大的情况下,错误sector的申明不能完全生效。原因在于 AMT 程序实现过程中的问题。
Why没有想到这里会有问题,第二天看到后,直接说,相对于其它的攻击,这个问题的质量比较高,修复起来也更难。事实上确实很难。
索性通过一天的努力,此问题被认为是在v0.2.3版本中部分修复;但事实上,时至今日(18日)的版本 v0.2.4 中此问题仍然在。
时间到了16日晚,又一波攻击开始了。还是利用共识惩罚的实现缺陷。
这一次的攻击,利用了程序中没有判断两个区块是否为同一个,因此可以对任何一个矿工进行攻击。利用相同区块进行攻击,因此称为同块攻击。看似十分简单,但是,如果你到 Filecoin 链上去查消息,希望这样的惩罚消息达到数千条。
但是想要成功没有那么简单,数千条惩罚消息中极少数成功,绝大多数都是失败。这也说明这个漏洞利用起来难度很高。
十分遗憾的是,16日晚,有人攻击生效,t01475被定点清除。
16日晚很不平静,从链上信息分析,在t01475被清除后两小时之内,网络再次遭遇攻击。这次攻击利用的是一个许多人都知道的漏洞 - 下溢漏洞。具体说来就是当矿工算力减少的时候,系统的减法有问题。因为都是无符号整数,当被减数比减数还大的时候,就下溢了,因此出现负数。而无符号整数会把一个负数看成一个很大的数,因此,可以靠攻击这个漏洞获取极大的算力。这是一个无符号整数下溢攻击。
此下溢攻击一旦生效,全网其他矿工的算力占比几乎可以忽略不计,导致不能出块,相当于让全网停滞。
下一步,t01475回退区块至攻击之前,算力还在的时候,进行分叉,过滤攻击消息,独自前行,直到重量超越主链。
有意思的是,在这个期间,不停地发生针对 t01346 和 t01205 的同块攻击,这些消息在网络中仍然畅通无阻。但尽管看到尝试无数次,遗憾的是,攻击没有成功。这也侧面证明了攻击难度不小。
17日,Filecoin团队,针对相关问题进行了修复,推出 v0.2.3 版本。
18日,网络中叱咤风云的两名矿工宣布下线。他们是:t01346,t01457。主要是完成阶段性的测试任务,同时也要回家过年了。t01346承诺通过钱包给需要的矿工转 Fil,希望有更多的人参与测试。
18日午,网络突然停滞。Why主动申明自己触发了一个问题,中断了网络。前文已经提到,这个问题就是 t01201 团队发现的问题,并没有完全修复。在 v0.2.3 版本中继续出现,触发下溢攻击。
Why 尽快拿出了 v0.2.4 版本。但十分遗憾,问题并没有完全修复。
接下来,Filecoin团队会集中力量进行连续三周的持续开发,主要是完全符合Spec的定义,相信代码改动会不少。大家可以安心回家过年了。等到过完年,开发完成,真正进入测试网第二阶段,好戏应该会继续上演。
【IPFS原力区】
价值观:价值 共建 共享 荣耀
总部位于上海,聚集基于分布式网络&存储的众多技术大咖和爱好者,深耕基于 IPFS 的商业生态建设和社区发展。
【原力开放日】
每周二举办,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,共建IPFS生态的健康发展。