合约安全[2] Bancor Network权限配置错误漏洞
2021-05-29

Abstract

2020年6月16日,BancorV2上线以太坊主网。
2020年6月18日,Bancor Network团队发现了其BancorV2智能合约的安全漏洞。
Bancor团队发现漏洞
漏洞导致攻击者可盗取Bancor合约用户的资产。
本文将介绍一下攻击的细节和这次安全事件的始末。

漏洞原理

本次安全事件一共涉及三个有漏洞的智能合约。

  • 0x8dfeb86c7c962577ded19ab2050ac78654fea9f7
  • 0x5f58058C0eC971492166763c8C22632B583F667f
  • 0x923cab01e6a4639664aa64b76396eec0ea7d3a5f

三个合约内容相似,都实现了 TokenHandler contract
该合约关键functions如下:
TokenHandler Fucntions可见实现了三个关键函数

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就是刚才提到的漏洞函数
SafeTransforFrom
balanceOf和allowance用来查看当前token数量,和_spender可以操作的Token数量
balanceOf和allowance
奇怪的是,每次调用allowance,返回的结果都极大。
如图中,0x8dfe居然Approve了0xfffffffffffffffffffffffffffffffffffffffffffffecf2ccab1d2176d6ebb这么多的DATA
DATA的总发行量也没有这么多呀
结合Bancor Network 官方Twitter的描述:
Given Approvals
我们猜测是BancorV2用户为了操作方便,直接进行了infinite approve.
这也就解释了上文中的allowance超额的问题。

Discussion

综上所述,上线仅一天的BancorV2,由于函数的Access Control存在问题,存在盗笔风险。
受该漏洞影响的token总价值为$409,656。
另一方面,从代码审计的角度来讲,Access Control Setting Error是很简单很好理解的漏洞。
为了Defi应用的安全,项目上线之前还是请安全团队来进行一次代码审计吧