区块风豹实验室

以太坊智能合约漏洞与安全检测

2018-11-8 16:30:31

01智能合约安全现状

每当智能合约被曝安全漏洞后,都会伴随币市跳水大跌。黑客可以轻易地利用这些漏洞,进行虚拟货币的无限增发随意转账等等。根据白帽汇安全研究院的《区块链产业安全分析报告》,由于智能合约所导致的安全问题已经造成了12.4亿美元的损失,占到了总损失的43.3%。
 


 

频繁发生的智能合约安全事件使得人们对以太坊的安全现状产生了极大的质疑,这也影响了目前处于初期阶段的区块链技术的发展与普及。

因此,本文将就已出现的智能合约漏洞案例进行详细地分析,并浅谈当前智能合约漏洞检测方法及安全编码建议。

 

02智能合约漏洞重点解析

>>1、整数溢出漏洞

由于以太坊虚拟机(EVM)用栈来模拟内存空间,对栈的管理保护机制并不完善,合约在进行计算的时候应该严格全面考虑栈空间的情况,避免溢出现象的发生。特别是有关转账的函数更应该严格校验其安全性。而目前已知的SMT、BEC、EDU、BAI智能合约漏洞都在转账逻辑中产生了整数溢出漏洞,导致代币可以无限增发或任意转账。

案例1:SMT案例解析
 


合约地址:

0x55F93985431Fc9304077687a35A1BA103dC1e081

 

RatingToken检测结果如下:
 


漏洞解析:

合约漏洞存在于方法transferProxy中,该方法提供了一个可供任何人调用的转账函数。通过传入的参数值,可以规定转账两方的地址、手续费、金额。

该函数的首先进行参数检验,如上图红色方框内显示:检测合约转出方_from的账户余额balances[_from]是否足够支付需要转出的金额_value已经手续费_feeSmt。如果余额不够,则转账失败,通过revert()退出函数并且将状态恢复到执行该函数之前;如果余额足够,则进行转账。

在该检测方法中,由于转账金额_value和手续费_feeSmt均有函数调用方传入,攻击者传入一个极大的_value值,并且使得_value加_feeSmt超过最大的uint256,产生整数上溢出。此时检测函数的右边是一个极小的数,能保证函数通过检测,进入转账流程,而保持真实转账金额_value极大。

攻击者通过恶意构造转账金额和手续费的值,达到无中生有并获取大量SMT虚拟货币的攻击目的。


真实攻击案例:

攻击者通过调用transferProxy函数,并传入8ff…f,700…0造成整数上溢,成功获取了6.5*10^60个SMT货币。
 


 



案例2:美图BEC漏洞解析
 


合约地址:

0xC5d105E63711398aF9bbff092d4B6769C82F793D

 

RatingToken检测结果如下:
 


漏洞解析:

该合约由美图与美链联合发布。合约漏洞存在于函数batchTransfer中。该方法允许任何人调用来批量向_receivers列表中的地址进行快速转账。该函数首先对调用方,即批量转账转出账户地址里的余额进行了校验,当且仅当余额balances[msg.sender]大于批量转账的总数量uint256(cnt) * value时,才可正常转账。然而函数并未对uint256(cnt)*_value进行溢出验证。如果该乘法产生上溢,攻击者可以成功地从一个余额不足的账户里转出大量的BEC币。

 

在该漏洞曝出之后,曾经暴涨4000%的BEC币的价值瞬间归0,导致了大量的金额损失蒸发。

 

真实攻击案例:

攻击者通过传入800…0与000…02,相乘上溢,产生了近5.7*1060 BEC币
 


 


通过上述两个案例可以得知,智能合约的溢出漏洞可以轻易地被攻击者利用,并造成极大的负面影响。所以我们建议智能合约在编码的过程中一定要全面地考虑运算过程中的溢出问题,并采用safeMath安全运算工具包。

 

>>2、交易顺序依赖漏洞

该漏洞由新加坡国立大学的Loi Luu等人提出,他们指出在智能合约执行的过程中,由于发起方对函数调用的顺序不同,可能会产生不同的输出结果,形成业务逻辑漏洞

以他们提供的案例为基础,我们具体对该漏洞进行分析:
 


 

该合约实现的功能为:调用者需要成功执行完毕Puzzle()后可以从合约建立者处拿到一笔赏金。

 

我们设定,调用者获取赏金(函数位于第26行)发起的交易为Tx(User_getReward)。合约的创立者可以修改当前赏金的金额(代码位于第19行)发起的交易为Tx(Owner_updateReward)。

 

矿工先打包交易Tx(User_getReward),再打包Tx(Owner_updateReward),用户可以得到的赏金为原始的赏金R0。

 

但是如果合约拥有者想欺骗用户,让用户首先进行大量的计算,并提高自己修改赏金的交易Tx(Owner_updateReward)的矿工费,使得在用户获取赏金Tx(User_getReward)之前将赏金reward修改为一个极小的值,合约发起方用很少的赏金去欺骗用户,使用户造成损失。

 

通过上面的分析,我们可知即使智能合约的代码是公开的、不可修改的,但由于其中的安全漏洞极难发现,用户在调用的过程中容易受到恶意的欺骗而造成损失。
 

03智能合约漏洞检测

目前,大数据评级机构RatingToken已正式上线智能合约漏洞检测功能,这是国内首款面向币圈用户的智能合约安全检测产品。RatingToken会对已收录项目的合约地址和代码进行检测,通过机器学习、GAN、形式化验证的方式进行模型筛选,识别出具有合约漏洞及欺诈性地址的高风险项目。

目前网站支持检测的漏洞类型有:溢出检测外部调用检测敏感行为检测异常检测逻辑检测这五大类。网站提供一键式智能合约检测平台,用户输入智能合约的地址即可方便获取智能合约的漏洞检测报告,降低投资风险。