freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

SharkTeam:KyberSwap攻击事件原理分析
2023-11-27 15:59:26

2023年11月23日,因为Tick操纵和流动性重复计数,KyberSwap在以太坊、Arbitrum等多个网络上受到黑客攻击,攻击者已获利约4800万美元。

20231127153705798image.png

SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。

一、攻击交易分析

这次攻击事件比较复杂,攻击实现也比较巧妙,我们选择其中一笔攻击交易进行详细分析和说明。

攻击交易:

0x09a3a12d58b0bb80e33e3fb8e282728551dc430c65d1e520fe0009ec519d75e8

攻击者地址:

0x50275E0B7261559cE1644014d4b78D4AA63BE836

攻击者合约:

0xaF2Acf3D4ab78e4c702256D214a3189A874CDC13

在这次交易中,攻击者针对3个不同的流动性池进行一系列操作用来耗尽池中的资金。我们选择了一个池进行攻击流程分析,这些池彼此独立存在。

攻击流程:

1.攻击者先是通过闪电贷贷了10,000枚wstETH,随后将约2,998 枚wstETH添加进池子里,swap出来约 2,842枚WETH;

1701071860_65644bf4a8119f266b4e9.png!small

2.此时池子里对应的Tick状态为-110,910,wstETH 的价格从1.05 ETH 变为0.000015257。此时池子的流动性为0,为接下来制造虚假的流动性做铺垫;

1701071864_65644bf83174553f04b0e.png!small

3.攻击者在[0.000014659,0.000015260]范围中添加3.4 wstETH流动性,并且移除0.56 wstETH;

1701071868_65644bfc5bba23500d4d5.png!small

1701071873_65644c014574bc75cbbc0.png!small

1701071876_65644c04e4d3b5b24d47f.png!small

4.接下来,攻击者进行两次swap,分别是WETH->wstETH、wstETH->WETH。第一次swap后,将价格压至0.000014657,比0.000014659稍微低点。第二次swap后,将价格抬高至0.000016368;

1701071883_65644c0b11d70ef8bae4b.png!small

1701071886_65644c0e74b6601a6c97a.png!small

5.一开始是池子里有约为3 wstETH流动性(mint3.4 wstETH - burn0.56 wstETH),现在池子里约为(1,056 + 3,911)枚,显然更多;

6.攻击归还闪电贷后,并且从攻击合约转走资金

1701071891_65644c1329dcf88897118.png!small

二、漏洞原因分析

本次攻击事件根本原因:在computeSwapStep函数中,计算Tick时存在精度损失。由于Tick可被操纵,成功绕过了_updateLiquidityAndCrossTick函数,因而可以反复增加流动性。

1.在第一次swap中,攻击者利用calcReachAmount函数计算wstETH 数量,最后计算得出1,056.056735638220800000;

1701071900_65644c1cdf73013786028.png!small

1701071904_65644c203914b2848f407.png!small

1701071907_65644c23c08fdd6bac1c7.png!small

2.调用estimateIncrementalLiquidity和calcFinalPrice函数后,传入的数量为1,056.056735638220799999。经过round up和round down处理后,此时Tick为-111311,而下限Tick为 -111310。因此,通过nextTick = currentTick+1,并使用“!=”对两个sqrtP参数进行判断,成功绕过了_updateLiquidityAndCrossTick函数,避免了流动性的更新;

1701071911_65644c27bd56433b3a546.png!small

1701071915_65644c2b1d20430088460.png!small

1701071918_65644c2e871918b8f15b7.png!small

3.在第二次swap时候,调用了_updateLiquidityAndCrossTick,增加了流动性。由于第一次swap时数量计算发生精度损失,导致流动性未更新移除,从而导致第二次计算流动性时出现双倍的情况。

1701071922_65644c321f24fe0c11a80.png!small

三、安全建议

针对这次的攻击事件,开发人员在日常开发中应采取以下安全措施:

1.注意正确计算业务中的不变量和数学逻辑,避免精度损失。

2.项目发版前,需要与第三方专业的审计团队合作,进行合约审计。

# 系统安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录