Platypus Finance 被黑

  • Dedaub
  • 发布于 2023-10-13 19:14
  • 阅读 16

Platypus Finance 遭受了一次闪电贷攻击,损失约 200 万美元。攻击者利用闪电贷和操纵滑点计算的方法,通过改变各种交易对中资产的价格来获利。根本原因是滑点计算存在缺陷,在负债和现金余额被不同程度操纵时,滑点不再对称,从而被攻击者利用。

NEVILLE GRECH

Platypus Finance Hack

Platypus Finance Hack:该平台遭到一次闪电贷攻击,导致约 200 万美元的损失。这次复杂的攻击利用闪电贷,并结合一些策略来改变各种交换中的滑点计算,从而操纵交换资产的价格,使攻击者受益。

Platypus Finance Hack | 攻击总结

在 2023 年 10 月 12 日 06:32 UTC,Avalanche C-Chain 上的一个攻击者(地址:0x0cd4fd0eecd2c5ad24de7f17ae35f9db6ac51ee7 & 0x464073F659591507d9255B833D163ef1Af5ccc2C)通过在同一交易内部署的智能合约执行了多个链上交易。我们将专注于此次攻击的一个实例,其中攻击者获利约 57 万美元。执行的操作如下:

在 AAVE 上进行闪电贷

存入 1050k WAVAX

存入 316k sAVAX

将 600k sAVAX 交换为 659k WAVAX 提取 728k WAVAX

将 1200k WAVAX 交换为 1250 sAVAX

提取 34k WAVAX

将 600k sAVAX 交换为 840k WAVAX

提取 316k sAVAX

偿还 AAVE 闪电贷

请注意,存款和交换是在一种相对较新的“稳定交换”AMM (Platypus) 上执行的。

通过发生的事件以及查看整个攻击过程中执行的计算,我们相当确定这次攻击的根本原因在于被操纵的滑点计算。此外,在负债余额和现金余额以不同方式被操纵的情况下,用于计算滑点(以及交换发生的价格)的机制存在缺陷。当出现这种条件时,滑点操纵可能在交换的两个方向上对攻击者有利,从而打破了滑点是对称的这一不变量。

为了理解协议的内在机制,让我们首先回顾一下 Platypus AMM 和借贷协议的关键特性:

  1. 单边流动性供应:Platypus 允许用户仅为交易对的一侧提供流动性,而不是要求交易对中的两种代币都需要流动性。
  2. 基于账户的设计:协议不为每个代币对使用资金池,而是使用账户来记录资产和负债,从而实现更灵活和资本效率更高的系统。
  3. 覆盖率:Platypus 使用“覆盖率”作为输入参数,而不是简单地关注流动性。覆盖率定义为给定代币账户的资产 (A) 除以负债 (L)。较高的比率表示较低的违约风险。这与 Curve 的稳定交换不变量有所不同,并允许代币池基于有机需求和供应增长。
  4. 开放流动性池:该协议设计为可扩展的,允许轻松地将新代币添加到现有池中。例如,从 USDT、USDC 和 DAI 的基础开始,稍后可以添加更多代币,如 TUSD 和 FRAX。
  5. 价格预言机:Platypus 使用 Chainlink 等外部价格预言机来跟踪每种代币以美元计价的汇率。这对于维持Hook和计算交换汇率非常重要。
  6. 偿付能力风险:该协议旨在将覆盖率保持在一定水平以上,以降低违约风险。如果提款请求超过特定代币账户中的可用资产,则可能触发违约。

Platypus Finance Hack | 详细描述

现在我们已经了解了这些功能,在本节中,我们将讨论如何计算价格。

Platypus Finance Hack

Platypus 使用预言机来计算资产之间的理想价格。当资产属于同一类型(例如,包装版本与质押版本)时,这种价格预言机很容易实现。然而,在此漏洞中对价格产生重大影响的是滑点计算,这可能使攻击者受益。攻击者的目标是通过一个巧妙的技巧来放大滑点,使其对自己有利。

