摘要
Platypus Finance 是 Avalanche 区块链上的一个 AMM 协议。它已经遭受过三次攻击,具体如下:
- 2023 年 2 月 17 日,由于错误的偿付能力检查,该协议遭到黑客攻击,总损失约为 905 万美元。其中,240 万美元在 BlockSec 的帮助下被追回。约 38 万代币被卡在 Aave 合约中,随后被归还。
- 2023 年 7 月 12 日,该协议遭到黑客攻击,由于忽略了稳定币之间的价差,损失约 5 万美元。
- 2023 年 10 月 12 日,该协议遭受了价格操纵攻击,损失约 220 万美元。在与攻击者协商后,90% 的被盗资金被归还。
该项目能在这些攻击中幸存下来实属幸运。我们对这三次漏洞利用事件的分析表明,如果采用了细致的审计或更积极的安全措施,这些逻辑缺陷本可以避免。
攻击一
要理解这一安全事件,必须先了解几个智能合约的工作流程。大致过程如下:
- 用户可以将代币存入资金池成为 LP,并获得 LP 代币。
- LP 代币可以质押到 MasterPlatypus 中以获得奖励。在此过程中,LP 代币将被转移到 MasterPlatypus 合约中。
- LP 代币可以用作抵押品来借入其他资产,以提高资产效率。
下图展示了这些交互关系。

漏洞分析
该漏洞存在于 MasterPlatypus 合约内名为 emergencyWithdraw 的函数中。在紧急情况下,应使用此函数来提取质押在 MasterPlatypus 合约中的 LP 代币。在该函数中,合约会检查用户是否处于 Solvent(偿付能力充足)状态,以决定是否允许提款。其逻辑检查用户是否存在坏账(即抵押品是否足以偿还债务)。如果没有坏账,用户便可以提取质押的 LP 代币。
然而,这一逻辑存在缺陷。用户处于 Solvent 状态仅意味着该用户的抵押品能够偿还其债务,但它并未检查用户在紧急提取质押代币后是否仍然保持偿付能力充足。攻击者可以利用这一缺陷借入资产,然后紧急提取质押的 LP 代币(而无需偿还债务)。详见 Immunefi 博客中的详细分析。


攻击分析
我们以一笔攻击交易为例,来展示整个攻击过程。
步骤一:从 AAVE 借入 4400 万 USDC 闪电贷

步骤二:将 4400 万 USDC 存入资金池以获得 LP-USDC

步骤三:将 LP-USDC 存入 MasterPlatypus

步骤四:使用 LP-USDC 作为抵押品借入 USP

步骤五:执行 emergencyWithdraw 函数发起攻击
攻击者在不偿还 USP 债务的情况下获得了 LP-USDC。

步骤六:从资金池中提取 LP-USDC 以获得 USDC

步骤七:卖出 USP 以获利

然而,这些利润留在了攻击合约内部。实际上,攻击者本可以为该次兑换设置一个新的接收地址来获取利润。
BlockSec 的救援行动
我们发现攻击者将利润留在了攻击合约内部。此外,攻击合约内部没有提取资产的逻辑。然而,我们在攻击合约中发现了一个漏洞,可以利用它进行反制黑客攻击,从而提取合约内的部分资产。
具体来说,闪电贷回调函数存在访问控制问题,这意味着任何人都可以调用该回调函数。这也是许多 MEV 机器人被攻击的根本原因。
此外,在该回调函数内部,攻击者合约将 USDC 代币授权给了 Platypus finance 资金池合约。而这个资金池合约是可升级的!

结合以上两点,我们可以通过以下方式救回攻击合约内部的 USDC:
- 升级 Platypus finance 资金池合约,添加一个提取合约内 USDC 的逻辑
- 调用攻击合约的回调函数,将 USDC 授权给资金池合约
- 资金池合约可以替换任何(将由攻击合约执行的)函数,从攻击合约中转出 USDC(因为攻击合约已将 USDC 授权给了资金池合约)。

另外两次攻击
有关另外两次攻击的更多详情,请参阅以下链接。
-
攻击二:2023 年 7 月 11 日,该协议假设 USDC 与 USDT 之间的比率为 1:1,这与市场波动存在偏差,导致提款逻辑存在缺陷。其中一笔攻击交易的链接。此类交易不止一笔。
-
攻击三:2023 年 10 月 12 日,由于
cash和liability被操纵,进而影响了兑换价格。[第一笔攻击交易 | 第二笔攻击交易]
总结
这三次攻击利用了该协议中不同的漏洞。尽管该协议已经过其他一些厂商的审计,攻击者仍然找到了漏洞并成功对协议实施了攻击。幸运的是,部分资产得以追回,但我们不能指望永远如此幸运。为了保护协议和用户资产的安全,应采用更多的安全措施,包括攻击监控和自动响应。
阅读本系列的其他文章:
- 引言:2023 年十大"精彩"安全事件
- #1:通过利用 Flashbots Relay 中的漏洞收割 MEV 机器人
- #2:Euler Finance 事件:2023 年最大规模的黑客攻击
- #3:KyberSwap 事件:以极其精妙的计算巧妙利用舍入误差
- #4:Curve 事件:编译器错误从无辜的源代码中生成了错误的字节码
- #6:Hundred Finance 事件:引发脆弱分叉协议中精度相关漏洞利用浪潮
- #7:ParaSpace 事件:与时间赛跑,阻止业内迄今最严重的攻击
- #8:SushiSwap 事件:一次笨拙的救援尝试引发了一系列模仿攻击
- #9:MEV 机器人 0xd61492:在一次巧妙的漏洞利用中从猎手沦为猎物
- #10:ThirdWeb 事件:可信模块之间的不兼容暴露了漏洞



