前言
据慢雾区情报,以太坊 DeFi 平台 Lendf.Me 遭受重入漏洞攻击。慢雾安全团队在收到情报后随即对此次攻击事件展开分析,并快速定位了问题所在。
据慢雾科技反(AML)系统初步统计分析,Lendf.Me 被攻击累计的损失约 24,696,616 美元,具体盗取的币种及数额为:
之后攻击者不断通过 1inch.exchange、ParaSwap、Tokenlon 等 DEX 平台将盗取的币兑换成 ETH 及其他代币。
以下是详细分析过程。
攻击细节
本次对 Lendf.Me 实施攻击的攻击者地址为 0xa9bf70a420d364e923c74448d9d817d3f2a77822,攻击者通过部署合约 0x538359785a8d5ab1a741a0ba94f26a800759d91d 对 Lendf.Me 进行攻击。
DeFi资产管理平台Valio已公开上线:金色财经报道,据平台团队发布的公告,去中心化资产管理平台Valio已公开上线。新协议允许用户由专业交易员管理其资金。该应用程序最初是在Abitrum和Optimism网络上发布的。Valio此前于7月24日推出了白名单版本,但8月7日推出的新公开版本不需要管理者提前批准。
所有资产都保存在智能合约中,资金管理者无法删除。此外,管理者可以投资的DeFi应用程序仅限于预定列表。在发布时,Valio与Arbitrum上的永续交易平台GMX和Optimism上的去中心化交易协议0x集成。[2023/8/7 21:30:20]
通过在 Etherscan 上查看攻击者的其中一笔交易:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b
美OCC代理署长:加密货币和DeFi正在威胁金融体系:9月22日消息,美国银行监管机构货币监理署(OCC)代理署长Michael Hsu周二出席区块链协会的视频会议时表示,加密货币和DeFi正演变为对金融体系的威胁,很像10年前某些衍生品让金融系统几乎崩溃时的状况。他说加密行业兴起的方式类似于当时的信用违约互换(CDS)。但他也表示这个群体有能力改变道路并避免危机。他说加密/DeFi很少提出针对实体经济问题的解决方案。当主流用户涉足该领域后,他们对于产品风险的容忍度较低,他们将主导并推动市场反应,并可能提升恐慌风险,进而破坏加密货币投资,对相关公司造成威胁。(彭博社)[2021/9/22 16:56:52]
我们发现,攻击者首先是存入了 0.00021593 枚 imBTC,但是却从 Lendf.Me 中成功提现了 0.00043188 枚 imBTC,提现的数量几乎是存入数量的翻倍。那么攻击者是如何从短短的一笔交易中拿到翻倍的余额的呢?这需要我们深入分析交易中的每一个动作,看看究竟发生了什么。
火币研究院马天元:DEFI应用的集成产品将是下一个阶段的流量入口:10月22日,火币大学《全球区块链领导者课程(GBLP)》第五/六期金融模块继续开课。火币研究院首席技术研究院马天元以《DeFi解析》的主题为学员们带来分享。
马天元表示,DeFi本身是多项创新分布式应用的集合,包括借贷、DEX、稳定币、衍生资产和预言机,这五个赛道相互紧密联系,缺一不可,在过去半年中取得了极高的热度,其中最重要的两个赛道是DEX和借贷。当区块链应用越来越多,DEFI应用的集成产品将是下一个阶段的流量入口,比如收益聚合器、交易聚合器,而在借贷领域,聚合借贷、汇聚流动性的产品,也是创业者可以思考的方向。[2020/10/22]
通过把该笔交易放到 bloxy.info 上查看,我们能知道完整的交易流程
CoinW即将于9月3日23:30在DeFi专区上线OIN:据官方消息,CoinW即将于9月3日23:30在DeFi专区上线OIN,并开启“充值送OIN,-0.1%Maker费率“活动;
据悉,OIN项目旨在通过OIN借贷平台开始构建生态系统,在Ontology网络上重以太坊DeFi生态系统。通过开发跨链技术,OIN能够在本地交换ETH资产。OIN项目利用ONT币的费用低、吞吐量高等特点扩展生态系统,吸引了更多的用户群。OIN使DeFi领域拥有无限发展。[2020/9/3]
通过分析交易流程,我们不难发现攻击者对 Lendf.Me 进行了两次 supply() 函数的调用,但是这两次调用都是独立的,并不是在前一笔 supply() 函数中再次调用 supply() 函数。
紧接着,在第二次 supply() 函数的调用过程中,攻击者在他自己的合约中对 Lendf.Me 的 withdraw() 函数发起调用,最终提现
Kava宣布将于6月10日上线DeFi产品:据官方公告,Kava将于6月10日上线DeFi产品,首个版本将支持BNB的抵押借贷服务。Kava还计划拿出用户增长基金中的384.8万KAVA代币直接发放给参与抵押BNB并贷出USDX的用户。在52周的时间里,用户可以每周瓜分7.4万KAVA代币。据统计,Kava提供的BNB抵押年化收益率随着抵押总量的增加,收益率呈阶梯式降低,最终达到市场平均水平。[2020/5/28]
在这里,我们不难分析出,攻击者的 withdraw() 调用是发生在 transferFrom 函数中,也就是在 Lendf.Me 通过 transferFrom 调用用户的 tokensToSend() 钩子函数的时候调用的。很明显,攻击者通过 supply() 函数重入了 Lendf.Me 合约,造成了重入攻击,那么具体的攻击细节是怎样的呢?我们接下来跟进 Lendf.Me 的合约代码。
代码分析
Lendf.Me 的 supply() 函数在进行了一系列的处理后,会调用一个 doTransferIn 函数,用于把用户提供的币存进合约,然后接下来会对 market 变量的一些信息进行赋值。回顾刚才说的攻击流程,攻击者是在第二次 supply() 函数中通过重入的方式调用了 withdraw() 函数提现,也就是说在第二次的 supply() 函数中,1590 行后的操作在 withdraw() 之前并不会执行,在 withdraw() 执行完之后,1590 行后的代码才会继续执行。这里的操作导致了攻击者可提现余额变多。
我们深入分析下 supply() 函数
根据上图,可以看到,在 supply() 函数的末尾,会对 market 和用户的余额进行更新,在这之前,用户的余额会在函数的开头预先获取好并保存在 localResults.userSupplyCurrent,如下:
通过赋值给 localResults 变量的方式,用户的转入信息会先暂时保存在这个变量内,然后此时攻击者执行 withdraw() 函数,我们看下 withdraw() 函数的代码:
这里有两个关键的地方:
1、在函数的开头,合约首先获取了 storage 的 market 及 supplyBalance 变量。
2、在 withdraw() 函数的末尾,存在同样的逻辑对 market 用户的余额信息 (supplyBalance) 进行了更新,更新值为扣除用户的提现金额后的余额。
按正常的提现逻辑而言,在 withdraw() 单独执行的时候,用户的余额会被扣除并正常更新,但是由于攻击者将 withdraw() 嵌入在 supply() 中,在 withdraw() 函数更新了用户余额 (supplyBalance) 后,接下来在 supply() 函数要执行的代码,也就是 1590 行之后,用户的余额会再被更新一次,而用于更新的值会是先前 supply() 函数开头的保存在localResults 中的用户原先的存款加上攻击者第一次调用 supply() 函数存款的值。
在这样的操作下,用户的余额虽然在提现后虽然已经扣除了,但是接下来的 supply() 函数的逻辑会再次将用户未扣除提现金额时的值覆盖回去,导致攻击者虽然执行了提现操作,但是余额不但没有扣除,反而导致余额增加了。通过这样的方式,攻击者能以指数级别的数量提现,直至把 Lendf.Me 提空。
防御建议
针对本次攻击事件慢雾安全团队建议:
1、在关键的业务操作方法中加入锁机制,如:OpenZeppelin 的 ReentrancyGuard
2、开发合约的时候采用先更改本合约的变量,再进行外部调用的编写风格
3、项目上线前请优秀的第三方安全团队进行全面的安全审计,尽可能的发现潜在的安全问题
4、多个合约进行对接的时候也需要对多方合约进行代码安全和业务安全的把关,全面考虑各种业务场景相结合下的安全问题
5、合约尽可能的设置暂停开关,在出现“黑天鹅”事件的时候能够及时发现并止损
6、安全是动态的,各个项目方也需要及时捕获可能与自身项目相关的威胁情报,及时排查潜在的安全风险
附OpenZeppelin ReentrancyGuard:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。