Cellframe Network 因闪电贷操控池子比例遭受攻击事件分析
根据 Numen 链上监控,2023年6月1日10点7分55秒(UTC+8),Cellframe Network(@cellframenet)在 Binance Smart Chain 上因为流动性迁移过程中代币数量计算问题遭到黑客攻击。
黑客从中获利76112美元。
事件分析
黑客地址:
https://bscscan.com/address/0x2525c811ecf22fc5fcde03c67112d34e97da6079
攻击交易:
https://bscscan.com/tx/0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6
预先调用交易:https://bscscan.com/tx/0xe2d496ccc3c5fd65a55048391662b8d40ddb5952dc26c715c702ba3929158cb9
根本原因
流动性迁移中计算出现问题。
攻击流程
1. 首先,攻击者通过 DPP 的 flashloan 获得了1000个 BNB,然后利用 Pancake v3 的闪电贷功能获取了50万个 New Cell 代币。
接下来,他们将所有的 New Cell 代币换成了 BNB,导致池中的 BNB 数量接近为0。
最后,攻击者用900个 BNB 兑换成了 Old Cell 代币。
2. 需要注意的是,攻击者在攻击之前添加了 Old Cell 和 BNB 的流动性,获得 Old lp。
3. 接着,攻击者调用流动性迁移函数。此时的状态是新池子中几乎没有 BNB,老池子中几乎没有 Old Cell 代币。
迁移的过程涉及以下步骤:
首先,移除旧流动性,并将对应数量的代币返回给用户;接着,按照新池子的比例添加新的流动性。
由于旧池子中基本没有 Old Cell 代币,因此在移除流动性时获得的 BNB 数量会增加,而 Old Cell 代币的数量会减少。
Resoul 中的数值变大,Token1 的数值也变大。
用户只需添加少量的 BNB 和少量的 New Cell 代币即可获取流动性,并将多余的 BNB 和 Old Cell 代币返回给用户。
然后,重复进行迁移操作。
4. 最后,攻击者移除新池子的流动性,并将迁移返回的 Old Cell 代币兑换成 BNB。
此时,老池子中有大量的 Old Cell 代币,但没有 BNB,攻击者将 Old Cell 代币重新兑换成 BNB,从而完成盈利。
总 结
迁移流动性时应该多重考虑新池子和旧池子两种代币的数量的变化或者当前的代币价格,直接取交易对两个币种数量计算容易被操控。
此外,代码上线前应做好全面的安全审计。