通常,在此协议中,存款和取款分别同时增加或减少资产(称为现金)和负债。但是,当发生提款但没有足够的现金来满足提款时,即使资产金额部分减少,总负债金额也会减少。发生这种情况时,滑点金额似乎在交换的两个方向上都被操纵为对攻击者有利。

/**
     * @notice Yellow Paper Def. 2.4 (Asset Slippage)
     * @dev Calculates -Si or -Sj (slippage from and slippage to)
     * @param k K slippage parameter in WAD
     * @param n N slippage parameter
     * @param c1 C1 slippage parameter in WAD
     * @param xThreshold xThreshold slippage parameter in WAD
     * @param cash cash position of asset in WAD
     * @param cashChange cashChange of asset in WAD
     * @param addCash true if we are adding cash, false otherwise
     * @return The result of one-sided asset slippage
     */
    function _slippage(
        uint256 k,
        uint256 n,
        uint256 c1,
        uint256 xThreshold,
        uint256 cash,
        uint256 liability,
        uint256 cashChange,
        bool addCash
    ) internal pure returns (uint256) {
        uint256 covBefore = cash.wdiv(liability);
        uint256 covAfter;
        if (addCash) {
            covAfter = (cash + cashChange).wdiv(liability);
        } else {
            covAfter = (cash - cashChange).wdiv(liability);
        }

        // if cov stays unchanged, slippage is 0
        // 如果覆盖率保持不变,则滑点为 0
        if (covBefore == covAfter) {
            return 0;
        }

        uint256 slippageBefore = _slippageFunc(k, n, c1, xThreshold, covBefore);
        uint256 slippageAfter = _slippageFunc(k, n, c1, xThreshold, covAfter);

        if (covBefore > covAfter) {
            return (slippageAfter - slippageBefore).wdiv(covBefore - covAfter);
        } else {
            return (slippageBefore - slippageAfter).wdiv(covAfter - covBefore);
        }
    }

    /**
     * @notice Yellow Paper Def. 2.5 (Swapping Slippage). Calculates 1 - (Si - Sj).
     * Uses the formula 1 + (-Si) - (-Sj), with the -Si, -Sj returned from _slippage
     * @dev Adjusted to prevent dealing with underflow of uint256
     * @param si -si slippage parameter in WAD
     * @param sj -sj slippage parameter
     * @return The result of swapping slippage (1 - Si->j)
     */
    function _swappingSlippage(uint256 si, uint256 sj) internal pure returns (uint256) {
        return WAD + si - sj;
    }

减少负债但不减少资产余额会操纵滑点

经验教训

协议的金融算法越复杂,就越难防范设计缺陷被利用。Platypus 强调了保持极低滑点和单边存款的能力,这在去中心化的方式中很难实现。Platypus Finance Hack 很难理解,但仍有办法提高此类协议的安全性。

我们可以通过多种方式来帮助类似的协议,即提高安全态势。请注意,此攻击者相对聪明,并在利用该协议时绕过了 mempool,这使得简单的 mempool 扫描技术无效。与此同时,对不同池的攻击发生在不同的交易中。如果采用像 Watchdog 这样的复杂的监控解决方案,某些 vault 本可以更快地暂停。最后,协议的金融设计和计算是罪魁祸首,聘请像我们这样的专业安全公司进行金融设计审计本可以防止这次攻击。

攻击者自己在攻击中也犯了一个错误,Platypus 团队挽救了 575 美元(这些资金已转移到 0x068e297e8ff74115c9e1c4b5b83b700fda5afdeb)。

我们祝愿 Platypus 团队好运,能够让协议重新启动并运行,并从这次严重事件中恢复过来。

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

0 条评论

请先 登录 后评论
Dedaub
Dedaub
Security audits, static analysis, realtime threat monitoring