2018年4月22日,以太坊上出现了一条不起眼的交易:
这次交易注定会炸弹般引爆新闻界,过分刺激容易激动的币圈。交易记录显示,天量(具体说应该是57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968个)的BEC代币被凭空转入另一个地址,而BEC发行总量仅仅为70亿枚。
被转出的一部分BEC又被转入okex并成功交易,4个小时之后,BEC官方关闭了其以太坊智能合约。而市场的抛售和非正常交易信息的披露导致BEC市值迅速归零。
攻击原理
根据交易日志和公开的代码显示,问题就出现在以下代码的第257行:
其错误的计算方法没有考虑到计算机系统的数值范围是有限度的,超出这一限度即会重新从零开始,而黑客的攻击手法正是利用了这一漏洞成功的绕过了第259行代码的检查。
老实说,现代互联网界经典的黑客攻击案例都是军团作战,作战策略涉及被攻击目标和其他多个辅助平台;作战思路涵盖攻击准备,攻击实施和现场清理等过程中的多个步骤;作战人员也分为多种角色,各种角色以多种操作与时间点相互配合从而成功猎杀目标。整个过程策略巧妙,分工有序,调度合理,无异于一场现代战争。而本例仅仅利用了代码中浅显的漏洞直接转账并交易,的确算不上高明的攻击。这也许是猎手们在撒网式寻找猎杀目标时,第一眼就看出了这个智能合约的低级漏洞,一阵窃喜之后迅速锁定目标...,很明显,这是守株待兔般的容易,只是收获太过丰厚而已。
记录显示,天量的token被转入了两个账号。
智能合约的安全状况
币圈的新闻与价格波动一样,总能带给人们惊悚,而这些天花乱坠的项目到底值不值得信任?
事实上,如果这两个智能合约的代码经过了有经验的工程师的评审,类似漏洞流向生产环境的可能性不大,如果再经过了外部机构的评审,流向生产环境的可能性更小,如果专门收集了业界的反馈,这一漏洞基本不会流向生产环境。实际上,智能合约领域的现状为:
1.靠谱的区块链开发流程应该是:智能合约开发-->内部测试-->外部安全审查-->漏洞发现悬赏-->正式上线运营。而在这个疯长的领域,有些企业由于急于上线,直接就把后面的步骤给省略了,内部测试之后直接就上线了,当然,也许内部测试都不充分。
2.从发展历程来看,基于区块链的智能合约仍然是一项新生事物,区块链的编程模式与互联网虽然相似,但还是有区别的,这种区别还没有足够多的案例可供参考,人们仍然处于积累经验阶段。
3.由于生态系统发展太快,目前从事智能合约的工程师都是从互联网开发工程师转型过来的,而互联网领域的大多数开发工程师对安全问题涉及并不深。而区块链的生态系统中开源是一条基本的潜规则,当代码全部暴露在阳光下之后安全问题就显得尤为重要,但有些工程师们显然没有做好应对的准备。
4.同样由于生态系统发展太快,市场上合格的智能合约工程师并不多,笔者所在公司也一直在物色这样的角色,但合适的候选人实在凤毛麟角。而由于业务的紧急,有些企业就赶鸭子上架,导致产品质量存在缺陷。
由于这些现状的存在,智能合约领域的安全现状的确令人担忧。不过,业界仍然总结出了一些经验与教训供同行参考,也有一些最佳实践,做的这些,应对一般的安全问题还是没有问题的。关于这些,我们下次继续讨论。