您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 网络/安全 > 正文

智能合约问题致区块链安全事件频发

发表于:2018-09-26 作者:猎云财经 来源:中国IDC圈

1000

  腾讯上半年的报告统计,因区块链自身问题导致的损失达到12.5亿,其中智能合约的问题占了较大的比重。

  9月13日晚,Armors Labs研究院院长刘鹏作为主讲嘉宾参与到猎云财经空中课堂第十四期的分享当中,本期课题:智能合约安全问题的分析与警示。

  以下为分享实录(经编辑删改):

  主持人好,诸位币圈儿的兄弟姐妹们,大家晚上好。欢迎大家参与猎云财经的分享会,我是刘鹏,来自Armors Labs研究院。

  Armors Labs作为全球顶级的区块链安全实验室,从智能合约全生态平台延展到整体的区块链安全平台,致力于打造一整套完整的智能合约防御、监测、故障阻断以及升级体系,实验室提供开源的智能合约引擎,并逐步适配所有流行的底层公有链。

  01

  区块链安全

  区块链安全大致涉及到三个大的方面。

  第一个,区块链自身机制,这里包含了智能合约、51%攻击、双花攻击等。

  第二个,区块链生态,包括交易所被盗、拒绝服务攻击、交易所被钓鱼等。

  第三个,使用安全,包括账号失窃、用户被钓鱼、私钥泄露等。

  我们今天要讨论的重点内容是区块链自身机制中智能合约安全的相关话题。

  02

  区块链发展的路径

  区块链的发展划分为三个时代,分别定义为区块链1.0、2.0和3.0。

1000 (1)

  2.0时代的典型代表是以太坊,我们现在正处于2.0时代,大家都在以数字货币为出发点,研究区块链的发展,寻找具体业务的落地方式。

1000 (2)

  3.0时代的定义叫可编程社会,这个时代将是区块链真正落地的时代,我们目前就是在向3.0时代大步迈进。

  链塔数据BlockData发布了《2018年8月以太坊DApp数据分析报告》,报告显示,以太坊上的DApp数量多达775个,累计交易笔数多达3亿,累计交易金额超过59亿ETH。

  随着越来越多的Dapp出现,生态的逐渐发展,区块链将会真正进入到高速发展期。

1000 (3)

  03

  DAPP与智能合约

  智能合约是部署在区块链上的一段代码,目前所有的Dapp都需要通过智能合约来实现,像发行数字货币、投票等功能都离不开智能合约。

  由于智能合约被部署到公链上以后,难以被修改,所以才具有了一定的公信力。

  现在的智能合约大部分都与数字币有关,因其对应的市场价值非常庞大,成为了攻击者眼中的蛋糕。

  腾讯上半年的报告统计,因区块链自身问题导致的损失达到12.5亿,其中智能合约的问题占了较大的比重。

  04

  智能合约问题导致区块链安全事件频发

  FOMO3D是一款主要基于以太坊智能合约开发的区块链游戏,这款游戏包含了闪拍、分红机制、战队功能、邀请好友等功能,整体看起来还是比较全面的一款博弈类游戏。

  FOMO3D游戏中的随机糖果被攻击者大量获取,攻击者通过攻击合约生成的临时合约不断对FOMO3D的主合约进行攻击,这是攻击者利用智能合约的随机数漏洞发起攻击的一个典型代表。

  由于FOMO3D的源代码是公开的,在合约中可以看到,产生随机数的种子是通过当前块信息和msg.sender一起计算出来的,攻击者可以在攻击之前预先计算出结果,这样就能增大自己中奖的概率,从而达到少投入、多获益的目的。

1000 (4)

  另外一个是GOD.GAME被盗事件,2018年8月22日,GOD.GAME官方发布消息,因合约遭到攻击,所有投注的ETH被盗走。

  这个游戏被攻击的原因与FOMO3D不同。

  FOMO3D可以认为是攻击者利用了以太坊的规则进行合理的操作,而GOD.GAME完全就是人为原因造成的了。

  通过代码分析发现GOD.GAME是由于类型转换操作不当,导致dividends异常增加,攻击者通过调用reinvest方法购买大量token,最后卖出token,获利离场。

  这是典型的由于智能合约代码有漏洞导致的合约被攻击事件。该游戏造成的损失比较小,有200多ETH。

  对于有交易属性的游戏合约,安全漏洞出现的情况非常普遍,除了类型转换漏洞,还有可能有存在后门的情况。投资者在参与的时候一定要谨慎,投资有风险,出手需谨慎。

  另一种常见攻击叫溢出漏洞攻击。

  溢出漏洞是指当要表示的数据超出计算机所使用数据的表示范围时,产生的数据的溢出。

