小心智能合约误差:区块链上的“空气”币

宣布时间 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