【Filecoin】Testnet2: 跌宕起伏暗流涌动第一周

此文原发于公众号胡飞瞳

Testnet2 启动于西方圣诞节和新年之后,开始于中国新年来临之前。短短几天,跌宕起伏,看的人心惊肉跳。

现阶段的测试网络,虽然总算力的增长能力和出块效率是一个参考指标,但是,更重要的指标在于网络的安全性和完善性。大家在看到的网络表面的一些指标,其实是冰山露出水面的部分,如果能够了解更多水下的推动力,对整个网络的认识和形势判断会有很大的帮助。

本文尝试做一个记录,顺祝大家新年快乐!


Testnet2 的上线,参与者的积极性明显高于Testnet1,算力增长速度10倍于Testnet1。各路大神各显神通,抢占身位。市场也在纷纷猜测,各家实力如何,服务商们尽力博取用户信任。大家很多时候拿算力总占比或出块效率作为比较指标。这其实可能仅仅看到表面,如果细心一些,就会发现,这一周发生了太多更有趣的事情。这一周,是Filecoin所有测试以来,网络最为繁忙,安全话题和问题出现的最多的一周,这些安全问题的发现和解决才体现了真正实力。本文按照时间线进行一个回顾。

提 要

本文提到的矿工代号
- t01346, t01201, t01475, t01205, ...

本周发生的攻击方式:

  • 内存溢出攻击(利用RLE+ 实现缺陷)

  • 区块空指针攻击 (利用惩罚机制实现缺陷)

  • 签名空指针攻击 (利用惩罚机制实现缺陷)

  • 同块惩罚攻击 (利用惩罚机制实现缺陷)

  • 无符号整数下溢攻击 (利用 sector 缺失,算力扣减实现缺陷)

本周发现的其他重大bug:

  • AMT 删除错误

注一:本文仅列出问题和现象,但不做技术探讨,技术探讨留待将来进行(也许值得写一本书,Filecoin所有的问题对区块链行业都有借鉴作用)。

注二:本文数据均从Filecoin链上消息分析,或从Github公开渠道,以及私下沟通得来,准确度有渠道负责 :-)。

注三:Filecoin 短时间内暴露这么多问题,这是好事,区块链项目只有通过开源和大众积极参与才能真正提升效率和安全性,闭门造车只有死路一条。问题暴露得多,说明一方面参与者众多,另一方面问题都暴露出来,安全性就提高了。

image

热身:内存溢出攻击迎接 Testnet2

时间回溯到 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

15日一天,呈现群雄逐鹿之势。

16日开始,t01201 和 t01346 率先突破 50T 算力,呈两强争霸局面。

发现:Sector集合删除错误

16日,t01201团队进行设计中的错误测试,模拟主网上线后由于服务器或硬盘原因造成数据不可恢复的情况。Lotus代码对此有相应设计,可以通过报告错误来通知网络。

但是,在数据量比较大的情况下,错误sector的申明不能完全生效。原因在于 AMT 程序实现过程中的问题。

Why没有想到这里会有问题,第二天看到后,直接说,相对于其他的攻击,这个问题的质量比较高,修复起来也更难。事实上确实很难。

索性通过一天的努力,此问题被认为是在v0.2.3版本中部分修复;但事实上,时至今日(18日)的版本 v0.2.4 中此问题仍然在。

受伤:定点攻击

时间到了16日晚,又一波攻击开始了。还是利用共识惩罚的实现缺陷。

这一次的攻击,利用了程序中没有判断两个区块是否是否为同一个,因此可以对任何一个矿工进行攻击。利用相同区块进行攻击,因此称为同块攻击。看似十分简单,但是,如果你到 Filecoin 链上去查消息,希望这样的惩罚的消息达到数千条。

天啦,有多少人在寻找问题?有多少人在不停的尝试。但是问题没有那么简单,数千条惩罚消息中极少数成功,绝大多数都是失败。这也说明这个漏洞利用起来难度很高。

十分遗憾的是,16日晚,有人攻击生效。t01475被定点清除。

攻击者 hacker 是谁,请让我采访一下。

恢复:停滞网络,时间倒流

16日晚很不平静,很可惜我错过整场大戏。但所幸的是,我们玩的是区块链,一切都被记录在案。

从链上信息分析,在t01475被清除后两小时之内,网络再次遭遇攻击,这次攻击利用的是一个许多人都知道的漏洞 - 下溢漏洞。具体说来就是当矿工算力减少的时候,系统的减法有问题。因为都是无符号整数,当被减数比减数还大的时候,就下溢了,因此出现负数。而无符号整数会把一个负数看成一个很大的数,因此,可以靠攻击这个漏洞获取极大的算力。因此这是一个无符号整数下溢攻击

此下溢攻击一旦生效,全网其他矿工的算力占比几乎可以忽略不计。因此将不能出块,相当于让全网停滞。

下一步,t01475回退区块至攻击之前,相当于通过时间机器,回到之前,算力还在,进行分叉,过滤攻击消息,独自前行,直到重量超越主链。

有意思的是,在这个期间,不停地发生针对 t01346 和 t01205 的同块攻击,这些消息在网络中仍然畅通无阻。但尽管看到尝试无数次,遗憾的是,我并没有发现攻击成功。这从一个侧面也证明了攻击难度不小。

估计这两个矿工(t01346 和 t01205)会十分纳闷,我是谁,我做了什么,为什么针对我。但区块链网络因为匿名,容易伪装,只有网络安全才是最重要的,攻击来源的查询十分困难。

17日,Filecoin团队,针对相关问题进行了修复,因此推出 v0.2.3 版本。

谢幕:超级矿工下线

18日,网络中叱咤风云的两名矿工宣布下线。他们是:t01346,t01457。主要是完成阶段性的测试任务,同时也要回家过年了。

t01346承诺通过钱包给需要的矿工转 Fil,希望有更多的人参与测试。

image

让我们向他们致敬!

继续:bug修复不停歇

18日午,网络突然停滞。Why主动申明自己触发了一个问题,中断了网络。前文已经提到,这个问题就是 t01201 团队发现的问题,并没有完全修复。在 v0.2.3 版本中继续出现,触发下溢攻击

Why 尽快拿出了 v0.2.4 版本。但十分遗憾,问题并没有完全修复。那有什么呢?

我们不是正在修复 bug,就是在修复bug 的路上。睡一觉回来继续吧。也许v0.2.5版本就出现了。


接下来,Filecoin团队会集中力量进行连续三周的持续开发,主要是完全符合Spec的定义,相信代码改动会不少。大家可以安心回家过年了。等到过完年,开发完成,真正进入测试网第二阶段,好戏应该会继续上演。


我的相关文章

  • 【Filecoin】写在测试网上线之前

  • Filecoin: 共识攻击,绝不容情

  • Filecoin:重力攻击手法 - 关于重量之三

  • Filecoin源码研究 - SectorID 及 ProvingSet

  • Filecoin 攻击之二:预挖攻击

你可能感兴趣的:(【Filecoin】Testnet2: 跌宕起伏暗流涌动第一周)