成都链安:Lendf.Me 2500万美元被盗!黑客如何肆虐?资金去了哪儿?
事件背景:
DeFi 借贷协议 Lendf.Me 今日遭受攻击,开发团队已在 Lendf.Me 用户界面用红字提醒,呼吁用户目前不要向合约存款,此事发生,瞬间引起了外界对于区块链和数字货币安全的激烈讨论。
Lendf.Me于去年 9 月推出后因其锁仓资产价值成为 DeFi Pulse 七大 DeFi 市场之一,今日攻击者利用重入漏洞覆盖自己的资金余额并使得可提现的资金量不断翻倍,最终将Lendf.Me盗取一空。
黑客攻击事件复盘 :
据成都链安反洗钱合规和调查取证系统(Beosin-AML)追踪统计,目前 Lendf.Me 损失已超2500万美元,完整攻击过程复盘如下:
此次攻击者地址为:0xA9BF70A420d364e923C74448D9D817d3F2A77822;攻击合约为:0x538359785a8D5AB1A741A0bA94f26a800759D91D,攻击者首先进行了多次攻击测试(如下图所示):
在合约部署完成后的第三笔交易(0xe49304cd3ed)中,攻击者进行了首次攻击尝试:
整个攻击事件开始阶段,攻击者的初始交易发送脚本存在问题,导致只有区块中的第一次攻击才能攻击成功,后面的交易全部抛出异常。
后面攻击者对攻击脚本做出了改动,一个区块只发送一笔攻击交易。首先分析这三笔成功的交易,可以看到攻击者的资金基本上呈现一个倍增的关系,攻击已经开始获利:
https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b
https://etherscan.io/tx/0xa0e7c8e933be65854bee69df3816a07be37e108c43bbe7c7f2c3da01b79ad95e
https://etherscan.io/tx/0xf8ed32d4a4aad0b5bb150f7a0d6e95b5d264d6da6c167029a20c098a90ff39b4
到此时,攻击者已经完成对攻击过程的确认,之后的连续多个交易则是攻击者注册了多个代币地址用于代币兑换:
https://etherscan.io/tx/0xc906fc184c6fd453b01d3bc04612cf90e8d339edfe1611e25baa47eb6e9ec080
以0xc906fc184c6f交易为例,0x06af07097c9eeb7fd685c692751d5c66db49c215是代币CHAI的合约地址,区块高度9899740~9899741基本上全部在注册代币。
之后攻击者继续发起攻击,可以看到,每次攻击后,攻击者持有的资金(imBTC)基本会翻一倍。
通过这样不断翻倍的过程,在交易0xced7ca81308时,基本已达到imBTC的最大存量。
之后利用获利的imBTC借入其他代币,如下图所示:
黑客攻击手法分析 :
以其中一笔交易0x111aef012df47efb97202d0a60780ec082125639936dcbd56b27551ce05c4214为例:
lendf.me合约地址:0x0eEe3E3828A45f7601D5F54bF49bB01d1A9dF5ea
imBTC合约地址:0x3212b29e33587a00fb1c83346f5dbfa69a458923
第1步,正常执行supply函数,存入113.21475453 imBTC,这里未进行重入。
第2步,再次调用supply函数,存入0.00000001 imBTC,在这次交易中,如第3步攻击者触发了supply函数中利用transferFrom函数转入代币时会通知发送方的特性,在发送方的代码中回调了Lendf.me的withdraw函数,取出了第1步supply中存入的113.21475453 imBTC以及在本次交易的上一笔重入交易中的113.21475516 imBTC,总共为226.42950969 imBTC,重入之后再次回到transferFrom剩余的代码中,继续执行将0.00000001 imBTC转入lendf.me的操作。
重入攻击的具体代码执行过程如下:
1、进入supply函数
2.调用内部doTransferIn函数,该函数会调用imBTC的transferFrom函数进行代币转账操作
3.在imBTC中,会调用攻击者指定合约(0x538359785a8D5AB1A741A0bA94f26a800759D91D)的tokensToSend函数,攻击者在函数中执行了重入操作,该重入操作调用了lendf.me的withdraw函数,取出了226.42950969 imBTC。
4. withdraw执行完成后,继续从1583行后的supply函数剩余的代码,这部分的代码主要是记录账本数据,攻击者余额翻倍的错误也是在此处发生的:
整个攻击过程,举个例子:
1> 原先攻击者存款100 imBTC,第一次supply存入100 imBTC,攻击者账户余额为200 imBTC
2> 第二次supply存入0.1 imBTC,这次发生了重入
2.1 在supply之初,读取用户余额记录,存入临时变量temp,值为200.1
2.2 调用imBTC的transferFrom函数转入代币时发生了重入,攻击者调用withdraw取出了当前账户的200 imBTC,攻击者账户余额记录为0,攻击者获得了200 imBTC。withdraw执行完成后继续执行transferFrom,将0.1 imBTC转入lendf.me
2.3 继续执行supply,用临时变量temp(200.1)更新用户余额记录,攻击者余额记录变为200.1。
此时攻击者余额记录中为200.1 imBTC,手中还有200 imBTC,可以继续翻倍攻击。
安全防御建议 :
针对此次攻击事件,我们给予区块链企业如下的安全建议:
1、进行重入防护:比如使用OpenZeppelin 的 ReentrancyGuard;
2、先修改本合约状态变量,再进行外部调用
3、上线前进行必要的安全审计
被盗资金流向 :
攻击者在攻击得手后进行了资金转移,目前资金去向地址如下:
0x3212b29e33587a00fb1c83346f5dbfa69a458923
Tokenlon 交易所
0xdc6c91b569c98f9f6f74d90f9beff99fdaf4248b
OneInchExchange 交易所
0x11111254369792b2ca5d084ab5eea397ca8fa48b
Compound USD Coin 借贷平台
0x39aa39c021dfbae8fac545936693ac917d5e7563
Compound Wrapped BTC 借贷平台
0xc11b1268c1a384e55c48c2391d8d480264a3a7f4
钱包地址
0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3
0x06af07097c9eeb7fd685c692751d5c66db49c215
AugustusSwapper 交易所
0xf92c1ad75005e6436b4ee84e88cb23ed8a290988
根据成都链安AML对攻击者地址0xA9BF70A420d364e923C74448D9D817d3F2A77822的流出资金进行的持续监控,绘制的攻击者资金流向图如下:
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
Justin Sun suspected to have purchased $160m in Ethereum
Justin Sun suspected to have purchased $160m in Ethereum