BSC生态系闪电贷攻击第九起! Impossible Finance 被骇流程分析
BSC 生态系的 DeFi 协议 Impossible Finance 遭遇闪电贷攻击。是自五月以来,BSC 生态系统中发生的第九起闪电贷攻击事件。带您了解这次闪电贷攻击的分析与手法。前情提要:BSC上闪电贷攻击再现!BurgerSwap 被骇技术分析 我竟骗了我自己?事件背景: 被误解的闪电贷:我只是一个工具5月DeFi安全事件25起、BSC占15起
binance交易所据慢雾区消息,币安智能链BSC DeFi 项目 Impossible Finance 遭遇闪电贷攻击。慢雾安全团队第一时间介入分析,并将结果分享如下:
攻击细节分析
Impossible Finance 的 DEX 架构参考了 Uniswap v2,但在 Pair 的实现上有所不同。
Impossible Pair 分别实现了cheapSwap 与 swap 两个接口。cheapSwap 函数限制了只由 Router 合约可进行调用,swap 函数则是任意用户都可调用进行代币兑换操作。
本次攻击事件的根本原因正是出在这种特殊的代币兑换架构上,接下来我们对此次攻击进行具体分析:
首先攻击者利用闪电贷从 PancakeSwap 中借出大量 WBNB,并最终将其兑换成 IF Impossible Finance 代币 。
随后攻击者创建了一个由自己控制的代币 AAA BBB,并与上一步骤中获得的 IF 代币添加流动性。
之后攻击者通过 Router 传入自定的兑换路径AAA gt IF gt BUSD 将 AAA 代币兑换成 BUSD 代币,而问题正是出现在此兑换过程中。通过链上记录我们可以很容易的发现攻击者在将 AAA 代币兑换成 IF 代币的过程中进行了两次兑换操作:
为什么在一次兑换过程中会进行两次兑换操作呢?
通过分析具体的内部调用流程我们可以发现,攻击者在 Router 合约调用 AAA 合约的 transferFrom 函数将 AAA 代币转入 Pair 合约的过程中,同时调用了一次 Pair 合约的 swap 函数即在 transferFrom 函数实现了正常转帐与swap 调用的逻辑。然后再通过项目设计预期的 cheapSwap 再进行一次正常的代币兑换操作。
通过以上分析我们可以知道攻击者在一次代币兑换过程中分别通过调用 swap 函数与 cheapSwap 函数进行两次代币兑换操作,最终收到了额外的 BUSD 代币。那么既然是进行兑换操作,理论上每次兑换操作都将导致 K 值的变化,最终使得用户无法获得预期的代币。
但通过分析 Impossible Pair 的 swap 函数与 cheapSwap 函数的具体逻辑,我们发现一个惊人的情况:在 swap 函数中进行了 K 值检查,而在 cheapSwap 函数却未进行 K 值检查而直接进行了 update 操作。这就导致了攻击者进行了多次兑换操作获得了额外的 BUSD。