Wise Lending 事后分析

Wise Lending遭受了466,000美元的攻击损失,攻击者通过捐赠攻击利用了协议中的漏洞。文中详细分析了Wise Lending的工作原理及其被攻击的组件——金库,介绍了金库的概念、常用的防御机制及攻击者如何通过操纵金库的回报机制进行攻击,最后指出了Wise Lending的防御缺陷,揭示其未能实施的关键防护措施。

Untitled

Wise Lending 攻击导致该协议损失了 466,000 美元。黑客是如何在这里突破防线的?

首先,我们需要了解什么是 Wise Lending 以及哪个组件被利用。然后我们将解释如何进行的。

那么让我们开始解析这些内容吧!

Wise Lending

Wise Lending 允许用户提供各种资产以便在协议中直接借用,或通过各种策略进行投资以产生/获取额外的收益。

为了让用户能够存入他们的资产,Wise Lending 提供了金库。这就是被利用的组件,即金库。

金库

金库是 DeFi 中广泛使用的金融组件,主要通过其一种实现方式被称为 ERC4626

金库是一个合约,用户可以在其中存入资产,并获得对应的金库股份,代表他们在金库中有多少价值。如果金库赚取了利润,资产将会多于存入的部分,用户在赎回金库股份时将能够获得部分利润(他们将会获得他们的存款 + 他们的利润份额)。

自 ERC4626 诞生以来,已经实施并采用了多种不同的新防御机制。最基本和广泛的防御措施是向金库偏向性地舍入股份/资产。简单来说,用户被扣除的部分应向上舍入,用户获得的部分应向下舍入。

第二种最常应用的防御机制是小数偏移和死股份存款。这种机制是为了应对所谓的通货膨胀攻击而创建的,允许攻击者通过抢跑(1)一个存款和(2)一个捐赠来窃取第一个存款者的全部存款。小数偏移使这种攻击对攻击者来说不再盈利,正如 @OpenZeppelin 在 这篇非常有趣的文章 中所演示的。

最后,我们开始看到金库内部自行管理基础资产余额的会计,而不是依赖于通常的 balanceOf 方法调用(捕捉来自 OZ 的 ERC4626.sol 合约)。

Untitled

其平衡是为了使攻击者无法向池中捐赠代币(从而在没有控制的情况下操纵该值),这将导致基础资产余额与股份余额之间的失衡(然后影响它们的兑换率)。

我们称之为捐赠攻击。通过向金库捐赠资产,股份的价值增加,如果金库股份代币在另一个 DeFi 协议中被用作抵押品,那么这可能会造成问题。

通过实施内部会计,直接捐赠(即将代币直接转账到池地址)将不再被视为金库持有的资产,从而使捐赠变得不可能。

Wise Lending 实施了 (1) 内部会计和 (2) 限制直接捐赠到合约的代币数量的限制。 (2) 允许在超过某个值之前对直接捐赠进行计算,同时仍然使其不至于捐赠到过度的地步:

Untitled

漏洞

那么我们现在就直接进入漏洞部分吧。Wise Lending 发生的事情是一场捐赠攻击。但这不是普通的“简单”捐赠攻击。

(1) 攻击者首先存入了非常少量的代币,然后捐赠了一个刚好低于限制的量。虽然这在限制之下,但捐赠的数量比初始存款大 5,000,000 倍。

(2) 这次通货膨胀不足以窃取大量代币,他需要捐赠更多,但限制不允许他这样做。

这个策略的聪明之处在于将金库自身的舍入机制用作攻击。这种方法基本上使金库无意中促进了攻击者的代币捐赠。这是因为奖励给攻击者的股份与实际存入的代币数量不相符。

如果一股的价值为 2 个代币(exchange_rate = 2),存入 3 个代币将铸造 1 股,因为舍入下限(3/2 = 1.5 ↓= 1)。但金库将增加其余额中的 3 个代币,这将导致兑换率进一步偏高至 3 。然后通过提取 1 个代币,金库将销毁用户的 1 股(通过对他向上舍入,1/3 = 0.3 ↑= 1),这将导致最后捐赠 2 个代币。

通过一次又一次地迭代,兑换率不断增长,使得每次都可以捐赠更多,直到最终达到代币与股份之间非常高的价格值。

这正是我们在追踪中看到的内容,红色标记的是兑换率(4/1),橙色标记的是存款,该存款经过精心选择以便在只获得一股的同时捐赠最大量。

Untitled

提取价值

仅仅这个操作还不足以获得利润。操控价格通常是第一步。通过使一股看起来(要多得多)更昂贵,它使得在其他借贷协议的池中将其用作抵押成为可能。

这正是攻击者所做的。首先,他在操控后的池中存入代币以获得 6 股。

接着,他部署了另外 6 个木偶合约,全部在操控的池中存入足够的代币以获得各自的 1 股。

然后,每个木偶在其他池(USDC、WETH、USDT、DAI 等)中借取尽可能多的资金,依靠定价过高的股份。

最后,这些木偶合约从操控的池中提取 1 个代币,这烧毁了它们唯一的股份(因为对用户的舍入下限)。木偶们是有损失的,因为他们的借款价值低于他们最初存入的金额(因为抵押因子始终 >100%)。

但现在,攻击者的主合约拥有操控池中所有现存的股份!所以,通过烧毁他的 6 股,他能够抽空整个池子,同时仍然保留借来的资金,因为没有抵押品可供没收!

错误

Wise Lending 并没有实现 (1) 死股份,(2) 把悄悄的捐款纳入计算,而应当舍弃它。

死股份将防止黑客拥有整个池,因此阻止他提取全部资产。

而通过舍弃悄悄的捐款,这将不允许黑客操控兑换率。

  • 原文链接: github.com/InfectedIsm/B...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
InfectedIsm
InfectedIsm
Web3 Security tryhard DM for inquiries ? infect3d.xyz