背景信息
- Alert:https://x.com/TenArmorAlert/status/1968502320645177731
- TX:https://app.blocksec.com/explorer/tx/bsc/0xc2066e0dff1a8a042057387d7356ad7ced76ab90904baa1e0b5ecbc2434df8e1
Trace 分析
攻击者先从不同的地址收集资金

随后通过多个 flashloan 筹集 BUSD

最终获得约 21.1M 的 BUSD

在多层嵌套的闪电贷中定位到攻击点
- Swap1:攻击者将所有 BUSD 兑换成 NGP,并发送到 0 地址中
- Swap2:攻击者将 NGP 兑换成 BUSD,获利 2212888 BUSD

代码分析
漏洞的成因是当用户卖出 NGP 代币时,会触发价格更新机制。pair 中的 NGP 代币会被按照比例转移到 treasuryAddress 和 rewardPoolAddress 中,然后更新 pair 的价格。最终目的就是抬高 pair 里面 NGP 代币的价格。
如果 poolAmount 的大小接近于 burnAmount 的大小,执行完回购机制后 NGP 的价格将会变得很高,此时只需要少量的 NGP 就能够把 pair 中的 BUSD 全部兑换出来。

Swap1
攻击者第一次 swap 的目的是尽可能地减少 pair 中 NGP 代币的数量,为第二次 swap 的获利做准备

在这里攻击者利用了 0 地址在 whitelisted 中的特点,直接绕过了代币对购买金额和购买时间的限制。

Swap2
在 Swap2 中,攻击者触发价格更新机制,pair 中的 NGP 代币被大量转出后,pair 中 NGP 的 reverse1 数量缩小为为原来的 0.00000007 倍。

在 NGP 价格被抬高后,继续执行攻击者向 pair 的 NGP 转账操作,并以操控后的价格完成 swap,最终完成获利。

随后就是攻击者归还闪电贷,将部分获利的 BUSD 换成 BNB 后,进行资金转移。
