前言
据慢雾区情报,以太坊 DeFi 平台 Lendf.Me 遭受重入漏洞攻击。慢雾安全团队在收到情报后随即对此次攻击事件展开分析,并快速定位了问题所在。
据慢雾科技反(AML)系统初步统计分析,Lendf.Me 被攻击累计的损失约 24,696,616 美元,具体盗取的币种及数额为:
之后攻击者不断通过 1inch.exchange、ParaSwap、Tokenlon 等 DEX 平台将盗取的币兑换成 ETH 及其他代币。
以下是详细分析过程。
攻击细节
本次对 Lendf.Me 实施攻击的攻击者地址为 0xa9bf70a420d364e923c74448d9d817d3f2a77822,攻击者通过部署合约 0x538359785a8d5ab1a741a0ba94f26a800759d91d 对 Lendf.Me 进行攻击。
Steadefi:协议已被利用,所有资金目前都面临风险:金色财经报道,杠杆收益聚合商Steadefi发布推文警告称:协议已被利用,所有资金目前都面临风险,链上消息已发送至攻击者钱包地址进行协商。协议部署者钱包(也是协议中所有保险库的所有者)已被泄露。剥削者已将所有金库(借贷和策略)的所有权转移到他们控制的钱包中,并继续采取各种仅限所有者的操作,例如允许任何钱包能够从借贷金库借入任何可用资金。目前,Arbitrum 和 Avalanche 上的所有可用借贷能力已被剥削者耗尽,资产被交换到 ETH 并桥接到以太坊。存款人的金库尚未耗尽(截至目前),因为剥削者没有从该金库提取存款的仅限所有者的功能。
链上数据显示,截至发稿时,该协议已损失至少 334,000 美元。[2023/8/8 21:31:00]
通过在 Etherscan 上查看攻击者的其中一笔交易:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b
DeFi风险管理工具Union Finance推出不可交易的治理代币UNION:3月24日消息,基于以太坊的DeFi风险管理工具Union Finance宣布推出治理代币UNION并成立DAO。UNION总量为10亿枚,其中20%分配给社区DAO,46.78%分配给团队,33.22%分配给早期支持者。2%将用于空投给协议的早期用户。UNION为不可转让治理Token,不能被购买或出售。
Union Finance是一个无抵押贷款协议,目前已上线以太坊主网和Arbitrum上运行,曾于2020年12月完成1kx等参投的300万美元融资。[2022/3/24 14:14:54]
我们发现,攻击者首先是存入了 0.00021593 枚 imBTC,但是却从 Lendf.Me 中成功提现了 0.00043188 枚 imBTC,提现的数量几乎是存入数量的翻倍。那么攻击者是如何从短短的一笔交易中拿到翻倍的余额的呢?这需要我们深入分析交易中的每一个动作,看看究竟发生了什么。
数据:DeFi市值达1439.53亿美元,创历史新高:9月6日消息,TradingView数据显示,DeFi市值达1439.53亿美元,创历史新高。[2021/9/6 23:03:13]
通过把该笔交易放到 bloxy.info 上查看,我们能知道完整的交易流程
通过分析交易流程,我们不难发现攻击者对 Lendf.Me 进行了两次 supply() 函数的调用,但是这两次调用都是独立的,并不是在前一笔 supply() 函数中再次调用 supply() 函数。
紧接着,在第二次 supply() 函数的调用过程中,攻击者在他自己的合约中对 Lendf.Me 的 withdraw() 函数发起调用,最终提现
在这里,我们不难分析出,攻击者的 withdraw() 调用是发生在 transferFrom 函数中,也就是在 Lendf.Me 通过 transferFrom 调用用户的 tokensToSend() 钩子函数的时候调用的。很明显,攻击者通过 supply() 函数重入了 Lendf.Me 合约,造成了重入攻击,那么具体的攻击细节是怎样的呢?我们接下来跟进 Lendf.Me 的合约代码。
币赢CoinW平台DeFi币种 STRONG领涨:据币赢行情数据显示,截止今日10:00(GMT+8),平台内DeFi币种今日STRONG领涨,今日涨幅为28.05%,现价235.0986USDT;SASHIMI今日涨幅11.32%,现价0.1134USDT;AXIS今日涨幅4.75%,现价1.2494USDT;RPL今日涨幅为4.7%,现价2.3083USDT。风险提示:近期行情波动较大,请注意控制风险[2020/9/29]
代码分析
Lendf.Me 的 supply() 函数在进行了一系列的处理后,会调用一个 doTransferIn 函数,用于把用户提供的币存进合约,然后接下来会对 market 变量的一些信息进行赋值。回顾刚才说的攻击流程,攻击者是在第二次 supply() 函数中通过重入的方式调用了 withdraw() 函数提现,也就是说在第二次的 supply() 函数中,1590 行后的操作在 withdraw() 之前并不会执行,在 withdraw() 执行完之后,1590 行后的代码才会继续执行。这里的操作导致了攻击者可提现余额变多。
Aurora:DeFi是数字金融的必然趋势:8月5日15:00,2020年纷智云端峰会第三场直播正式开启,本场云会议由元界DNA总冠名,蚂蚁节点联盟、金色财经联合主办,主题为“DeFi领航数字金融最前沿”。
在以“交易所和投资机构眼中的DeFi投资:如何甄别和投资真正有价值的DeFi项目”为主题的圆桌论坛上,德鼎创新基金创始合伙人王岳华表示,DeFi市场会越来越成熟,协议层会越来越完善,目前的泡沫有利于促进市场成熟;
ZB集团副总裁、ZB创新智库创始人Aurora认为,世界呼唤开放、透明、公平的金融体系,DeFi是数字金融的必然趋势;
火币商务高级总监Chern Chung表示,DeFi市值相对于传统金融还很小,却因为独特的优势引发巨大关注,它可以让许多普通投资者与机构投资者同场竞技;
嘉楠区块链首席分析师Kobe认为,DeFi仍处于早期阶段,本轮爆发是产品和市场的完美契合,有理由相信DeFi是区块链未来十年最大的应用之一。[2020/8/5]
我们深入分析下 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
标签:PPLSUPPLYUPPsugarappleSupermoonPLY币WORLD SUPPORTS ANIMALS
前段时间参加了一个征文比赛,主办方送我的礼包里有一个助记词板。 我很喜欢,作为EDC老玩家的我很容易测评这款产品的工业设计:流畅硬朗的外型,磨砂航空铝的触感,有一种鸽子羽毛的滑腻.
1900/1/1 0:00:00最近人们正被央行DC/EP落地测试的消息所震撼。但其实在DC/EP新闻的同一时间,中国还有一项雄心勃勃的区块链项目正准备重装上线.
1900/1/1 0:00:00文章系金色财经专栏作者牛七的区块链分析记供稿,发表言论仅代表其个人观点,仅供学习交流!金色盘面不会主动提供任何交易指导,亦不会收取任何费用指导交易,请读者仔细甄别,谨防上当.
1900/1/1 0:00:00稳定币市值最高的是USDT,目前USDT市值已经高达450.24亿,全球市值排名第四, USDT最开始是基于Omni发行的代币,在发行USDT过程中,是需要OmniCore进行技术对接.
1900/1/1 0:00:00随着区块链世界的不断发展,挖矿规模越来越大,难度也越来越高,早期传统小型矿工的 SOLO 挖矿模式退出市场.
1900/1/1 0:00:00在逐渐跨过草莽时期的区块链世界,有一个群体鲜有出现聚光灯下,却兢兢业业维护上千个加密货币项目区块网络的运转,他们是加密世界的“程序员”——矿工.
1900/1/1 0:00:00