1、前言
北京时间3月5日,知道创宇区块链安全实验室?监测到?BaconProtocol?遭受黑客攻击损失约958,166美元,本次攻击利用重入漏洞,并凭借闪电贷扩大收益额。目前攻击者地址还没有被加入USDC的黑名单中。
2、分析
攻击事件如下图所示,该次攻击事件的问题点在于lend()函数,攻击者利用该函数进行重入攻击。
2.1基础信息
攻击合约:0x580cac65c2620d194371ef29eb887a7d8dcc91bf
攻击者地址:0x7c42f2a7d9ad01294ecef9be1e38272c84607593
Supermojo完成600万美元种子轮融资,BH Digital等领投:7月15日消息,NFT融资平台Supermojo完成600万美元种子轮融资 ,BH Digital、DRW Venture Capital、Intersection Growth Partners和Neuberger Berman领投,Sfermion、Arca、Gemini、Everyrealm、Arrington Capital、BlockFi Ventures、Circle Ventures、Crossbeam Venture Partners、Draper、FJ Labs、FBG Capital、OP Crypto、Red Beard Ventures和Ripple等参投。(The Block)[2022/7/15 2:14:07]
攻击tx:0x7d2296bcb936aa5e2397ddf8ccba59f54a178c3901666b49291d880369dbcf31
BHEX完成第二季度回购HBC销毁:据BHEX官方公告,根据HBC通证模型2.0规则,BHEX已于2021年7月6日09:05:39 (UTC+8)销毁共计226,225枚HBC,此次销毁为HBC第二季度回购总量的80%,目前已累计销毁HBC共计1,994,649枚,当前市场价值约3,950万USDT。至此,HBC目前总量为19,005,351枚。
此外,第二季度回购HBC的20%共计56,556HBC,已空投至全体BHEX交易解锁账户。其中15%按照第二季度队长业绩比例分配,5%按队长人数均分。[2021/7/6 0:31:23]
漏洞合约:0x781ad73f140815763d9A4D4752DAf9203361D07D
火币矿池正式开放BitcoinHD(BHD)锁仓挖矿功能:据火币矿池消息,新加坡时间4月22日18:00,火币矿池正式开启BitcoinHD(BHD)锁仓挖矿功能,最小锁仓数量为25个。火币矿池可以实现一键双挖获得双重收益,在火币矿池锁仓BitcoinHD(BHD)享受双重收益。详情见原文链接。[2020/4/22]
2.2流程
1.攻击者通过UniswapV2闪电贷借出6,360,000USDC。
2.用闪电贷借出的6,360,000USDC分成3份,去bHOME中进行2次重入攻击调用了3次lend()函数铸造共8,465,943.180104bHOME。
3.将刚才重入获得的bHOME拿去销毁赎回获得7,336,924.998USDC。
行情 | BHEX交易所BTC永续合约24小时行情播报:截至今日上午11:00,据BHEX交易所永续合约行情:BTC币本位合约报价8877.4美元,预测资金费率为0.0464%(多头付空头);BTCUSDT合约报价8875.4美元,预测资金费率为0.0514%(多头付空头)。
过去24小时BTC合约多空持仓人数比为2.22, BTC币本位合约和BTCUSDT合约交易总量较昨日基本持平。[2020/2/28]
4、归还闪电贷借出的6,360,000USDC,并支付19,716的手续费,最后将剩余的957,208.998USDC转入自己的账户。
2.3细节
该次攻击事件重点在于lend()函数,由于合约https://etherscan.io/address/0x781ad73f140815763d9a4d4752daf9203361d07d#code并未验证开源,所以我们只能从交易的Debugger中寻找线索。
1、攻击者通过UniswapV2闪电贷借出6,360,000USDC。
2、用闪电贷借出的6,360,000USDC分成3份,去bHOME中进行重入攻击2次调用?lend()函数铸造共8,465,943.180104bHOME。
3、将刚才重入获得的bHOME拿去销毁赎回获得7,336,924.998USDC。
4、归还闪电贷借出的6,360,000USDC,并支付19,716的手续费,最后将剩余的957,208.998USDC转入自己的账户。
2.3细节
该次攻击事件重点在于?lend()?函数,由于合约?https://etherscan.io/address/0x781ad73f140815763d9a4d4752daf9203361d07d#code?并未验证开源,所以我们只能从交易的Debugger中寻找线索。
分析Debugger可以看到下图是第一次调用函数,接着进行了2次重入。
从重入攻击中可以找到INPUT中调用函数的字节码为?0xa6aa57ce。
通过字节签名可以知道重入攻击调用的是?lend()?函数。
从Debugger中我们可以发现攻击合约的地址?0x781ad73f140815763d9a4d4752daf9203361d07d。
通过反编译合约?0x781ad73f140815763d9a4d4752daf9203361d07d?得到合约伪代码内容,可以找到?lend()?函数。
我们在反编译的代码中可以看到该合约使用的ERC777协议,会查询?recipient?的回调合约并回调?tokensReceived()?函数用以重入攻击。
通过分析可以发现?_index?就是传入的USDC数量。
totalSupply?和?balanceOf?的增量都和?_index?是正比关系,和?stor104?是反比关系,并且这两个变量的更新发生在重入攻击之前,每次都会更新。
stor104?记录的是用户存入的USDC总量,该变量的更新发生在重入之后,那么在重入的过程中?stor104?的值是不变的,而上面的?totalSupply?是在变大,所以最后return的值也会相应的增大,从而使得攻击者通过重入攻击铸造得到比正常逻辑更多的bHOME代币。
除了该次攻击事件,BlockSecTeam还阻断了后面发生的攻击并将金额返还给了项目方。
交易hash:0xf3bd801f5a75ec8177af654374f2901b5ad928abcc0a99432fb5a20981e7bbd1
3、总结
此次攻击事件是由于项目方使用了ERC777协议但没有对回调合约的安全性进行考虑从而导致了重入攻击的发生,当项目合约有涉及资产的转移时,建议使用「检查-生效-交互」模式来保证逻辑代码的安全,当然我们也可以使用OpenZeppelin官方提供的ReentrancyGuard修饰器来防止重入攻击的发生。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。