首页 > IT业界 > 正文

小代码导致整个项目失败!合约安全问题该如何重视?

2018-12-10 16:21:17  来源:牛华网

摘要:近年来,智能合约成为了区块链安全的重灾区,从The DAO到BEC,SocialChain,Hexagon,再到EOS漏洞,智能合约安全漏洞频现令不少开发者和企业对区块链望而却步。
关键词: 小代码导
    近年来,智能合约成为了区块链安全的重灾区,从The DAO到BEC,SocialChain,Hexagon,再到EOS漏洞,智能合约安全漏洞频现令不少开发者和企业对区块链望而却步。12月8日,在迅雷链技术沙龙第六站现场,迅雷链底层研发工程师胡登启,全面、系统地剖析了智能合约安全问题,一一分析了智能合约中存在的典型漏洞和预防措施,并总结出智能合约编程过程中,需要注意的三大安全原则,在现场听众间引发了热烈反响。

31

区块链虚拟机工作原理

关于虚拟机的运行原理,胡登启以EVM为例,讲解了虚拟机底层是如何实现的,让开发者对虚拟机有了更全面的认识。

区块链的虚拟机应该包含以下6个特性:

1.安全。这也是最重要的,即代码在沙盒中运行,一旦发生错误,可以回滚掉所有更新;

2.结果确定,没有歧义。在区块链的所有节点执行该逻辑,得到的结果一定是保持一致的;

3.简单。即操作码低级,结构简单;

4.具备特定的能力。虚拟机能处理加密运算,比如支持椭圆曲线算法,能访问交易与链状态,获取blockhash,tx相关内容等等;

5.易于优化。支持即时编译等;

6.节省空间。虚拟机组件紧凑,便于集成到区块链服务中。

通过分析EVM虚拟机,胡登启总结了一个通用区块链虚拟机应该是如何运作的:开发者编写合约源代码,通过编译器编译成字节码,虚拟机在执行过程中会通过代码加载器将字节码加载到虚拟机内存里面。虚拟机的执行引擎会执行一个一个的指令,在执行指令的过程当中会访问到一些堆栈的数据,同时会访问运行时的数据区,执行结束后会进行持久化存储。

一个图灵完备的虚拟机,能执行各种各样的智能合约。

区块链虚拟机的执行流程

32

迅雷链支持图灵完备的EVM虚拟机,胡登启以一个简单的solidity合约为例,为现场开发者分析了EVM虚拟机是如何运行的。

EVM虚拟机的执行主流程是在Run函数里面的,在循环里面首先会获取对应的操作码,将操作码关联到对应的指令,这个指令在执行之前会进行一些数据的校验。执行指令完之后,可以判断继续执行指令还是返回退出。

EVM中的操作码主要分为四类:

第一类是算术运算,包括最基础的加减乘除运算指令。

第二类是逻辑运算,包括与、或、非、等于、不等于、大于、小于等。

第三类是与区块链状态相关指令,具体是指区块信息如coinbase、区块时间戳、区块序号等,还有交易相关的,如交易的发送者,交易转账金额等指令。

第四类是跟存储相关的指令,比如读取虚拟机运行时内存数据,或者存储数据到区块链状态中。

每一个操作码都对应一个操作指令。操作指令定义了操作码具体要执行怎样的操作,操作消耗的gas值,操作需要的参数与返回值的个数,还有操作需要额外空间。同时操作指令中还定义了一些标记位,比如终止运算、跳转、是否出错、是否应该返回等。

胡登启通过展示最简单的加法操作指令为例,为大家分析了指令结构。EVM虚拟机每个操作指令都会消耗一定的gas值,这么做的目的一方面是为了避免开发者编写无限循环的代码,另一方面是为了给打包交易的节点一点奖励。

智能合约开发的安全准则

不过胡登启指出,EVM只是区块链虚拟机的一种实现方式,而且现行的智能合约还是一个在不断发展的技术,要想运用好这个技术并不容易。

事实上,在实践过程中,合约被爆出了各种安全漏洞,这些漏洞可能给项目发行方造成巨大的损失。因为区块链是去中心化的自治系统,往往发现漏洞后,发行方很难去修复这个漏洞,只能任由黑客肆意的攻击。因此要求开发者在编写智能合约时,做更加全面的安全测试,尽量避免包含漏洞的代码发布到区块链系统中。

胡登启通过分析智能合约中存在的典型漏洞,向现场听众展示了智能合约安全问题的重要性,并为开发者编写智能合约提供了一些参考。

他以今年年初轰动一时的BEC合约漏洞为例,讲述了智能合约安全的重要性。BEC是美链公司发布的token,于今年2月上线交易, 4月22日该合约被爆出重大漏洞,导致其token市值几乎归零。

其智能合约中有行代码,是个乘法运算,用以计算一次交易中转移token的总值,计算结果使用uint256类型保存。按照c或者c++的开发经验,这里存在整数溢出的问题。

黑客正是利用了这个漏洞,进行BEC token的巨额增发,最终导致其价值接近归零。

胡登启以此作为反面教材,告诫开发者,在合约开发中进行任何数学运算时,都推荐使用SafeMath库,这样可以避免溢出的漏洞。比较讽刺的一点是,BEC合约的其他代码都使用了SafeMath库,唯独漏了这一处。可见代码测试一定要充分,漏了一个点,可能造成巨大损失。

通过对另外数起知名安全漏洞案例的分析,胡登启总结了智能合约开发的3条安全准则:

1.开发者应深入的理解区块链系统的运行原理。

2.希望开发者熟练掌握一门合约语言的特性。

3.要做全面的代码测试,不能有侥幸心理。

33

胡登启最后表示,区块链智能合约还是一门比较年轻的技术,需要在开发者的不断实践中去完善与提升。因此在目前阶段,开发者进行智能合约编程时,尤其需要注意规避漏洞,以保证合约具备足够的安全性。


第三十六届CIO班招生
国际CIO认证培训
首席数据官(CDO)认证培训
责编:chenjian

免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。