警惕智能合约漏洞:区块链上的“空气”币

发布时间 2018-07-13


 背景


区块链是近年来最具革命性的新兴技术之一,以其去中心化、不可篡改等特点,颠覆了金融等诸多行业的原有规则。区块链现已进入3.0阶段,“代币合约”作为区块链智能合约中应用最广泛的一类,也成为攻击者们的重要攻击对象。


由于技术发展时忽略了安全先行的理念,导致众多技术存在大量安全问题,与传统程序一样,代币合约无法避免地存在安全漏洞。攻击者可以利用漏洞随心所欲地控制市场上的货币总量或任意账户的货币量,这样使本来就无锚的货币彻底失去信用,成为“空气”币。



智能合约审计


启明星辰ADLab近年来持续关注区块链技术安全问题,通过对以太坊主链[1]智能合约进行研究,发现了400多个CVE漏洞。


智能合约漏洞会带来诸多恶性结果,ADLab结合实际的安全事件,以及自主发现的漏洞,对其中的三个类别的漏洞给大家做了剖析。


 重入漏洞


2016年6月,DAO攻击事件在区块链历史上留下了沉重的一笔,黑客利用重入漏洞,直接导致以太坊的硬分叉。启明星辰ADLab经过研究发现,以太坊的智能合约里面仍然存在重入漏洞。下面以BANK_SAFE合约为例进行举例说明。


● 漏洞示例


BANK_SAFE合约中存在典型的代码重入漏洞,当普通用户账户调用Collect函数时,Collect函数的逻辑没有任何问题,用户可以顺利的执行取款操作;但是当另一个智能合约调用BANK_SAFE合约的Collect函数时,会产生严重的安全隐患。

 


● 预防技术[2]


1. 使用内置的transfer()函数进行转账。由于tranfer()函数只发送2300gas,因此不足以合约之间的循环调用。


2. 采用check-effects-interactions模式的编码。在BANK_SAFE合约中,[49]行的资金扣除操作应该放到[47]行之前。


3. 引入互锁机制。添加一个状态变量锁定合约,预防重入调用。


超额铸币


2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的价格先猛涨787%,后迅速暴跌至崩盘,造成大量用户经济损失,其背后就是管理团队利用预留的整数溢出漏洞进行超额铸币,并在交易所抛售造成恶性通货膨胀,最后价值几乎归零。ADLab使用自动化审计工具发现大量智能合约仍然存在同类漏洞。下面以Genesis Vision合约进行举例说明。


● 漏洞示例:CVE-2018-11335


Genesis Vision智能合约虽然引入了OpenZepplin的SafeMath数学运算库,但其发行货币的函数mint()却没有使用安全运算函数,而是直接使用数学运算符。如果精心构造输入参数value,在[188]行发生整数溢出,溢出后运算结果小于TOKEN_LIMIT,就可以绕过token发行上限,实现超额铸币,最终导致恶性通货膨胀。这类铸币函数的执行一般需要管理员权限,因此可以看作是一种后门漏洞。

 


● 预防技术


禁止使用数学运算符,使用SafeMath运算库[3]


批量转账


2018年4月,黑客利用BEC智能合约漏洞攻击美链BEC(美蜜币),成功向两个地址转出了天量级别的 BEC代币,导致海量BEC被抛售,使得当日BEC的价值几乎归零,64亿人民币瞬间蒸发。2018年7月,AMR合约中的漏洞被黑客恶意利用,导致AMR大量增发。这两次攻击事件都是由于批量转账函数中存在整数溢出漏洞,经ADLab研究发现,下表中的智能合约仍然存在同类漏洞。


   

● 漏洞示例:CVE-2018-13836


Rocket Coin (XRC)合约中的multiTransfer函数存在整数溢出漏洞,由于该函数的属性是public,任意用户可以调用该函数进行批量转币操作,不需要管理员权限。

 


从Rocket Coin代币的TokenHolders列表可以看出黑客攻击成功的痕迹。

 


从etherscan.io可以查看黑客攻击时交易记录:


https://etherscan.io/tx/0x606316fc06922ae34e6be865e64b23598d74a5e94712447dca37a7ac4c8b30a8#decodetab


从Input Data可以看出攻击者精心构造了_amounts数组,数组中包含两个元素,元素值皆为极大值,当执行到[72]行时将发生整数溢出。因此攻击者只花费了极少的token,便完成批量大额转账。



● 预防措施


禁止使用数学运算符,使用SafeMath运算库[3]



总结


由于智能合约是一次性发布上链的,一旦出现漏洞将难以直接修补。


对于开发者而言,发现漏洞后只能发布新的智能合约然后做手动映射,在时间、人力、财力上会付出很大的代价。


对于投资者而言,智能合约上的漏洞很可能会使相应的代币变成“空气”币,带来更为直接的财产损失。

 

温馨提示:


1、区块链是新兴技术,还需加强对其安全审计和监管能力的重视。

2、炒币有风险,入市需谨慎,了解对行情,拒绝做“韭菜”。

3、重视国家法律法规,合理投资,健康理财。

 


参考链接


[1] 

https://etherscan.io/contractsVerified

[2] 

https://blog.sigmaprime.io/solidity-security.html

[3] 

