Belt金融 2021年5月29日 事故报告

Belt Finance
Belt Finance
Published in
16 min readJun 7, 2021

介绍

首先我们非常重视用户的信任。Belt 是一项拥有超过 20 亿美元 TVL 和数万用户的服务,其中每个用户对我们都很重要。虽然我们通过定期审计和保护措施保持警惕,但在2021年05月29日这一天发生了一次攻击,给我们的用户带来的不便和困扰,我们深表歉意,并怀着沉重的心情解释和报告发生的事情。

2021 年 5 月 29 日,BSC 4Belt(USDT/USDC/BUSD/DAI)矿池遭受闪贷攻击。攻击者创建了一个使用 PancakeSwap 进行闪电贷的智能合约,并利用了我们的beltBUSD 池及其底层策略协议,然后继续执行该合约 8 次,总利润为 6,234,753 BUSD。BeltBUSD 金库用户遭受了 21.36% 的资金损失,而 4Belt 矿池用户遭受了 5.51% 的资金损失。没有其它池/保险库受到影响。

我们一发现攻击就暂停了提款和存款,以防止进一步的损失并保护我们的用户及其资产。虽然我们知道这可能会给我们的用户带来不便,但这样做是为了防止同样的漏洞攻击我们的其它保险库/池。所有其它矿池/金库和所有资金都不会受到此次攻击的影响并且安全,我们现在已经修补了允许利用 4Belt 和 BeltBUSD 的攻击向量。

由于我们的合约是有时间锁定的,资金的提款和存款将在接下来的 24–48 小时内恢复。请放心,您的资金是安全的,我们正在制定将在接下来的 48 小时内发布的补偿计划。

这是一项深入分析,旨在通知我们的用户攻击的性质、使用的方法以及我们为防止类似漏洞而采取的措施。

概述

这是对攻击过程、我们以前的预防措施、我们的新解决方案以及未来将发生的事情的详细概述。在此概述之后给出了所有内容的详细分类,包括确切的交易。

漏洞利用
从 2021 年 5 月 29 日 19:23:28 UTC 开始,攻击者使用智能合约开始对 4Belt BLP 池执行闪贷攻击。

攻击者从 PancakeSwap 获得了大约 3.9 亿 BUSD 的闪贷用于漏洞利用,这接近 PancakeSwap 上使用 BUSD 的所有池中可以获得的最大 BUSD 金额。攻击者随后将大约 2 亿 BUSD 存入了beltBUSD 金库(以 Venus 作为策略协议),因此策略之间的比例严重转向 Venus。在攻击之前,beltBUSD 金库的比例拆分为:Venus 中的约 60M BUSD、Alpaca 中的 60M BUSD、Ellipsis 中的 60M BUSD 和 ForTube 中的 20M BUSD,总共约 2 亿 BUSD。攻击者的存款使得Venus策略有大约260M BUSD,所以beltBUSD的总数大约是400M。

攻击者的合约同时将 1.9 亿 BUSD 转移到 Ellipsis.fi 3pool,将 1.9 亿 BUSD 兑换成约 1.695 亿 USDT。此次掉期导致 Ellipsis 3pool LP 的价值显着增加。3pool LP 的供应变化没有改变,但这 2150 万美元的差异使 3pool LP 的价值增加了约 3%。这反过来将 4Belt 矿池的 Ellipsis 策略的价值从 60M BUSD 增加到 6180 万 BUSD,使整个 BeltBUSD 金库从 400M BUSD 增加到 401.8M BUSD(增加了 0.5%)。

然后,攻击者从beltBUSD 金库中取出200M BUSD 存款,或大约1M BUSD(从200M BUSD 存款中提取201M BUSD)大约0.5% 的收益。攻击者随后在 Ellipsis 上将 USDT 换回 BUSD,将 LP 返回到其之前的值,从而使beltBUSD 金库损失了 1M BUSD。

