2、建设恶意的代币合约 AAA(BBB),并在 Impossible 中添加了 AAA 代币与 IF 代币活动性。
进攻流程
通过以上阐明我们可以知道进攻者在一次代币兑换进程中别离通过挪用 swap 函数与 cheapSwap 函数举办两次代币兑换操纵,最终收到了特另外 BUSD 代币。那么既然是举办兑换操纵,理论上每次兑换操纵都将导致 K 值的变革,最终使得用户无法得到预期的代币。
本次进攻的焦点在于 cheapSwap 函数中未举办 K 值查抄,导致进攻者可以通过在一次兑换进程中举办多次兑换操纵以得到特另外代币。慢雾安详团队发起 DeFi 协议在参考其他项目标基本长举办创新的进程中应该充实的对其新的模子举办查抄验证以制止此类安详变乱的产生。
通过阐明详细的内部挪用流程我们可以发明,进攻者在 Router 合约挪用 AAA 合约的 transferFrom 函数将 AAA 代币转入 Pair 合约的进程中,同时挪用了一次 Pair 合约的 swap 函数 (即在 transferFrom 函数实现了正常转账与 swap 挪用的逻辑)。然后再通过项目设计预期的 cheapSwap 再举办一次正常的代币兑换操纵。
之后进攻者通过 Router 传入自定的兑换路径 (AAA -> IF -> BUSD) 将 AAA 代币兑换成 BUSD 代币,而问题正是呈此刻此兑换进程中。通过链上记录我们可以很容易的发明进攻者在将 AAA 代币兑换成 IF 代币的进程中举办了两次兑换操纵:
https://bscscan.com/tx/0x0220704a99ddfb982d26e65cc337f26b77dc057930b7aa1d848cc48ec77984a8
首先进攻者操作闪电贷从 PancakeSwap 中借出大量 WBNB,,并最终将其兑换成 IF (Impossible Finance 代币) 。
为什么在一次兑换进程中会举办两次兑换操纵呢?
参考生意业务:
1、进攻者先通过 PancakeSwap 闪电贷借出 WBNB,并将 WBNB 兑换成 IF 代币。
但通过阐明 Impossible Pair 的 swap 函数与 cheapSwap 函数的详细逻辑,我们发明一个惊人的环境:在 swap 函数中举办了 K 值查抄,而在 cheapSwap 函数却未举办 K 值查抄而直接举办了 update 操纵。这就导致了进攻者举办了多次兑换操纵得到了特另外 BUSD。
4、之后反复以上操纵举办赢利。
随后进攻者建设了一个由本身节制的代币 AAA (BBB),并与上一步调中得到的 IF 代币添加活动性。
进攻细节阐明
总结
3、通过 AAA -> IF -> BUSD 路径举办 AAA 代币到 BUSD 代币的兑换,并在 AAA 代币转入 Pair 合约兑换成 IF 代币的进程中举办了一次 IF 代币与 BUSD 的兑换操纵,随后再举办正常的 cheapSwap 操纵。最终得到了特另外 BUSD 代币。
Impossible Finance 的 DEX 架构参考了 Uniswap v2,但在 Pair 的实现上有所差异。Impossible Pair 别离实现了 cheapSwap 与 swap 两个接口。cheapSwap 函数限制了只由 Router 合约可举办挪用,swap 函数则是任意用户都可挪用举办代币兑换操纵。本次进攻事件的基础原因正是出在这种非凡的代币兑换架构上,接下来我们对此次进攻举办详细阐明:
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。