Platypus Finance Hack Analyze

在 Avalanche 上有个 Platypus 的DeFi项目在 Oct-12-2023 03:29:49 AM +UTC 又被黑了,涉及金额超过 130K 个 AAVE【预估金额在 1M 个USDT以上】, 本地将会分析其中的分析原理。

涉及项目

WAVAX

Wrapped AVAX (WAVAX) 和 WETH 类似,是一个基础的原生以太转ERC20的协议,不属于任何项目方。 向合约里质押原生 AAVE 会 mint 出对应的 代币,可以在各种更加通用 的协议里使用。

sAVAX

Staked AVAX (sAVAX)  是 BENQI 开发的一个代币质押协议,一个往合约里质押原生AVAX, 可以立即获得一定的 sAVAX 代币。

Pool SAvax

Platypus Pool SAvaxPlatypus Finance 推出的一个 DeFi 协议,具有 Swap 功能。是本次攻击的主要目标。

LP-AVAX

Platypus Pool SAvax 推出的关于 Wrapped AVAX (WAVAX) 的一个流动性质押Token。上面的 Swap 池子有绑定这个Token。

LP-sAVAX

Platypus Pool SAvax 推出的关于 Staked AVAX (sAVAX)  的一个流动性质押Token。上面的 Swap 池子有绑定这个Token。

Aave Pool V3

Aave Pool V3 是 AAVE 的一个借贷池子,有提供闪电贷的功能,手续费0.05%。AAVE相关的池子都是几百万以上。

攻击流程

分析一下黑客操作的流程

  1. 使用AAVE 的闪电贷 借出 1100000 个WAVAX 与 991589 个sAVAX

  2. 将 1100000个Token 存入 Platypus Pool SAvax

  3. 攻击者(0x0cD4fD0E)将剩下的600k SAVAX兑换为661k WAVAX

  4. 随后从被攻击合约(0xC73eeD44)中提取出801k WAVAX

  5. 攻击者(0x0cD4fD0E)调用swap函数用1.4m的WAVAX兑换了1.39m sAVAX

  6. 攻击者(0x0cD4fD0E)调用withdraw函数提取出剩余的80k WAVAX.

  7. 然后调用swap函数将剩下的700k sAVAX兑换为了991k 的WAVAX

  8. 随后提取出被攻击合约(0xA2A7EE49)中剩余的330k sAVAX

  9. 攻击者(0x0cD4fD0E)继续调用swap函数将70k sAVAX兑换为76k WAVAX

  10. 最后攻击者(0x0cD4fD0E)偿还闪电贷后仍剩下111k WAVAX和20k的sAVAX,获利离场。

从代码中可以分析出Swap合约大概的情况,

  • 流动性是个单个Token 绑定,其他比如 Uniswap 是和2个token 绑定

  • 池子有 363018 个 WAVAX 547523 个 SAVAX 兑换比例在 1:1 左右

  • Swap 时有依赖 Chainlink 预言机

  • Swap 时 Slippage 参数使用了类似 X*Y = K 单逻辑

按这个逻辑可以看出 Swap 时非常依赖LP池子的 Token 余额【cash】,整个池子大概有100W个AAVE的价值,如果从 AAVE 按照0.0005的手续费借出相同的AAVE, 只需要付 500 个 AAVE。按照黑客流程最终 Wrapped AVAX (WAVAX) 池子被套走三分之一左右的代币。

从模拟的代码中可以看出来拥有足够的筹码后,是可以直接把一个池子掏空,然后价格就会收到非常大的影响。兑换比例发生了改变 1:1 => 1:3 这个时候随便操作几下的收益是远远大于 几百个AAVE的手续费。

防范思路

Swap 方法虽然使用了外部的 Chainlink 预言机, 但是内部计算 Slippage 仍然在一个区块内使用 X * Y = K 逻辑。最终 Wrapped AVAX (WAVAX) 被套走左右。

  • 计算 Slippage 是用加权的方式,时间至少要跨一个区块。

  • 这个功能比较新,估计没有找靠谱团队审核,专业团队应该一下就能看出来问题。

参考资料

Subscribe to Leek DEV
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.