月亮链 月亮链
Ctrl+D收藏月亮链

PPL:DeFi平台Lendf.Me被黑细节分析及防御建议_UPP

作者:

时间:1900/1/1 0:00:00

前言

据慢雾区情报,以太坊DeFi平台Lendf.Me遭受重入漏洞攻击。慢雾安全团队在收到情报后随即对此次攻击事件展开分析,并快速定位了问题所在。

据慢雾科技反(AML)系统初步统计分析,Lendf.Me被攻击累计的损失约24,696,616美元,具体盗取的币种及数额为:

WETH:55159.02134,

WBTC:9.01152,

CHAI:77930.93433,

HBTC:320.27714,

HUSD:432162.90569,

BUSD:480787.88767,

PAX:587014.60367,

TUSD:459794.38763,

USDC:698916.40348,

USDT:7180525.08156,

USDx:510868.16067,

imBTC:291.3471

之后攻击者不断通过1inch.exchange、ParaSwap、Tokenlon等DEX平台将盗取的币兑换成ETH及其他代币。

以下是详细分析过程。

攻击细节

本次对Lendf.Me实施攻击的攻击者地址为?0xa9bf70a420d364e923c74448d9d817d3f2a77822,攻击者通过部署合约?0x538359785a8d5ab1a741a0ba94f26a800759d91d对Lendf.Me进行攻击。

数据:当前DeFi协议总锁仓量为1419.5亿美元:5月22日消息,据DefiLlama数据显示,当前DeFi协议总锁仓量为1419.5亿美元,24小时增加1.82%。排名前三的协议分别是AAVE (122.4亿美元);MakerDAO (97.2亿美元);Curve (96.2亿美元)。[2022/5/23 3:34:31]

通过在Etherscan上查看攻击者的其中一笔交易:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b

我们发现,攻击者首先是存入了0.00021593枚imBTC,但是却从Lendf.Me中成功提现了0.00043188枚imBTC,提现的数量几乎是存入数量的翻倍。那么攻击者是如何从短短的一笔交易中拿到翻倍的余额的呢?这需要我们深入分析交易中的每一个动作,看看究竟发生了什么。

DeFi跨链永续合约交易平台YFX合约交易量突破100亿美元:据官方消息,跨链去中心化永续合约交易平台YFX自2021年1月上线以来总交易量已突破100亿美元,交易人数达80,000+。

YFX混合合约交易大赛、LP Token挖矿(MDEX)和单币挖矿已于5月17日20:00同步开启,总奖励为100,000YFX Token,为期14天,于5月31日20:00结束,其中YFX混合合约流动性资金池APY超2138.3%。

YFX是一个基于 ETH (layer2)、BSC、Heco、Tron、OKExChain、Polkadot 的跨链去中心化永续合约交易平台,提供 BTC、ETH 等 100 倍的永续合约交易服务。 YFX创新使用高流动性、低滑点的 QIC-AMM 做市商池交易机制。YFX已经成功支持 Layer2 的永续合约交易服务,它融合了永续合约交易员期望的 CeFi式杠杆以及 DeFi系统的 AMM 的流动性和简便性。[2021/5/21 22:29:52]

通过把该笔交易放到bloxy.info上查看,我们能知道完整的交易流程

DeFi 聚合平台 Instadapp已上线Polygon Layer2 版本:官方消息,4月10日,DeFi 聚合平台 Instadapp宣布其Polygon Layer2版本已上线,目前已集成Aave Protocol,可提供小额交易的超快确认。[2021/4/11 20:07:10]

通过分析交易流程,我们不难发现攻击者对Lendf.Me进行了两次supply()函数的调用,但是这两次调用都是独立的,并不是在前一笔supply()函数中再次调用supply()函数。

紧接着,在第二次supply()函数的调用过程中,攻击者在他自己的合约中对Lendf.Me的withdraw()函数发起调用,最终提现

在这里,我们不难分析出,攻击者的withdraw()调用是发生在transferFrom函数中,也就是在Lendf.Me通过transferFrom调用用户的tokensToSend()钩子函数的时候调用的。很明显,攻击者通过supply()函数重入了Lendf.Me合约,造成了重入攻击,那么具体的攻击细节是怎样的呢?我们接下来跟进Lendf.Me的合约代码。

以太坊上DeFi协议总锁仓量突破180亿美元:据欧科云链OKLink数据显示,截至今日11时,以太坊上DeFi协议总锁仓量约合180.1亿美元。其中锁仓量排名前三的协议分别是Maker 25.9亿美元(+0.39%),WBTC 22.4亿美元(+0.9%)以及Compound 17.2亿美元(+0.79%)。[2020/12/15 15:14:23]

代码分析