1000 (5)

  我们用一个比较通俗的例子解释一下溢出漏洞。上图的这个算盘,很老的物件,大概民国时期的,叫5档算盘,这个算盘能表示的最大数字是99999。

  99999是这个算盘的极限了,思考一下,当我们在99999的时候再加1会怎么样呢?

  结果就是所有的算珠恢复原位,只能表示0了。

  多出来的一位去哪儿了呢?多出来的一位溢出了。这个漏洞造成的第一个危险就是“归零”,它可以让一个账户的代币瞬间变成或者是极小的一个数字。

  而且当你反查交易记录时,一切都是正常的。攻击者利用这个漏洞,使判断条件成立。

  曾经BEC批量转账漏洞事件就是利用了没有使用安全函数计算乘法,导致计算机结果超出范围造成溢出事件,使判断条件成立,然后就可以进行大量的转账了,最终BEC蒸发了60多亿的市值,不仅仅是给投资者,也给项目方造成了极大的损失。

1000 (6)
1000 (7)

  图中红框的地方是我们为了避免溢出漏洞而使用的安全数学函数。

  在这种写法里,我们除了做正向计算外,还要做一次逆向计算,以保证运算结果可逆,这样的计算结果才是正确的。

  也就是说做一个加法,我们计算a + b = c,安全函数在计算完之后一定要再计算一遍c >= a,这个结果成立,我们会认为这是一次有效的计算。虽然这样增加了计算量,但是由于智能合约部署以后不可变更并且不可升级的特性,我们牺牲一点点效率,换来的是安全正确的计算结果,也是值得的。

  所以在投资的时候一定要找开源代码的来投,开源代码一定要检查是不是用了安全函数,但是要注意,有了安全函数,不代表用了安全函数。

  前不久有这样一个案例合约,项目方定义了安全函数,但是只有个别地方使用了。Transfer的操作里面没有使用,这个时候我们给项目方提供了风险提示,项目方根据我们的指导,逐一将安全函数应用到位,最终才通过审核。

1000 (8)
1000 (9)

  对于投资者来说,我们给出几点建议。

  第一,合约没有开源的产品不要碰,风险太大;

  第二,没有经过安全机构审计的产品不要碰,可能存在潜在问题;

  第三,投资风险,要谨慎操作,不要贪心。

  Armors Labs为了帮助项目方规避智能合约中的问题,提供了基于以太坊的开源标准库Armors Solidity和基于EOS的开源标准库Armors EOSCpp。这两个标准库可以帮助项目方在以太坊和EOS上快速开发自己的代币合约。使用标准库的代码,可以降低合约出问题的概率。在一定程度上,保障合约的安全。

  我今天要分享的内容,就到这里,谢谢大家。

  精彩问答:

  Q1:刘老师,以太坊在2016年的时候,被The DAO攻击,黑客盗取350万个以太币,结果是硬分叉成ETH和ETC,再结合现在的以太坊瀑布行情,以太坊为代表的智能合约设计是不是存在漏洞?区块链的网络是开放的,理论上无法阻止更多的计算机资源成为节点,若控制大部分计算机资源,就能重改账本,实现51%双花攻击。

  刘鹏:这个世界没有完美的系统,51%的双花攻击也早就成现过。现在大量的算力被各大矿场占据,个人想掌握够大的算力不实际。双花攻击本身是底链的安全问题,而智能合约的安全问题和它是两种情况,不能一起讨论。智能合约出问题,主要是项目方的开发团队失误造成的。这种情况,通过测试和安全审计可以很好地降低发生问题的可能。而51%是底链本身的机制造成的。随着行业的发展,会有新的算法出现,进一步的优化这个问题。

  Q2:刘老师,区块链3.0是什么现在还不是十分确定,但终归会出来。等到3.0落地的时候,基于以太坊上的2.0会怎么演变?消亡吗?那伴随的以太坊价格会不会非常低?

  刘鹏:我认为3.0时代是一个百花齐放的时代,不同的公链出现服务于不同的行业。以太坊上的2.0形态不会消亡,因为以太坊本身也在进化成长,开发团队会一直努力的让以太坊成长下去,适应3.0时代的到来。行业型的公链具有垂直性,以太坊更具有普遍性,所以以太坊未来依旧很有发展。至于价格方面,影响因素太多,我猜不出来。