Abstract
2020年6月16日,BancorV2上线以太坊主网。
2020年6月18日,Bancor Network团队发现了其BancorV2智能合约的安全漏洞。
漏洞导致攻击者可盗取Bancor合约用户的资产。
本文将介绍一下攻击的细节和这次安全事件的始末。
漏洞原理
本次安全事件一共涉及三个有漏洞的智能合约。
- 0x8dfeb86c7c962577ded19ab2050ac78654fea9f7
- 0x5f58058C0eC971492166763c8C22632B583F667f
- 0x923cab01e6a4639664aa64b76396eec0ea7d3a5f
三个合约内容相似,都实现了 TokenHandler contract
该合约关键functions如下:
可见实现了三个关键函数
safeApprove
safeTransfer
safeTransferFrom
非预期的是,三个函数的Access Control全都是public,
意味着任何人可以调用该函数来进行转账操作。
攻击者可以调用 safeTransferFrom函数,其中_from
设为任何该合约的用户,_to
设为攻击者自己的address。从而无限制的将用户的token转移到自己的钱包。
遗留问题
调用transferFrom时,需要_from
用户有足够的allowance
,如果_value
超过了allowance
应该会报错才对。
所以上文中_from
可以设置的用户,必须有调用过approve函数来批准合约操作自己的token。
rescue
Bancor Network Team 发现漏洞后,立刻利用该漏洞,将所有用户的token向BancorNetwork安全账户转移。抢在被恶意攻击之前,将合约中的token掏空。
对应的Transaction如下
- 0xc8021b971e69e60c5deede19528b33dcd52cdbd8
- 0x14fa61fd261ab950b9ce07685180a9555ab5d665
我们使用在线工具OKO Contract Explorer来分析一下
发现Transaction 中主要调用了 balanceOf 、 allowance 和 safeTransforFrom三个函数
其中SafeTransforFrom就是刚才提到的漏洞函数
balanceOf和allowance用来查看当前token数量,和_spender
可以操作的Token数量
奇怪的是,每次调用allowance,返回的结果都极大。
如图中,0x8dfe居然Approve了0xfffffffffffffffffffffffffffffffffffffffffffffecf2ccab1d2176d6ebb
这么多的DATA
DATA的总发行量也没有这么多呀
结合Bancor Network 官方Twitter的描述:
我们猜测是BancorV2用户为了操作方便,直接进行了infinite approve.
这也就解释了上文中的allowance超额的问题。
Discussion
综上所述,上线仅一天的BancorV2,由于函数的Access Control存在问题,存在盗笔风险。
受该漏洞影响的token总价值为$409,656。
另一方面,从代码审计的角度来讲,Access Control Setting Error是很简单很好理解的漏洞。
为了Defi应用的安全,项目上线之前还是请安全团队来进行一次代码审计吧