https://github.com/OpenZeppelin/zeppelin-solidity


 背景


区块链是近年来最具革命性的新兴技术之一,以其去中心化、不可篡改等特点,颠覆了金融等诸多行业的原有规则。区块链现已进入3.0阶段,“代币合约”作为区块链智能合约中应用最广泛的一类,也成为攻击者们的重要攻击对象。


由于技术发展时忽略了安全先行的理念,导致众多技术存在大量安全问题,与传统程序一样,代币合约无法避免地存在安全漏洞。攻击者可以利用漏洞随心所欲地控制市场上的货币总量或任意账户的货币量,这样使本来就无锚的货币彻底失去信用,成为“空气”币。



智能合约审计


启明星辰ADLab近年来持续关注区块链技术安全问题,通过对以太坊主链[1]智能合约进行研究,发现了400多个CVE漏洞。


智能合约漏洞会带来诸多恶性结果,ADLab结合实际的安全事件,以及自主发现的漏洞,对其中的三个类别的漏洞给大家做了剖析。


 重入漏洞


2016年6月,DAO攻击事件在区块链历史上留下了沉重的一笔,黑客利用重入漏洞,直接导致以太坊的硬分叉。启明星辰ADLab经过研究发现,以太坊的智能合约里面仍然存在重入漏洞。下面以BANK_SAFE合约为例进行举例说明。


● 漏洞示例


BANK_SAFE合约中存在典型的代码重入漏洞,当普通用户账户调用Collect函数时,Collect函数的逻辑没有任何问题,用户可以顺利的执行取款操作;但是当另一个智能合约调用BANK_SAFE合约的Collect函数时,会产生严重的安全隐患。

 


● 预防技术[2]


1. 使用内置的transfer()函数进行转账。由于tranfer()函数只发送2300gas,因此不足以合约之间的循环调用。


2. 采用check-effects-interactions模式的编码。在BANK_SAFE合约中,[49]行的资金扣除操作应该放到[47]行之前。


3. 引入互锁机制。添加一个状态变量锁定合约,预防重入调用。


超额铸币


2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的价格先猛涨787%,后迅速暴跌至崩盘,造成大量用户经济损失,其背后就是管理团队利用预留的整数溢出漏洞进行超额铸币,并在交易所抛售造成恶性通货膨胀,最后价值几乎归零。ADLab使用自动化审计工具发现大量智能合约仍然存在同类漏洞。下面以Genesis Vision合约进行举例说明。


● 漏洞示例:CVE-2018-11335


Genesis Vision智能合约虽然引入了OpenZepplin的SafeMath数学运算库,但其发行货币的函数mint()却没有使用安全运算函数,而是直接使用数学运算符。如果精心构造输入参数value,在[188]行发生整数溢出,溢出后运算结果小于TOKEN_LIMIT,就可以绕过token发行上限,实现超额铸币,最终导致恶性通货膨胀。这类铸币函数的执行一般需要管理员权限,因此可以看作是一种后门漏洞。

 

 


● 预防技术


禁止使用数学运算符,使用SafeMath运算库[3]


批量转账


2018年4月,黑客利用BEC智能合约漏洞攻击美链BEC(美蜜币),成功向两个地址转出了天量级别的 BEC代币,导致海量BEC被抛售,使得当日BEC的价值几乎归零,64亿人民币瞬间蒸发。2018年7月,AMR合约中的漏洞被黑客恶意利用,导致AMR大量增发。这两次攻击事件都是由于批量转账函数中存在整数溢出漏洞,经ADLab研究发现,下表中的智能合约仍然存在同类漏洞。


   

● 漏洞示例:CVE-2018-13836


Rocket Coin (XRC)合约中的multiTransfer函数存在整数溢出漏洞,由于该函数的属性是public,任意用户可以调用该函数进行批量转币操作,不需要管理员权限。

 


从Rocket Coin代币的TokenHolders列表可以看出黑客攻击成功的痕迹。

 


 

从etherscan.io可以查看黑客攻击时交易记录:


https://etherscan.io/tx/0x606316fc06922ae34e6be865e64b23598d74a5e94712447dca37a7ac4c8b30a8#decodetab


从Input Data可以看出攻击者精心构造了_amounts数组,数组中包含两个元素,元素值皆为极大值,当执行到[72]行时将发生整数溢出。因此攻击者只花费了极少的token,便完成批量大额转账。



 

● 预防措施


禁止使用数学运算符,使用SafeMath运算库[3]



总结


由于智能合约是一次性发布上链的,一旦出现漏洞将难以直接修补。


对于开发者而言,发现漏洞后只能发布新的智能合约然后做手动映射,在时间、人力、财力上会付出很大的代价。


对于投资者而言,智能合约上的漏洞很可能会使相应的代币变成“空气”币,带来更为直接的财产损失。

 

温馨提示:


1、区块链是新兴技术,还需加强对其安全审计和监管能力的重视。

2、炒币有风险,入市需谨慎,了解对行情,拒绝做“韭菜”。

3、重视国家法律法规,合理投资,健康理财。

 


参考链接


[1] 

https://etherscan.io/contractsVerified

[2] 

https://blog.sigmaprime.io/solidity-security.html

[3] 

https://github.com/OpenZeppelin/zeppelin-solidity