Lendf.Me的supply()函数在进行了一系列的处理后,会调用一个doTransferIn函数,用于把用户提供的币存进合约,然后接下来会对market变量的一些信息进行赋值。回顾刚才说的攻击流程,攻击者是在第二次supply()函数中通过重入的方式调用了withdraw()函数提现,也就是说在第二次的supply()函数中,1590行后的操作在withdraw()之前并不会执行,在withdraw()执行完之后,1590行后的代码才会继续执行。这里的操作导致了攻击者可提现余额变多。

我们深入分析下supply()函数

BM评论以太坊抢先交易机器人事件:这就是以太坊不适合DeFi的原因:Paradigm研究合伙人Dan Robinson和Georgios Konstantopoulos发布文章《以太坊是黑暗森林》。根据分析,有多个机器人在扫描以太坊Mempool,寻找从其他用户获利的方法。有人询问Dan是否能收回意外发送到配对合约的Uniswap流动性代币(价值约12000美元)。他最初的想法是这些代币将被永远锁定,但后来意识到,如果这些代币仍在那里,任何人都可以去恢复。任何人调用Uniswap核心合约上的函数时,该合约会测量自己的流动性代币余额并将其烧掉,将提取的代币提供给调用者指定的地址。

他们实施营救行动时遭遇抢先交易机器人:get交易确实被纳入,但是出现UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED错误,意味着流动性代币没了。结果是其get交易进入Mempool后几秒钟内,就有人执行调用并扫荡走资金。

EOS创始人BM评论称,这就是为何以太坊不适合DeFi。EOS上不存在文章所描述的问题,因为它速度太快,无法抢先交易,而且生产者是已知的,并且可以承担责任。以太坊上发生的事情太可怕了。(Cryptoticker)[2020/8/30]

根据上图,可以看到,在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提空。

防御建议

针对本次攻击事件慢雾安全团队建议:

在关键的业务操作方法中加入锁机制,如:OpenZeppelin的ReentrancyGuard

开发合约的时候采用先更改本合约的变量,再进行外部调用的编写风格

项目上线前请优秀的第三方安全团队进行全面的安全审计,尽可能的发现潜在的安全问题

多个合约进行对接的时候也需要对多方合约进行代码安全和业务安全的把关,全面考虑各种业务场景相结合下的安全问题

合约尽可能的设置暂停开关,在出现“黑天鹅”事件的时候能够及时发现并止损

安全是动态的,各个项目方也需要及时捕获可能与自身项目相关的威胁情报,及时排查潜在的安全风险

附:

OpenZeppelinReentrancyGuard:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol

标签:PPLSUPPLYUPPkepple币官方推特最新新闻Super Algorithmic TokenSPLYDynamic Supply Tracker

Gate交易所热门资讯
TRA:链圈巨人们的肩膀头子:从区块链元年说起_Wall Street Decentral Token

区块链大星说公众号良心出品。紧追圈内热点潮流,用有趣的漫画讲有料的事件。实乃新一代链圈青年硬核入门的好帮手、上班摸鱼的好朋友.

1900/1/1 0:00:00
区块链:2019年全球区块链发明专利排行榜:阿里巴巴第一,前十名企业7家来自中国_DAI

来源:IPRdaily编者注:原标题为《2019年全球区块链发明专利排行榜》导读:近日,知识产权产业媒体IPRdaily与incoPat创新指数研究中心联合发布“2019年全球区块链发明专利排行.

1900/1/1 0:00:00
比特币:比特币突破10000美元,对冲基金巨头保罗·都铎·琼斯宣布买入比特币_加密货币有哪几种

要点:传奇交易员保罗·都铎·琼斯正在购买比特币作为对冲通胀的工具,因为全球各地的央行都在印钞。华尔街最成功的对冲基金经理之一琼斯透露,他的一只基金正在持有个位数百分比的比特币期货.

1900/1/1 0:00:00
LIB:观点 | Libra2.0增强合规性,或加速CBDC进程_CBDAO

本报告由火币区块链研究院出品,报告发布时间2020年4月27日,作者:袁煜明、卢军摘要:北京时间4月16日晚,Facebook发布了Libra第二版白皮书.

1900/1/1 0:00:00
比特币:Pantera Capital:如果历史重演,比特币有望在2021年8月达到11.5万美元_PAND价格

原文来自于PanteraCapital,作者:DanMorehead这是一个非常令人痛苦的,令人费解的时刻.

1900/1/1 0:00:00
BTC:行情解析:大盘反弹无力,回撤风险依旧存在_ARKE

作者|哈希派分析团队中币早行情:BTC现报39196美元:据中币(ZB)交易平台行情数据,截止到今日09:53时,BTC现报39196美元(+4.42%).

1900/1/1 0:00:00