10月13-14日,由DoraHacks主办的区块链安全Hackathon在北京举办,赛前,来自长亭科技、猎豹科技、链安科技等多个区块链安全公司的嘉宾围绕智能合约的安全问题带来了主题分享。巴比特整合现场精华内容,为大家详解智能合约漏洞产生之缘由、影响之巨大、解决之方法。
什么是智能合约?
智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。其概念于1995年由Nick Szabo首次提出。
“智能合约是区块链的核心技术之一,是多方参与场景中的共识规则,更是智能合约是价值传递的中枢。之所以区块链出现以后安全问题变得前所未有的重要,是因为智能合约实现的是一种价值传递,区块链上的每一个数字都是价值,每个漏洞导致的数字变化,其背后就是巨额的价值损失。”链安科技CTO郭文生表示。
根据猎豹科技高级研究员隋欣整理的数据,2011年至2018年安全事件统计显示:
可以看到,虽然智能合约安全事件占比并不是最高的,只有6.67%,但是其造成的损失是巨大的,竟然已经达到12.4亿美元。
其中,最典型的几起智能合约重大安全事件包括:
2016年6月The DAO安全漏洞,导致5000万美元的损失 2017年7月Parity多签名钱包两次安全漏洞,分别导致3000万美元、1.52亿美元的损失。 2018年4月BEC代币被盗事件,由于一行代码的安全漏洞引发其9亿美元市值几乎归零。
在Hackathon上,猎豹科技高级研究员隋欣对智能合约漏洞类型做了如下总结:
链安科技CTO郭文生也对以太坊智能合约开发中常见的漏洞进行了梳理:
案例一:整型溢出
在上述智能合约漏洞类型中,整型溢出漏洞被几位安全领域的专家着重强调。
简单来讲,我们知道在计算机中,有符号整数会在最高位用0表示正数,用1表示负数,而无符号整数则没有这种限制。而之所以出现整型溢出,是因为将数据放入了比它本身小的存储空间中。
例如,一个uint8,只能存储在范围[0,255]的数字,试图存储256到一个uint8变量,则结果将变成0(100000000)
如果没有检查用户输入又执行计算,导致数字超出存储它们的数据类型允许的范围,Solidity中的变量就可以被用来组织攻击。
整型溢出漏洞看起来只是一个低级的错误,但有可能造成巨大的经济损失,在区块链智能合约中,也许会被黑客利用,致使代币严重超发价值归零。而之所以产生诸如此类的问题,就是开发者在编写合约时不严谨所致,或者没有使用SafeMath去做相关功能,或者没有进行完备的溢出测试,这些溢出问题应该可以放在虚拟机层检测和预防。
案例二:Owner权限问题
在对以太坊链上智能合约进行安全审计后,可以发现很多合约具有Owner权限被盗或过大等问题。
“Owner是Solidity语言中对智能合约开发者的称呼,也就是项目方。如果合约发布后,Owner还具有非常大的超级权限,这违背了区块链共识共建的精神。”链安科技CTO郭文生表示。
Owner权限过大会产生什么问题呢?
郭文生表示,对以太坊ERC20智能合约安全事件进行分析后发现,超级权限被盗可能存在如下安全隐患:
1. 随时冻结代币转账; 2. 任意铸造发行新的代币 3. 销毁任意账户内的代币
他进一步解释:“Owner权限如此之大,说明众多所谓的去中心化的产品,实际上隐藏一个潜在威胁,控制权掌握在开发者手上。这里存在两重风险,一是如此强大的Owner权限被黑客盗取,黑客可以对其代币为所欲为,操纵整个代币的价值,对整个加密货币生态造成影响,后果不堪设想。二是项目方本身,也不能完全保证他不会作恶。因此,在智能合约上线之后,应当限制Owner权限,采取社区自治、合约自治的方式,这才符合区块链的精神。”
如何解决智能合约的安全问题?
既然发现了这些问题,就要想办法去避免,郭文生给出了几点建议:
首先,对于开发者,要尽量参考有价值的模版,尽量使用安全库。因为在审计过程中可以看到,很多合约的错误是重复雷同的,这就是因为采用了伪劣的核心模版。
其次,开发完成后,要进行全方位的功能和编译测试,功能上要保证满足客户需求,测试方面一是重视编译错误和警告,尤其是那些未知错误的提示;二是要具备完备的人工设计测试案例;三是进行静态分析工具测试;四是进行动态分析工具测试,进而发现执行过程中的隐藏问题。
最后,不可能完全依赖开发人员,需要第三方审计公司来帮助完善代码安全性。这些公司内部会有精度更高、更完备的测试工具,在形式化验证之后,还会进行人工漏洞复现和人工复审。
本文源自巴比特
更多精彩资讯,请来金融界网站(www.jrj.com.cn)