Platypus Finance 遭受了一次闪电贷攻击,损失约 200 万美元。攻击者利用闪电贷和操纵滑点计算的方法,通过改变各种交易对中资产的价格来获利。根本原因是滑点计算存在缺陷,在负债和现金余额被不同程度操纵时,滑点不再对称,从而被攻击者利用。
NEVILLE GRECH
Platypus Finance Hack:该平台遭到一次闪电贷攻击,导致约 200 万美元的损失。这次复杂的攻击利用闪电贷,并结合一些策略来改变各种交换中的滑点计算,从而操纵交换资产的价格,使攻击者受益。
在 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 和借贷协议的关键特性:
现在我们已经了解了这些功能,在本节中,我们将讨论如何计算价格。
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!