2023 年 11 月 23 日,因为 Tick 操纵和流动性重复计数,KyberSwap 在以太坊、Arbitrum 等多个网络上受到黑客攻击,攻击者已获利约 4800 万美元。
SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、攻击交易分析
这次攻击事件比较复杂,攻击实现也比较巧妙,我们选择其中一笔攻击交易进行详细分析和说明。
攻击交易:
0x09a3a12d58b0bb80e33e3fb8e282728551dc430c65d1e520fe0009ec519d75e8
攻击者地址:
0x50275E0B7261559cE1644014d4b78D4AA63BE836
攻击者合约:
0xaF2Acf3D4ab78e4c702256D214a3189A874CDC13
在这次交易中,攻击者针对 3 个不同的流动性池进行一系列操作用来耗尽池中的资金。我们选择了一个池进行攻击流程分析,这些池彼此独立存在。
攻击流程:
1.攻击者先是通过闪电贷贷了 10, 000 枚 wstETH,随后将约 2, 998 枚 wstETH 添加进池子里,swap 出来约 2, 842 枚 WETH;
2.此时池子里对应的 Tick 状态为-110, 910 ,wstETH 的价格从 1.05 ETH 变为 0.000015257 。此时池子的流动性为 0 ,为接下来制造虚假的流动性做铺垫;
3.攻击者在[ 0.000014659 , 0.000015260 ]范围中添加 3.4 wstETH 流动性,并且移除 0.56 wstETH;
4.接下来,攻击者进行两次 swap,分别是 WETH->wstETH、wstETH->WETH。第一次 swap 后,将价格压至 0.000014657 ,比 0.000014659 稍微低点。第二次 swap 后,将价格抬高至 0.000016368 ;
5.一开始是池子里有约为 3 wstETH 流动性(mint 3.4 wstETH - burn 0.56 wstETH),现在池子里约为(1, 056 + 3, 911)枚,显然更多;
6.攻击归还闪电贷后,并且从攻击合约转走资金
二、漏洞原因分析
本次攻击事件根本原因:在 computeSwapStep 函数中,计算 Tick 时存在精度损失。由于 Tick 可被操纵,成功绕过了_updateLiquidityAndCrossTick 函数,因而可以反复增加流动性。
1.在第一次 swap 中,攻击者利用 calcReachAmount 函数计算 wstETH 数量,最后计算得出 1, 056.056735638220800000 ;
2.调用 estimateIncrementalLiquidity 和 calcFinalPrice 函数后,传入的数量为 1, 056.056735638220799999 。经过 round up 和 round down 处理后,此时 Tick 为-111311 ,而下限 Tick 为 -111310 。因此,通过 nextTick = currentTick+ 1 ,并使用“!=”对两个 sqrtP 参数进行判断,成功绕过了_updateLiquidityAndCrossTick 函数,避免了流动性的更新;
3.在第二次 swap 时候,调用了_updateLiquidityAndCrossTick,增加了流动性。由于第一次 swap 时数量计算发生精度损失,导致流动性未更新移除,从而导致第二次计算流动性时出现双倍的情况。
三、安全建议
针对这次的攻击事件,开发人员在日常开发中应采取以下安全措施:
1.注意正确计算业务中的不变量和数学逻辑,避免精度损失。
2.项目发版前,需要与第三方专业的审计团队合作,进行合约审计。
About Us
SharkTeam 的愿景是保护Web3世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约底层理论。提供包括链上大数据分析、链上风险预警、智能合约审计、加密资产追讨等服务,并打造了链上大数据分析和风险预警平台 ChainAegis,平台支持无限层级的深度图分析,能有效对抗Web3世界的高级持续性攻击(Advanced Persistent Threat,APT)风险。已与Web3生态各领域的关键参与者,如 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、ChainIDE 等建立长期合作关系。
官网:https://www.sharkteam.org
Twitter:https://twitter.com/sharkteamorg
Discord:https://discord.gg/jGH9xXCjDZ
Telegram:https://t.me/sharkteamorg