Defi安全--Zunami Protocol攻击事件分析

这篇具有很好参考价值的文章主要介绍了Defi安全--Zunami Protocol攻击事件分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

其它相关内容可见个人主页

1 Zunami攻击事件相关信息

2023.8.13发生在Ethereum上发生的攻击,存在两个攻击交易,具体信息如下:

  • 攻击合约地址:Contract Address 攻击合约

  • 攻击者地址:Zunami Protocol Exploiter

  • 攻击交易hash1:Ethereum Transaction Hash (Txhash) Details | Etherscan

  • 攻击交易hash2:Ethereum Transaction Hash (Txhash) Details | Etherscan

  • phalcon分析调用序列:0x0788ba222970c7c68a | Phalcon Explorer (blocksec.com)

2 攻击流程详解

项目介绍

Zunami是稳定币投资聚合器,用户给定用ETH/USDC/DAI等稳定币投资Zunami协议;

然后Zunami协议会使用用户质押的代币到Curve中高收益的池子进行质押;

那么为了保证更进一步的收益,Zunami还会把Curve的流动性再次质押到StakeDAO和Convex平台中,吃两波流动性奖励。

然后把收到的流动性奖励代币(CRV)经过用户的质押比例返回给用户。

zETH是Zunami协议实现的变基代币(rebase token),变基代币的逻辑是因为他的代币数量计算是锚定了Zunami所有的资产来计算的,所以可以通过闪电贷对Zunami质押的池子买入卖出就可以影响zETH的数量计算

攻击流程

两次攻击交易是单独的,但是基于的漏洞及原理是一致的

以0x0788ba222970c7c68a738b0e08fb197e669e61f9b226ceec4cab9b85abe8cceb攻击交易为例进行分析

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 对攻击交易进行调用序列分析,直接调用攻击合约中的函数;先查看了Balancer: Vault账户中USDC的余额
  2. 随后攻击者就调用UniswapV3中USDC-USDT对应的闪电贷函数,借出了7 e12wei的USDT;随后查看pair对池子中的USDC和USDT的余额,乐观转账会将对应借贷转给用户。
  3. 闪电贷会回调攻击者的uniswapV3FlashCallback函数,回调中攻击者调用Balancer: Vault的flashloan函数,这里可以看一下这里的函数源码
    function flashLoan(
        IFlashLoanRecipient recipient,
        IERC20[] memory tokens,
        uint256[] memory amounts,
        bytes memory userData
    ) external override nonReentrant whenNotPaused 

看了一下源码,其功能无特别之处,就是一个闪电贷函数,不过这个函数可以一次借贷多个代币,用tokensamounts表示对应的数组,先后乐观转账,后回调攻击者,在进行还款

  1. 在Balancer: Vault的flashloan函数中,会查看对应的余额,进行相应的乐观转账,随后会再次回调到攻击者的receiveFlashLoan函数,此时用户已经通过借贷获得了大量的USDT、USDC以及ETH

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 随后攻击者给curve finance,sushiswap以及uniswap上很多factory和router合约地址进行相应的代币授权,并调用Curve Finance: Swap用USDC给池子中添加流动性,获得crvFRAX

    Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  2. 随后调用Curve.fi Factory Pool中的一些pair对的exchange()函数,DEX智能合约的代币交换功能,可以把vyper代码直接放到GPT中解析,可以理解为就算进行代币的交换,攻击者将对应的crvFRAX兑换为Zunami UZD,将USDC兑换为crvUSD。此时用户拥有UZD和crvUSD

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 攻击再次调用exchange()函数,将所有的crvUSD兑换为对应的UZD,最后攻击者拥有4873316数量的UZD,并且将自身的ETH换成对应的SDT,并且将全部的SDT转到MIMCurveStakeDao中(为什么要进行这样一个存款,可能跟攻击行为有关)Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  2. 随后调用SushiSwap: Router的swapExactTokensForTokens函数,进行代币的交换,攻击者首先将自身的WETH兑换为对应的SDT,随后将步骤2中通过闪电贷获得的USDT全部兑换为WETH

  3. 攻击者调用UZD合约的cacheAssetPrice()函数,仔细看一下函数源码,获得UZD缓存的资产价格,源码如下:

    function cacheAssetPrice() public virtual {
        _blockCached = block.number;
        uint256 currentAssetPrice = assetPrice();
        if (_assetPriceCached < currentAssetPrice) {
            _assetPriceCached = currentAssetPrice;
            emit CachedAssetPrice(_blockCached, _assetPriceCached);
        }
    }
  1. 可以看出对应的_assetPriceCached的价格是由assetPrice()决定的,进一步阅读函数源码
    function assetPrice() public view override returns (uint256) {
        return priceOracle.lpPrice();
    }

进一步阅读etherscan上源码,可得priceOracle地址为0x2ffCC661011beC72e1A9524E12060983E74D14ce,查看该合约的lpPrice()函数。

    function lpPrice() external view returns (uint256) {
        return (totalHoldings() * 1e18) / totalSupply();
    }

价格取决于totalHoldings()函数,totalSupply()为ERC标准函数

    function totalHoldings() public view returns (uint256) {
        uint256 length = _poolInfo.length;
        uint256 totalHold = 0;
        for (uint256 pid = 0; pid < length; pid++) {
            totalHold += _poolInfo[pid].strategy.totalHoldings();
        }
        return totalHold;
    }

这个会取决于每个_poolInfo[pid].strategy的Holdings()函数,这里我们去看MIMCurveStakeDao对应的函数,源码如下所示:

    function totalHoldings() public view virtual returns (uint256) {
        uint256 crvLpHoldings = (vault.liquidityGauge().balanceOf(address(this)) * getCurvePoolPrice()) /
            CURVE_PRICE_DENOMINATOR;

        uint256 sdtEarned = vault.liquidityGauge().claimable_reward(address(this), address(_config.sdt));
        uint256 amountIn = sdtEarned + _config.sdt.balanceOf(address(this));
        uint256 sdtEarningsInFeeToken = priceTokenByExchange(amountIn, _config.sdtToFeeTokenPath);

        uint256 crvEarned = vault.liquidityGauge().claimable_reward(address(this), address(_config.crv));
        amountIn = crvEarned + _config.crv.balanceOf(address(this));
        uint256 crvEarningsInFeeToken = priceTokenByExchange(amountIn, _config.crvToFeeTokenPath);

        uint256 tokensHoldings = 0;
        for (uint256 i = 0; i < 3; i++) {
            tokensHoldings += _config.tokens[i].balanceOf(address(this)) * decimalsMultipliers[i];
        }

        return
            tokensHoldings +
            crvLpHoldings +
            (sdtEarningsInFeeToken + crvEarningsInFeeToken) *
            decimalsMultipliers[feeTokenId];
    }
    
    function priceTokenByExchange(uint256 amountIn, address[] memory exchangePath)
        internal
        view
        returns (uint256)
    {
        if (amountIn == 0) return 0;
        uint256[] memory amounts = _config.router.getAmountsOut(amountIn, exchangePath);
        return amounts[amounts.length - 1];
    }

重点关注sdtEarningsInFeeToken,因为攻击者在此之前,给该合约存入了大量的SDT,仔细看一下priceTokenByExchange()函数

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

进一步可以去SushiSwap: Router中查看getAmountsOut()函数,发现其返回值与amountIn正相关,amountIn的值一定程度上取决于该合约当前的SDT余额,而攻击者在此之前给该地址存入了大量的SDT,最终导致sdtEarningsInFeeToken数量过高,CachedAssetPrice价格过高

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 随后攻击者调用SushiSwap: Router的swapExactTokensForTokens函数,将SDT转化为WETH,将WETH换成USDT
  2. 随后调用UZD合约中的balanceOf函数,发现其依赖于被操纵的cacheAssetPrice价格,具体如下:
    function balanceOf(address account) public view virtual override returns (uint256) {
        if (!containRigidAddress(account)) return super.balanceOf(account);

        return _balancesRigid[account];
    }
    
    function balanceOf(address account) public view virtual override returns (uint256) {
        // don't cache price
        return _convertFromNominalCached(_balances[account], Math.Rounding.Down);
    }

    function _convertFromNominalWithCaching(uint256 nominal, Math.Rounding rounding)
        internal
        virtual
        returns (uint256 value)
    {
        if (nominal == type(uint256).max) return type(uint256).max;
        _cacheAssetPriceByBlock();
        return nominal.mulDiv(assetPriceCached(), DEFAULT_DECIMALS_FACTOR, rounding);
    }

所以其会错误计算攻击者的UZD余额,这时攻击者进行相应的套利即可

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 通过Curve.fi Factory Pool的exchange函数,先将错误余额数量的UZD,一部分兑换为crvFRAX,另一部分兑换为crvUSD。

    移除Curve Finance: Swap中的流动性,攻击者获得对应的FRAX和USDC。

    调用exchange函数,将对应的FRAX和crvUSD兑换城USDC

    并且最后将大部分的USDC全部兑换成USDT,现在攻击者资产为USDT和USDC。

Defi安全--Zunami Protocol攻击事件分析,区块链安全,Defi学习,安全事件分析,安全,区块链

  1. 调用WETH-USDCpair对的闪电贷,获得大量的WETH,攻击者偿还相应数量的USDC,并偿还第2步中Balancer: Vault闪电贷借贷的WETH和USDC,最后偿还第一步中uniswapV3借贷的USDT
  2. 最后偿还完闪电贷后,攻击者获得资产USDT和WETH,将其全部提取完成攻击。

再简单看一下另一个攻击交易0x2aec4fdb2a09ad4269a410f2c770737626fb62c54e0fa8ac25e8582d4b690cca文章来源地址https://www.toymoban.com/news/detail-795360.html

  • 也是先调用攻击合约,后进行闪电贷,借出WETH,然后通过curve finance将eth兑换成zETH
  • 将ETH兑换成CRV,存入sEthFraxEthCurveConvex合约中,与上述相同,攻击者账户的zETH余额和sEthFraxEthCurveConvex合约中的CRV余额相关,攻击者通过多次在wETH/CRV在池子中兑换CRV,操纵了CRV的价格和漏洞合约的CRV余额,最终导致CachedAssetPrice变大

到了这里,关于Defi安全--Zunami Protocol攻击事件分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2月区块链安全事件暴涨,因黑客攻击等损失金额达4亿美元

    2024年2月,各类安全事件损失金额较2023年1月大幅增加。2024年2月发生较典型安全事件超22起,因黑客攻击、钓鱼诈骗和Rug Pull造成的总损失金额达4.22亿美元,较1月上涨约103 %。其中攻击事件约3.47亿美元,增长约110%;钓鱼诈骗事件约1608万美元,下降约52%;Rug Pull事件约5938万美

    2024年03月17日
    浏览(41)
  • 【安全月报】| 3月区块链安全事件下降,因黑客攻击等损失金额达1.58亿美元

    零时科技每月安全事件看点开始了!据一些区块链安全风险监测平台统计显示,2024年3月,各类安全事件损失金额较2023年2月大幅下降。3月发生较典型安全事件超 30 起,因黑客攻击、钓鱼诈骗和Rug Pull造成的总损失金额达 1.58 亿 美元,较2月下降约 62.5% 。其中攻击事件约 1.1

    2024年04月09日
    浏览(34)
  • [区块链安全-Damn_Vulnerable_DeFi]区块链DeFi智能合约安全实战(V3.0.0)(已完结)

    很抱歉,很久没有更新了。这段时间,经历了孩子出生、出国执行项目等诸多事情,心里也比较乱,也没有思绪去完成挑战。最近总算闲下来了,不过打开一看,发现[Damn-Vulnerable-DeFi]已经执行到v3.0.0了,很多东西都发生了变化,为什么不重头做一下呢?不过这次我可能会比较

    2024年02月07日
    浏览(47)
  • 创宇区块链|Inverse Finance 安全事件分析

    北京时间 2022 年 4 月 2 日晚,Inverse Finance 借贷协议遭到攻击,损失约 1560 万美元。知道创宇区块链安全实验室第一时间跟踪本次事件并分析。 基础信息 攻击tx1:0x20a6dcff06a791a7f8be9f423053ce8caee3f9eecc31df32445fc98d4ccd8365 攻击tx2:0x600373f67521324c8068cfd025f121a0843d57ec813411661b07edc5ff781842 攻

    2023年04月08日
    浏览(34)
  • 第67篇:美国安全公司溯源分析Solarwinds供应链攻击事件全过程

    大家好,我是ABC_123 。本期继续分享Solarwinds供应链攻击事件的第4篇文章,就是美国FireEye火眼安全公司在遭受攻击者入侵之后,是如何一步步地将史上最严重的Solarwinds供应链攻击事件溯源出来的。 注: Mandiant安全公司已被FireEye收购,但是仍然可以独立运营,严格地说的,这

    2024年02月03日
    浏览(36)
  • 某60区块链安全之51%攻击实战学习记录

    1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 1.Ubuntu18.04操作机 python2 1.在比特币网络里,你有多少钱,不是你说了算,而是大家说了算,每个人都是公证人。 2基于算力证明进行

    2024年02月02日
    浏览(33)
  • 某60区块链安全之薅羊毛攻击实战一学习记录

    学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 Ubuntu18.04操作机 python3 薅羊毛攻击指使用多个不同的新账户来调用空投函数获得空投币并转账至攻击者账户以达到财富累计的一种攻击方式。这类攻击方式较为普通且常见,只

    2024年02月04日
    浏览(33)
  • 某60区块链安全之薅羊毛攻击实战二学习记录

    ` 学会使用python3的web3模块 学会分析以太坊智能合约复杂场景下薅羊毛攻击漏洞及其利用 找到合约漏洞进行分析并形成利用 Ubuntu18.04操作机 python3 薅羊毛攻击指使用多个不同的新账户来调用空投函数获得空投币并转账至攻击者账户以达到财富累计的一种攻击方式。这类攻击方

    2024年02月04日
    浏览(42)
  • [区块链安全-CTF Protocol]区块链智能合约安全实战(已完结)

    这次是尝试CTF-PROTOCOL的题目,望与诸君共勉。后面应该会参考DeFiHackLabs推出对一些列攻击的POC手写和解析,同时还要参加Hackathon。大家一起努力! 题目分析: HiddenKittyCat 合约中,核心部分为: 可以知道kitty存储的位置是由 keccak256(abi.encodePacked(block.timestamp, blockhash(block.number

    2024年02月15日
    浏览(32)
  • 【信息安全案例】——网络攻击分析(学习笔记)

    📖 前言:随着信息技术的发展,网络空间的斗争可谓是兵家必争之地,网络攻击的事件层出不穷。道高一尺魔高一丈,了解常见的网络攻击类型有利于我们日后工作生活的安全稳定。 🔎 记一次Vulnstack靶场内网渗透(二) 🕤 1.2.1 欺骗攻击 利用TCP/IP协议本身的一些缺陷对

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包