然后,攻击者的智能合约在同一笔交易中多次重复此循环(与 Tx gas 上限允许的一样多),涵盖闪贷费用和 Ellipsis 掉期费用以最终获利。然后,攻击者将 BUSD 的利润带到他们的地址并将其交换到 anyETH,然后再使用 Nerve Bridge 将他们的 anyETH 发送到以太坊主网。

利用这个漏洞交易,从 PancakeSwap flashloan 开始,到向以太坊主网发送anyETH 结束,重复了 8 次。

以前的预防措施及其克服的地方
由于 LP 值变化,我们的 Ellipsis 策略具有 AMM 功能,允许代币价格存在差距,因此我们具有防止闪电贷漏洞利用的功能。我们的函数在存款或取款之前检查池是否“健康”。如果 Ellipsis 池比率出现异常,则与该池之间的交易将被恢复。这防止了 Ellipsis 策略本身被利用。

我们没有对影响多策略金库中其他策略的存款和取款的 Ellipsis 策略变化做出响应,因为该功能与 Ellipsis 池的直接读取关系有关,基于其对存款/取款的影响的闪贷攻击其他保险库没有预料到。由于攻击发生在两个向量上,Ellipsis LP 价格操纵和从其他 BeltBUSD 策略中大量存款/取款,因此利用了这一漏洞。

考虑到我们的多策略保险库的复杂性,攻击的执行错综复杂,因为它的合约包括这两个攻击向量,它们相互协作,以防止攻击交易恢复。通过计算价格影响以及流动性和提款的规模,攻击反复移动了大约 200M BUSD 以达到大约 1M BUSD。

我们的解决方案

在 StrategyEllipsis 的情况下,isPoolSafe() 用于在出现价格缺口时限制提款。现在,对于所有策略,当USDC、BUSD和USDT存在差异时,我们通过检查Ellipsis掉期的状态来解决问题,限制用户的取款和存款。这使得不再有通过操纵 Ellipsis LP 价格的漏洞。更多细节在下面解释。

现在发生了什么
我们致力于为用户保持使用我们的服务,并让用户可以持续盈利。因此,我们目前正在修补被利用的漏洞,并咨询我们合作的服务商以确保这种情况不会再次发生。我们还会重新访问我们提供的每个保险库,以确保它们不会受到类似的利用方法的影响。

除了自己审查之外,我们还要求对我们的合同进行额外审计。

目前,提款和存款被禁用,以确保不会发生更多的损害。对于由此造成的不便,我们深表歉意,但我们会在打开保险库之前确保保险库安全且无风险。我们预计取款和存款将在接下来的 48 小时内恢复。

在这个动荡的时期,我们感谢那些一直支持我们的人。无论您是 BELT 持有者,还是使用我们金库的人,我们都希望确保此事件不会对您产生负面影响。我们目前正在努力为受此次攻击影响的帐户快照受影响的人制定公平和全面的补偿计划。我们将在接下来的 48 小时内发布补偿计划,因为这是我们获取并查看所有日志以准确了解哪些用户需要获得补偿所必需的时间。

我们的补偿计划在制定中,将努力有效地解决和纠正对我们心爱的用户造成的任何错误。我们明白信任决定了项目的成败,并将竭尽全力恢复和保留用户对我们的信任。

事件的详细分解和分析

在开发过程中,我们添加了以下功能,以防止 Ellipsis Pool 值不安全时的攻击。

isPoolSafe 函数通过测量 Ellipsis 3pool 的代币比例(它包含最多和最少的代币)来检查其健康状况。此功能可防止具有不自然比率的 StableSwap AMM 影响 Belt。

isPoolSafe 函数在 _deposit() 和 _withdraw() 函数之前和之后起作用以检查池健康状况,如果池比率出现偏差,则交易将恢复以防止任何更新。这是为了防止闪电贷攻击我们的 Ellipsis 策略。

通过使用 Ellipsis 的掉期,可以瞬间操纵 ellipsisSwap 合约中 BUSD、USDC 和 USDT 的比例,从而可以操纵 3pool LP 的价格。

当计算 Ellipsis 策略的 wantTotalLocked() Ellipsis 3Pool 比率的 MultiToken 函数的 epsToWant() 被破坏并影响其他策略的存取时,我们没有响应。由于此功能是与 Read 相关的接口,我们没想到与闪贷有直接关系。

