SharkTeam:KyberSwap攻击事件原理分析
字数 1533 2025-08-10 08:28:09
KyberSwap攻击事件技术分析与防范指南
事件概述
2023年11月23日,KyberSwap在以太坊、Arbitrum等多个网络上遭受黑客攻击,攻击者获利约4800万美元。攻击的根本原因是Tick操纵和流动性重复计数漏洞。
攻击交易分析
攻击交易哈希: 0x09a3a12d58b0bb80e33e3fb8e282728551dc430c65d1e520fe0009ec519d75e8
攻击者地址: 0x50275E0B7261559cE1644014d4b78D4AA63BE836
攻击者合约: 0xaF2Acf3D4ab78e4c702256D214a3189A874CDC13
攻击流程详解
-
初始准备阶段:
- 攻击者通过闪电贷借入10,000枚wstETH
- 将约2,998枚wstETH添加进流动性池
- 通过swap操作取出约2,842枚WETH
-
池子状态操纵:
- 操作后池子Tick状态变为-110,910
- wstETH价格从1.05 ETH暴跌至0.000015257
- 此时池子流动性被清空(为0)
-
虚假流动性设置:
- 在价格范围[0.000014659,0.000015260]内添加3.4 wstETH流动性
- 随后移除0.56 wstETH流动性
-
关键swap操作:
- 第一次swap: WETH→wstETH,将价格压低至0.000014657
- 第二次swap: wstETH→WETH,将价格抬高至0.000016368
- 流动性异常增加: 从约3 wstETH变为(1,056 + 3,911)枚
-
获利阶段:
- 归还闪电贷
- 将资金从攻击合约转出
漏洞技术原理
根本原因
computeSwapStep函数中计算Tick时存在精度损失,导致攻击者能够:
- 绕过
_updateLiquidityAndCrossTick函数的检查 - 实现流动性的重复计数
详细漏洞分析
-
第一次swap中的计算问题:
calcReachAmount函数计算出wstETH数量为1,056.056735638220800000- 经过
estimateIncrementalLiquidity和calcFinalPrice处理后,传入数量变为1,056.056735638220799999 - 由于精度损失,Tick计算为-111311,而实际下限Tick为-111310
-
绕过流动性更新机制:
- 通过
nextTick = currentTick+1和"!="比较两个sqrtP参数 - 成功绕过
_updateLiquidityAndCrossTick函数 - 导致流动性未被正确更新和移除
- 通过
-
流动性重复计数:
- 第二次swap调用
_updateLiquidityAndCrossTick时 - 由于第一次swap未正确更新流动性状态
- 导致流动性被错误地双倍计算
- 第二次swap调用
安全防范建议
-
数学计算安全:
- 特别注意业务逻辑中的不变量计算
- 避免精度损失问题,特别是在涉及小数和舍入操作时
- 对关键数学运算进行多重验证
-
代码审计:
- 项目发布前必须进行专业第三方审计
- 特别关注状态更新和边界条件处理
- 对价格计算和流动性管理功能进行重点检查
-
合约设计改进:
- 实现更严格的Tick边界检查
- 增加状态变更的验证机制
- 考虑引入防操纵机制,如时间加权平均价格(TWAP)
-
监控与响应:
- 建立异常交易监控系统
- 对闪电贷和大额交易设置警报阈值
- 准备应急响应方案,包括暂停机制
总结
KyberSwap攻击事件展示了DeFi协议中数学计算精度和状态管理的重要性。开发者在设计类似系统时,必须特别注意价格计算、流动性管理和状态更新的准确性,避免因微小计算误差导致重大安全漏洞。