不走。EOS Force.io最后警告!
这是一篇技术文章,写给广大节点候选团队的开发者和对EOS安全研究感兴趣的朋友。
EOSForce.io作为一个对EOS代码进行了深入研究并进行大量部署测试的团队,多次提醒主网安全问题,并对发现的问题进行了修复和修改。近年来,随着研究的深入,我们发现了更多的安全隐患,一些候选节点开始关注主网的安全。
接下来,我们揭示了至今仍困扰我们的九个核心安全风险。既然Block.one声称不负责任何主网的安全,我们自己也做了一些初步的解决方案。在这里我试着帮你理解:
为什么EOSForce.io对EOSIO的改动是必要的。如果有更好的解决方案,希望大家可以和我们交流,一起为EOS的安全做出贡献。EOSForce.io承诺不为超级节点运行,在EOS主网公测结束验证安全性之前,不会贸然启动主网。也不建议用户在此之前导入私钥来激活主网络资产。
为了解决EOS目前的麻烦,EOSForce.io采取了最新的预防措施,以最少的功能安全启动EOS主网,然后经过各约束模块的正式验证和大规模测试验证后,再慢慢释放相应的功能。
一个
麻烦一:
EOS基于资源抵押模型,有所创新,但还没有达到最初的预期水平。目前已经在运行的公链都是收费的模式。
收取手续费有两个好处:
1.防止链级DDOS。众所周知,以太坊的POW测试网络经常被攻击,因为硬币没有价值,没有防止链级攻击的阈值。以太坊中各种码气价格的合理设定也是为了这个目的。众所周知,防止DDOS最好的方法就是强制攻击成本远大于获利成本。
2.手续费可以作为激励的来源,保持整个链条的生态稳定,向前发展。
EOS基于抵押模式’的想法很有新意,而且没有手续费。当时大家(包括BM)都期望通过资源抵押来阻止DDOS,后来又期望设置EOSRAM等相关资源令牌来产生激励。这就解决了收取交易费用的问题。
而交易费问题只是系统契约和底层的一点点联系,并没有被预料到。
对于开发者来说,只要随便搭建一个测试网络,就可以发送交易,不需要任何成本,从而验证我说的问题。这个问题在链级是致命的,远远超过360“史诗级”的传统内存泄露问题。因为只要有人打开电脑,就会不断向EOS主网批量发送交易。EOS网络将会失败。
EOSForce.io预防1:
鉴于此,EOSForce.io在EOS的基础上增加了每个动作设定的价格收费。只是现在EOS没有完成资源模块的时候,增加了一个交易费过滤器。BM神完成这个功能后,EOSForce可以关闭交易费的过滤,真正可以通过资源阻止DDOS攻击,刺激全链生态。
2
麻烦二:
EOS代码中有一个超级权限,不需要私钥就可以通过认证。还有以eosio开头的账户。都是准超级特权账号(eosio现在存在)。
这违背了区块链哲学的基本功能:在私人钥匙的保护下,个人资产是不可侵犯的。
EOSForce.io预防2:
鉴于此,EOSForce.io将整个系统限制为只有一个特权账户,即eosio,并使该账户的公钥数据段全为零,检查后的地址为
EOS 111111111111111111111111111111111114t 1 anm .没有人拥有或知道私钥。
三
麻烦三:
交易的设计结构太复杂
你可以看到完整的EOS数据块,我们已经拿起。EOS的一个事务可以由action数组和多个contextfreeaction数组组成。并且内联动作可以添加到动作中,contextfreeaction不需要签名,动作中可以设置大量的内联动作。
EOS是按动作顺序执行的。该事务也可以是延迟的事务。等等,这些设计都是创新,感谢BM。但是这么复杂的功能太庞大了,可以攻击和组合的点很多。事务集延迟,事务中有一个动作,动作也可以设置inline_action。这个复杂的函数需要很长的时间,多种案例组合,以及漫长而有力的测试和验证。
EOSForce.io预防3:
我们也在组织大量的团队对这一块进行测试和验证。而是为了持有者的安全。我们将事务中的动作限制为单个动作,并且我们首先限制没有签名的contextfreeaction。在正式的证明结果和各种大规模真柱测试验证成功后,这层过滤就出炉了。
四
麻烦四:
EOS查询接口如get table不能批量指定关键字查询。
在这里,不得不佩服BM这个技术天才,他用的是多插件可插拔模块编程。很多模块都是单行模式,可以互相访问。
此外,他还使用了消息总线微服务编程模式。只要每个模块对相应的消息感兴趣,并注册了相应的消息总线,就可以接受相应的消息。但是这些模块中有很多查询接口只能批量查询。
当数据很小时,是可以接受的。但是达到百万tps之后,基本上就没有机器能满足这样的查询了。虽然- key是EOS中的一个字段,但它在EOS代码中一直和transfer接口中的memo参数一样,只有它的名字,没有它的实现。
EOSForce.io预防4:
Join – key定点微查询按关键字。
五
麻烦五:
EOS水龙头模块用了很久,模块不工作。
水龙头模块是一个插件,允许用户通过第三方注册用户名。
EOSForce.io预防5:
添加水龙头插件。
六
麻烦六:
链接库数据库不稳定。
可以调用chainbase的接口,将相同的数据存储两次,程序就会核心转储。EOS契约中的multiIndex表也使用了chainbase。当你同时修改一个表中同一行数据的不可通行列时,只会更新最后一次操作。
EOSForce.io预防6:
认真复习这一块相关的代码,把有问题的地方都复习一遍。
七
麻烦七:
EOS的Wasm-jit是fork Andrew Scheidecker近两年的代码,fork有官方的webassembly。有多少只虫子?需要大规模测试。
EOSForce.io预防7:
EOSForce.io在创始块内置了系统契约,这样系统契约就是来自创始块的内置契约。EOSForce.io限制setcode、setabi接口。
八
麻烦八:
EOS没有世界状态,所以只能通过块级验证来分叉。
比如节点A和B的事务顺序表都是一样的,也就是块都是一样的。但是,对每个帐户进行了不同的数据库清点,链条是未知的。
攻击的可能性:虽然BM在apply_context.cpp中做了,但是只有契约表所有者可以修改表。但不排除你无法通过在外面构造相应的键值,直接对不同契约账户的表进行相关状态drop攻击。
此时,链中的所有块都是相同的,但每个节点中的状态存储会相应不同,甚至可以跨帐户覆盖对应的表。更改不同合同帐户的状态。
EOSForce.io预防8:
先限制自由提交代码的功能,等这些都正式证明后再放开。
九
麻烦9:
MongoDB,SQL插件的不稳定性。
EOS数据库的插件模块在mongodb之前是不错的,但是中间他们想把它抛弃,换成sql模块。然而,过去的这种变化对生态开发的用户来说是致命的。
EOSForce.io预防9:
EOSForce.io正在大规模招募区块链开发者,滤镜模块和数据库模块会更好更持续更新。
区块链开发并不比传统软件开发更好。如果一个模块的漏洞导致大规模丢币事件,即使性能真的达到一百万tps,也没有任何意义。安全稳定怎么强调都不为过。在保证安全稳定的基础上,拓展性能,拓展特色。
我们相信BM,尊重BM带来的充满希望的EOSIO。然而,没有bug的程序是不可能的。区块链和中央集权制有本质的区别。集中式系统的代码更新和数据修改权限完全由集中式组织负责,可以随意上线,查找bug,修复bug,回滚数据,抵消账目,高速迭代。
然而,区块链不能在没有bug或者特别明显的bug的情况下上线。链上的数据都是和最高价值的用户资产相关的。就算99%没问题,也一定有问题。只要有任何一个点或维度可以攻击,区块链网络就一定会失败。不要冒险。
EOSIO代码一年来不断迭代,尤其是四五月份,更复杂的设计减少了,一路修改到6月1日发布1.0版本。没有多少团队对EOSIO进行过完整的测试。然而,传统的安全攻防水平运维测试并不是真正的测试。真正需要测试的是网络投票流程、资源关联、自定义合约等。这种测试用例需要几个月的时间来编写。众所周知,以太坊的测试数据和测试脚本是代码本身的数倍。
如今EOS市值一度达到1000亿元,明细多如牛毛,远超比特币和以太坊推出时的规模。如果不能基本保证链本身的安全性,那么用户的资产就会大大减少或者为零。
Block.one官方一直强调不会负责主网的安全。EOSForce.io对EOSIO本身存在的重大风险做了大量的测试和修复,目前不敢说一定安全。接下来诚挚邀请EOS社区用户、节点候选人、第三方安全团队验证一个安全的EOS主网。确认无重大安全隐患后上线。欢迎来到EOSForce.io参与EOS主网公测。
向Oracle chain、EOS深圳等投了No go的团队致敬。在安全问题上没有妥协的余地。
通告
EOSForce.io底层公链代码已经开发完善,下周将逐步开源。目前docker可以参与主测试网络,开源后节点可以自行编译。欢迎大家参与验证更安全的EOS骨干。