结果,闪贷导致 Ellipsis 策略中的 wantTotalLocked 值增加,MultiVault 以高于实际资产量的值运行了提款。这就是漏洞的根源。

攻击者利用了这一漏洞。

以下是8笔交易的过程。

UTC 时间 19:23:28 漏洞利用交易详情如下:
https://bscscan.com/tx/0xf598e092ab82ce08798f9dab7ea6ade64f152aa91db897f3449b23ab591baa1d

[交易开始]
* 开发者在 PancakeSwap (PCS) 上获得资金以进行闪贷攻击(以下称为“闪贷”,整个序列在一次单笔交易中完成)
- 从 PCS BNB/BUSD 闪现 107,956,994 BUSD
- 从 PCS USDC/BUSD 闪现 38,593,199 BUSD
- 从 PCS USDT/BUSD 闪现 155,203,983 BUSD
- 从 PCS DAI/BUSD 闪现 31,676,534 BUSD
- 从 PCS UST/BUSD 闪现 17,698,988 BUSD
- 从 PCS VAI/BUSD 闪现 17,481,089 BUSD
- 从 PCS ALPACA/BUSD 闪现 10,975,178 BUSD
- 从 PCS CAKE/BUSD 闪现 10,793,357 BUSD
* 总共从PCS刷出390,379,325.49927646 BUSD
* 200,379,325 BUSD 移动到 235,391,847 BeltBUSD mint。(选择的策略:bVenusStrategy)
* 190,000,000 BUSD 转移到 Ellipsis.fi 3pool 兑换 190,000,000 BUSD 至 168,535,055 USDT
>> 此交换导致 Ellipsis.fi 上 3pool 的 LP 值增加了约 3%
* 提现(销毁)235,391,847 BeltBUSD,获得201,383,385 BUSD(选择策略:bVenusStrategy,额外获得1,004,060 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,535,055 USDT 到 189,339,377 BUSD
* 200,722,763 BUSD 至 237,006,836 BeltBUSD mint (选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,501,231 USDT
* 提现(销毁)237,006,836 BeltBUSD 至201,731,704 BUSD(选择策略:bVenusStrategy,额外获得1,008,941 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,501,231 USDT 到 189,338,762 BUSD
* 201,070,467 BUSD 至 238,649,866 BeltBUSD mint(选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,467,410 USDT
* 提现(销毁)238,649,866 BeltBUSD 至202,084,332 BUSD(选择策略:bVenusStrategy,额外获得1,013,865 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,467,410 USDT 到 189,338,149 BUSD
* 201,422,482 BUSD 到 240,321,619 BeltBUSD mint(选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,433,591 USDT
* 提现(销毁)240,321,619 BeltBUSD 至202,441,315 BUSD(选择策略:bVenusStrategy,额外获得1,018,833 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,433,591 USDT 到 189,337,538 BUSD
* 201,778,854 BUSD 到 242,022,800 BeltBUSD mint(选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,399,774 USDT
* 提现(销毁)242,022,800 BeltBUSD 至202,802,701 BUSD(选择策略:bVenusStrategy,额外获得1,023,847 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,399,774 USDT 到 189,336,930 BUSD
* 202,139,632 BUSD 到 243,754,134 BeltBUSD mint(选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,365,959 USDT
* 提现(销毁)243,754,134 BeltBUSD 至203,168,537 BUSD(选择策略:bVenusStrategy,获得1,028,905 BUSD)
* 在 Ellipsis.fi 3pool 上将 168,365,959 USDT 兑换为 189,336,324 BUSD
* 202,504,862 BUSD 到 245,516,374 BeltBUSD mint (选择策略:bVenusStrategy)
* 在 Ellipsis.fi 3pool 上将 190,000,000 BUSD 兑换为 168,332,147 USDT
* 提现(销毁)245,516,374 BeltBUSD 至203,538,872 BUSD(选择策略:bVenusStrategy,额外获得1,034,010 BUSD)
* 在 Ellipsis.fi 3pool 上兑换 168,332,147 USDT 到 189,335,720 BUSD
(* 协议通过上面列出的 7 步交易共造成 7,132,461 美元的损失)
* 闪贷还款
- 在 PCS CAKE/BUSD 上偿还了 10,825,835 BUSD
- 在 PCS ALPACA/BUSD 上偿还了 11,008,203 BUSD
- 在 PCS VAI/BUSD 上偿还了 17,533,690 BUSD
- 在 PCS UST/BUSD 上偿还了 17,752,245 BUSD
- 在 PCS DAI/BUSD 上偿还了 31,771,849 BUSD
- 在 PCS USDT/BUSD 上偿还了 155,670,996 BUSD
- 在 PCS USDC/BUSD 上偿还了 38,709,327 BUSD
- 在 PCS BNB/BUSD 上偿还了 108,281,840 BUSD
* 向开发者地址转移1,320,605 BUSD
[交易结束]
以与上述相同的方式进行了总共 8 笔交易。
https://bscscan.com/tx/0x50b0c05dd326022cae774623e5db17d8edbc41b4f064a3bcae105f69492ceadc
https://bscscan.com/tx/0xc4d4156aab1fca85c99e85352b836274d3c53bafe98a2c9867b68950e1eafde9
https://bscscan.com/tx/0xb57acfeab13d52664416aa2ada9b490e340292731fced049fc8c4a730b7af700
https://bscscan.com/tx/0xcca1ebf01e694bb4c447f6018eebb34a3b829cff9ea1ec5fce236eb3cc2ef99c
https://bscscan.com/tx/0x7719e1bae25dbe80539edea37c962e941ec4141145e6eabe63540b7178ffd0d0
https://bscscan.com/tx/0xd790026feda9a16646647e9df0779dc4a7b173053369847691b8f3f678da1f66
https://bscscan.com/tx/0xf598e092ab82ce08798f9dab7ea6ade64f152aa91db897f3449b23ab591baa1d
https://bscscan.com/tx/0x7b3b727a56d1649ee325c42416a1199f4a9b4f4eb024a60b5848a7b1485953b1

通过上述交易,攻击者给beltBUSD矿池造成了总计50,030,452 BUSD的损失,并使用了43,795,699 BUSD作为PCS、Venus和Ellipsis的费用。攻击者最终将 6,234,753 BUSD 提取到他们的钱包中。

由于这次攻击,beltBUSD 的价格从 1.018262 下跌到 0.800687,对beltBUSD 金库中的存款损失了 21.36%。

4Belt LP 价格从 1.017904 下跌至 0.961767,4Belt LP 持有者损失 5.51%。
为了纠正这个问题,我们不是只在取款和存款时调用 isPoolSafe() 函数,而是修改了代码,在测量协议内资产的价值时调用 isPoolSafe()。

以下是我们解决方案的提交哈希:https://github.com/BeltFi/belt-contract/commit/d08d73d160d07e10ac47acbaa624ab7844160907

现在,对于我们所有的策略,我们检查 Ellipsis 3pool LP 的比率,并在出现价格差异时将所有提款和存款限制在多代币保险库中。我们修改了代码以允许使用带有读取函数的 isPoolSafe,并在 isPoolSafe 中添加了 require() 语句,以便可以通过调用 isPoolSafe 来恢复读/写。

我们这样做是为了在计算 wantLockedTotal 时,eps3ToWant 函数调用 isPoolSafe() 函数,以便在出现异常时恢复读取。

为了更保守的响应,我们已将最大 Ellipsis 3Pool 比率变化的健康检查标准更改为比以前低 5 倍。为了读取更准确的数量,我们直接与 StableSwap 提供的余额界面进行交互。

[前]
安全系数数字 10
安全系数Denom 1
[后]
安全系数数字 10
安全系数Denom 2

--

--

Belt Finance
Belt Finance

Belt.fi is an AMM protocol that incorporates multi-strategy yield optimizing on Binance Smart Chain (BSC)