事件背景:
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,可以继续翻倍攻击。
安全防御建议:
Defi项目正在快速发展壮大,据我们统计截止2020年,锁定在以太坊Defi应用中的资产已达到了10亿美元。Defi项目的火爆主要来源它的高收益。Defi又被称为『去中心化金融』,开放式金融的基础,则是高达8%-10%的收益率必然会伴随着巨大的风险。
这是一个快速迭代的领域,因此各方Defi团队开发自己的合约产品也是自由发挥;但并没有一个统一的、标准的安全方案去遵守,或者说是必须通过严格的安全审计,这就导致了各种合约漏洞与相关安全问题层出不穷,此次事件项目方就应该进行重入防护:比如使用OpenZeppelin 的 ReentrancyGuard,另一方面先修改本合约状态变量,再进行外部调用。
成都链安在此建议:任何Defi项目方在开发合约时应重视合约安全问题,以应对各种突发情况和各种非正常使用合约情况,从而避免造成损失;同时建议做好相关安全审计工作,借助专业的区块链安全公司的力量,避免潜在的安全隐患。
被盗资金流向:
攻击者在攻击得手后进行了资金转移,目前资金去向地址如下:
imBTC Token
0x3212b29e33587a00fb1c83346f5dbfa69a458923
Tokenlon 交易所
0xdc6c91b569c98f9f6f74d90f9beff99fdaf4248b
OneInchExchange 交易所
0x11111254369792b2ca5d084ab5eea397ca8fa48b
Compound USD Coin 借贷平台
0x39aa39c021dfbae8fac545936693ac917d5e7563
Compound Wrapped BTC 借贷平台
0xc11b1268c1a384e55c48c2391d8d480264a3a7f4
Chai Token
0x06af07097c9eeb7fd685c692751d5c66db49c215
0xf92c1ad75005e6436b4ee84e88cb23ed8a290988
Paxos Standard Token
0x8e870d67f660d95d5be530380d0ec0bd388289e1
HBTCToken
0x0316eb71485b0ab14103307bf65a021042c6d380
HUSD Stablecoin
0xdf574c24545e5ffecb9a659c229253d4111d87e1
Aave: Lending Pool
0x398ec7346dcd622edc5ae82352f02be94c62d119
根据成都链安AML对攻击者地址0xA9BF70A420d364e923C74448D9D817d3F2A77822的流出资金进行的持续监控,绘制的攻击者资金流向图如下: