首页 > 其他分享 >【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约

【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约

时间:2024-07-15 21:53:42浏览次数:17  
标签:分析 函数 DoughFina 漏洞 参数 memory multiTokenSwapData flashloanVars ConnectorDeleverag

背景介绍

2024 年 7 月 12 日,DoughFina 协议遭受了黑客攻击,造成本次攻击的主要原因是 ConnectorDeleverageParaswap 合约没有对输入参数进行检查,且该合约为 DSA 合约的 owner。攻击者可以构造恶意参数窃取 DSA 合约的资金。

攻击交易
https://app.blocksec.com/explorer/tx/eth/0x92cdcc732eebf47200ea56123716e337f6ef7d5ad714a2295794fdc6031ebb2e

相关合约

  • DSA(被攻击地址):0x534a
    在 AAVE V3 上质押了 596 WETH,借出了 938566 USDC
  • 攻击合约:0x11a8
  • ConnectorDeleverageParaswap:0x9f54e8eaa9658316bb8006e03fff1cb191aafbe6
    通过闪电贷协助 DSA 降低在 AAVE V3 上的杠杆。

攻击交易分析

这个章节我们先尝试从 trace 来定位漏洞的位置。

通过对这笔交易进行一个大概的观察,如下图所示,攻击者在发起攻击之前,先利用闪电贷的资金帮 0x534a 归还了他的借款 938566 USDC,其他部分都是常规的操作,其中需要深入调查的就是 0x11a8 调用 ConnectorDeleverageParaswap.flashloanReq 函数的过程。

image

ConnectorDeleverageParaswap.flashloanReq 函数

image

我们看到在 ConnectorDeleverageParaswap.flashloanReq 函数中,会调用 POOL.flashLoan

POOL.flashLoan 执行一个常规的闪电贷流程

  1. ConnectorDeleverageParaswap 合约从闪电贷获取 5 USDC
  2. 调用 ConnectorDeleverageParaswap.executeOperation 函数
  3. 归还 5.025 USDC
  4. handleRepayment

image

继续跟进到 ConnectorDeleverageParaswap.executeOperation 函数,可以看到它对传入的参数进行解析后直接调用 deloopInOneOrMultipleTransactions 函数

image

deloopInOneOrMultipleTransactions 函数进行分析

function deloopInOneOrMultipleTransactions(bool opt, address _dsaAddress, address[] memory assets, uint256[] memory amounts, uint256[] memory premiums, address[] memory collateralTokens, uint256[] memory collateralAmounts, bytes[] memory multiTokenSwapData) private {
    // Repay all flashloan assets or withdraw all collaterals
    // 使用闪电贷获得的资金来偿还用户在 Aave 上的债务。
    repayAllDebtAssetsWithFlashLoan(opt, _dsaAddress, assets, amounts);

    // Extract all collaterals
    // 从用户的 DSA 中提取指定数量的抵押品。
    extractAllCollaterals(_dsaAddress, collateralTokens, collateralAmounts);

    // Deloop all collaterals
    // 使用 Paraswap 将提取的抵押品换成债务代币
    deloopAllCollaterals(multiTokenSwapData);

    // Repay all flashloan assets or withdraw all collaterals
    // 偿还闪电贷,然后将剩余的资金存回 Aave 或转移到金库
    repayFlashloansAndTransferToTreasury(opt, _dsaAddress, assets, amounts, premiums);
}

不过在查看 ConnectorDeleverageParaswap.executeOperation 函数的执行 trace 时,发现 Phalcon 把调用的四个函数混在一起了不好分辨。

image

根据转移的金额确定攻击发生的位置,猜测这笔 WETH 的转账与漏洞的利用有关。

image

所以通过单步调试的方式来检查发生了什么。
执行到 ConnectorDeleverageParaswap.deloopAllCollaterals 函数中时,对传入的 multiTokenSwapData 参数进行解析,得到对应的参数: flashloanVars.srcToken, flashloanVars.destToken, flashloanVars.srcAmount, flashloanVars.destAmount, flashloanVars.paraSwapContract, flashloanVars.tokenTransferProxy, flashloanVars.paraswapCallData

其中 paraSwapContract(out4)对应的地址为 WETH 的合约地址(0xc02a),而不是进行 swap 的合约地址。

image

当执行到 paraSwapContract.call 部分的函数时,由于 paraSwapContract 的地址已被替换为 WETH9 的地址,且 paraswapCallData 为攻击者构造的转账 calldata,所以实际执行的是 WETH 的转账操作

function deloopAllCollaterals(bytes[] memory multiTokenSwapData) private {
    FlashloanVars memory flashloanVars;

    for (uint i = 0; i < multiTokenSwapData.length;) {
        // Deloop
        (flashloanVars.srcToken, flashloanVars.destToken, flashloanVars.srcAmount, flashloanVars.destAmount, flashloanVars.paraSwapContract, flashloanVars.tokenTransferProxy, flashloanVars.paraswapCallData) = _getParaswapData(multiTokenSwapData[i]);

        // using ParaSwap
        IERC20(flashloanVars.srcToken).safeIncreaseAllowance(flashloanVars.tokenTransferProxy, flashloanVars.srcAmount);
        (flashloanVars.sent, ) = flashloanVars.paraSwapContract.call(flashloanVars.paraswapCallData);
        if (!flashloanVars.sent) revert CustomError("ParaSwap deloop failed");

        unchecked { i++; }
    }
}

deloopInOneOrMultipleTransactions 函数分析

已经定位到了漏洞发生的位置,接下来就根据 trace 分析 deloopInOneOrMultipleTransactions 函数对四个函数的调用情况

  1. repayAllDebtAssetsWithFlashLoan

    替 0x11a8 账户归还 5 USDC 的借款
    image

  2. extractAllCollaterals

    传入空数组,跳过这函数的逻辑

    image

  3. deloopAllCollaterals

    由于没有进行参数检查,攻击者在这个函数中构造了两个恶意的调用来获利。

    image

    1. 第一个 for 循环:调用 0x534a.executeAction 把 5 USDC 兑换成 596 WETH,并且 approve 给 ConnectorDeleverageParaswap 合约

      image

    2. 第二个 for 循环:把 596 WETH 转移到攻击者控制的 0x11a8 地址

      image

  4. repayFlashloansAndTransferToTreasury

    提供 0.9 USDC 给 0x11a8 的 AAVE 账户
    image

攻击流程分析

本次攻击是围绕降低 0x11a8 账户在 AAVE V3 上的杠杆而展开的,由于这个函数没有对传入的参数进行检查,所以攻击者构造了恶意的 multiTokenSwapData 参数在 deloopAllCollaterals 函数中对 0x534a 的 AVVE 资金进行转移。

攻击者构造恶意的 data 参数,解析出恶意的 multiTokenSwapData 参数
image

恶意的 multiTokenSwapData 参数传入到 deloopAllCollaterals 函数中
image

恶意的 multiTokenSwapData 参数解析出恶意的 paraSwapContractparaswapCallData,导致了任意执行。
image

后记

第一次分析这个类型的攻击事件,感觉攻击事件还是得多分析,多积累积累经验,扩展自己的视野。好好看好好学吧,之前对项目类型的接触和理解上都有很大的局限,还是需要多接触一下目前经典的、热门的项目有利于提高自己的水平,跟上市场的步伐。继续干呗,这事儿只能靠慢慢积累起来的。

标签:分析,函数,DoughFina,漏洞,参数,memory,multiTokenSwapData,flashloanVars,ConnectorDeleverag
From: https://www.cnblogs.com/ACaiGarden/p/18304048

相关文章

  • 内存管理-19-vmlinux.lds.S分析
    基于msm-5.4一、简介链接器主要任务是将符号引用解析到符号定义上,将多个目标文件(.o)和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。这个链接脚本在Linux内核里就是vmlinux.lds.S文件。vmlinux.lds.S编译后会在out/target目录......
  • 全面分析构造函数(1)
    什么是构造函数             构造函数是在创建类对象时,由系统自动调用,初始化新对象的函数,给其中的成员变量赋值。构造函数没有返回值,名字与类名相同,有参数,所以可以进行函数重载,构造函数大致可以分为一下几类:无参构造:没有参数的构造函数,也是默认构造函数有参......
  • 博客园被百度搜索降权一事的来龙去脉分析 —— 百度减少收录cnblogs博文
    相关事情:蜘蛛的依旧疯狂与园子的新畅想:尝试放出被屏蔽的百度蜘蛛网段再次尝试放出被屏蔽的百度蜘蛛网段面对百度的无期徒刑,幸好还有微软的必应百度搜索引擎是国内搜索引擎的一哥,平时素来霸道,到时也是对谁都霸道的那种。cnblogs虽然是技术博客中的顶流,但是由于没有很好的......
  • 如何使用格点数据分析中国霜冻灾害变化技术应用
    霜冻是一种短历时的农业气象灾害,它是由于日最低气温下降,使植物茎、叶处温度下降到0℃以下,导致正在生长的植物受到冻伤的现象。霜冻出现的早晚会对农作物产量产生显著影响。单站的数据很难在区域范围应用,本课将展示直接利用格点数据进行霜冻灾害分析的主要步骤。白老师,长期从事......
  • kotlin标准函数let apply等分析
    在kotlin中,在standard.kt中定义了一些标准的方法,这里对这些方法进行挨个的阅读TODO方法这方法比较简单,就是直接抛出一个异常,这里有一个inline关键字,定义的是一个内联方法,内联方法的意思是调用时整个方法的代码一起替换过去,下面是TODO方法的源码publicinlinefunTODO(......
  • 学习总结:数据分析方法(侧重于解决实际问题)
    目录一、战略与组织SWOT分析PEST分析BSC平衡计分卡波特五力模型BCG矩阵GE矩阵二、质量与生产TPMTQM六西格玛OPTPDCAAUDIT法(汽车行业)三、营销服务STP分析4Ps普销组合SPIN销售法安索夫矩阵推销方格理论哈夫模型四、财务管理z-SCORE模型ABC成本法杜邦分......
  • 全球石英振荡器行业现状、重点企业分析及项目可行性研究报告(2024-2030)
    2024年7月15日环洋市场咨询机构出版了一份详细的、综合性的调研分析报告【全球石英振荡器行业总体规模、主要厂商及IPO上市调研报告,2024-2030】。本报告研究全球石英振荡器总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析石英振荡器市场主要驱动......
  • 化妆品OEM和ODM行业发展前景分析及市场趋势研究报告
    2024年7月15日GlobalInfoResearc调研机构发布了《全球化妆品OEM和ODM行业总体规模、主要厂商及IPO上市调研报告,2024-2030》。本报告研究全球化妆品OEM和ODM总体规模,主要地区规模,主要企业规模和份额,主要产品分类规模,下游主要应用规模等。统计维度包括收入和市场份额等。不仅......
  • 聚类分析 数模打卡
    聚类分析1.聚类任务无监督学习:通过对无标记训练样本的学习来揭示数据的内在性质及规律。聚类:把数据集中的样本划分为若干互斥子集,每个子集称一个簇cluster。两个基本问题:性能度量与距离计算。2.性能度量vslidityindex.作为判断和优化目标。外部指标:将聚类结果与某......
  • 基于小波分析的糖尿病视网膜病变检测(Python)
    fromscipyimportmiscfromPILimportImagefromskimageimportexposurefromsklearnimportsvmimportscipyfrommathimportsqrt,pifromnumpyimportexpfrommatplotlibimportpyplotaspltimportnumpyasnpimportglobimportmatplotlib.pyplotas......