详解DeFi协议bZx二次被黑:攻击手法是怎样的,如何防御?
作者:yudan@慢雾安全团队
编者注:原标题为《详解DeFi协议bZx二次被黑》
前言
2月18日早,bZx 疑似遭遇第二次攻击,不同的是本次的对象是 ETH/sUSD 交易对,但也许有人会有疑问,sUSD 不是对标 USD 的稳定币吗?这都能被攻击?攻击手法具体是怎样的?带着这样的疑问,针对此次事件,慢雾安全团队接下来将复盘这两次攻击过程。在第一次攻击中,攻击者结合 Flash loan 和 Compound 中的贷款,对 bZx 实施攻击,主要分成以下几步:
-
从 dYdX 借了 10000 个 ETH -
到 Compound 用 5500 ETH 借了 112个 BTC 准备抛售 -
到 bZx 中用 1300个 ETH 开 5 倍杠杆做空,换了 51.345576 个 BTC,而这里换取的 BTC 是通过 Kyber Network 来获取价格的,然而 Kyber Network 最终还是调用 Uniswap 来获取价格,5 倍杠杆开完后兑换回来的 51 个 BTC 实际上是拉高了 UniSwap 中 BTC/ETH 的价格,换取价格是 1/109,但是实际上大盘的价格不会拉到这么多 -
用从 Compound 借来的 112 个 BTC 来在 UniSwap 中卖掉,由于第三步中 bZx 中的 5 倍杠杆已经把价格拉高,所以这个时候出售 ETH 肯定是赚的,然后卖了 6871 个 ETH -
归还 dYdX 中的借贷
注: 下文中出现的 WETH 是 ETH 的 token 化代币,可统一认为是 ETH。与 ETH 之间的兑换比例是 1:1
细节剖析
本次发生攻击的交易哈希为:0x762881b07feb63c436dee38edd4ff1f7a74c33091e534af56c9f7d49b5ecac15
这么多转账交易中,攻击者一共购买了 20 次 sUSD,最终获利离场,那么攻击者具体是怎么操作的呢?我们使用区块浏览器 bloxy.info 来做进一步分析。
1、赛前准备
和第一次一样,首先攻击者需要从 Flash loan 借入一定的金额开始本次的攻击,第一次攻击是从 dYdX 借入 10000 ETH,这次,攻击者选择从 bZx 本身支持的 Flash loan 下手,借入 7500个 ETH。
2、发球
在完成从 bZx 的借入之后,攻击者开始通过 Kyber 进行 sUSD 的买入操作,第一次使用了 540 个 ETH 购买了 92,419.7 个 sUSD, 这个操作令 WETH/sUSD 的价格瞬间拉低,捧高了 sUSD 的价格。这次的交易兑换的比例大概为 1:170,而 Kyber 最终是通过 UniSwap 来进行兑换的,所以此时 Uniswap 的 WETH/sUSD 处于低位,反过来,sUSD/WETH 升高。
在完成第一次的 540 个ETH的兑换之后,攻击者再次在 Kyber 进行 18 次小额度的兑换,每次使用 20 个 ETH 兑换 sUSD,从 etherscan 我们能够看到,每一次的兑换回来的 sUSD 金额在不断减少。
这表明 sUSD/WETH 的价格被进一步拉升,这加剧了 Uniswap 中 sUSD/WETH 的价格,此时价格已经达到顶峰了,大概是 1:157。
在完成以上两步操作之后,攻击者已经完成狩猎前的准备,随时可以开始攻击。
3、一杆进洞
在完成对 sUSD/WETH 的拉升后,攻击者此时需要采集大量的 sUSD,为后续兑换 WETH 做准备。为了达成这个目的,攻击者向 Synthetix 发起 sUSD 的购买,通过向 Synthetix 发送 6000 ETH 购买 sUSD,直接把 Synthetix 中的 sUSD 买空,Synthetix 合约返还 2482 个 ETH 给攻击者。
完成了上面的操作后,攻击者直接对 bZx 发动总攻,直接用之前操作得来的一共 1,099,841 个 sUSD 向 bZx 兑换 WETH,此时由于 bZx 兑换还是要去查询 Uniswap 的 sUSD/WETH 的价格,而这个价格已经被攻击者人为拉得很高了,此时兑换,就能通过 1,099,841 个 sUSD 换取大量的 WETH, 此次交易一共用 1,099,841 个 sUSD 换取了 6792 个 WETH,此时攻击已经完成。
4、归还借贷
完成了对 bZx 的攻击之后,将 7500 ETH 归还给 bZx, 完成闪电贷流程,从 bZx 来,再回到 bZx 去,还使 bZx 遭受了损失。
赛后复盘
通过分析攻击者的攻击手法,我们统计下攻击者在攻击过程中的支出和收入情况。收入
7500 => bZx 闪电贷 + 2482 => Synthetix 返还 + 6792 => 使用 sUSD 在 bZX 兑换 WETH = 16774 ETH
支出
540 + (20*18) => 拉高 sUSD/WETH 价格 + 6000 => 买空sUSD + 7500 => 归还bZx闪电贷 = 14400 ETH
总的收益为: 16774 - 14400 = 2374 ETH
防御建议
两次攻击的主要原因还是因为 Uniswap 的价格的剧烈变化最终导致资产的损失,这本该是正常的市场行为,但是通过恶意操纵市场,攻击者可通过多种方式压低价格,使项目方造成损失。针对这种通过操纵市场进行获利的攻击,慢雾安全团队给出如下建议:项目方在使用预言机获取外部价格的时候,应设置保险机制,每一次在进行代币兑换时,都应保存当前交易对的兑换价格,并与上一次保存的兑换价格进行对比,如果波动过大,应及时暂停交易。防止市场被恶意操纵,带来损失。
Bitcoin Price To Break Key Resistance For Rally With A Crash To This Zone First
The Bitcoin price seems to have hit an important make it or break it point that will determine the n...
Best Altcoins on Solana to Explode as Investor Interest in $SOL ETF Skyrockets
According to Bloomberg Intelligence, the likelihood of US regulators approving a Solana ETF (exchang...
Buy Now Before Bitcoin Hits $1 Million! Michael Saylor and Pompliano’s Predictions Explained
The post Buy Now Before Bitcoin Hits $1 Million! Michael Saylor and Pompliano’s Predictions Explaine...