撰文:Beosin
近期,Sui 生态最大的去中心化交易所 Cetus Protocol 因安全漏洞被攻击,导致超过 2.2 亿美元从流动性池中抽走,多个 Sui 生态代币价格暴跌。Beosin 安全团队对该事件进行了漏洞分析和资金追踪,并将结果分享如下:
攻击步骤
以其中一笔攻击交易为例,简化的攻击步骤如下:
1. 启用闪电贷:攻击者通过闪电贷借入 1000 万 haSUI。
2. 创建流动性仓位:开设一个新的流动性仓位,其价格区间为 [300000, 300200]。
3. 增加流动性:仅使用 1 个单位的 haSUI 增加了流动性,但获得了高达 10,365,647,984,364,446,732,462,244,378,333,008 的流动性值。
4. 移除流动性:立即移除多笔交易中的流动性,以耗尽流动性池。
5. 偿还闪电贷:偿还闪电贷并保留约 570 万 SUI 作为利润。
漏洞分析
本次攻击的根本原因在于 get_delta_a 函数中的 checked_shlw 实现错误,导致溢出检查失败。攻击者仅需要少量代币,就能在流动性池中兑换出大量资产,从而实现攻击。
如下图所示, checked_shlw 用于判断 u256 数左移 64 位是否会导致溢出,小于 0xffffffffffffffff << 192 的输入值会绕过溢出检测,但输入值在在左移 64 位后可能会超出 u256 最大值(溢出),而 checked_shlw 仍会输出未发生溢出(false)。这样一来,在后续计算中就会严重低估所需的代币数量。
此外,在 Move 中,整数运算的安全性旨在防止溢出和下溢,因为溢出和下溢可能导致意外行为或漏洞。具体来说:如果加法和乘法的计算结果对于整数类型来说过大,则会导致程序中止。如果除数为零,则除法中止。
而左移(<<)的独特之处在于,发生溢出时不会中止。这意味着,即使移位的位数超出了整数类型的存储容量,程序也不会终止,从而可能导致错误值或不可预测的行为。
被盗资金追踪
据分析,被盗资金中约 6200 万美元被攻击者通过跨链兑换成 Ethereum 链的 ETH,剩余 1.6 亿资金仍在 Sui 网络。Beosin Trace 对 EVM 链的被盗资金进行追踪发现:
攻击者将绝大部分资金跨链至 Ethereum 链,在 Ethereum 上用于接收跨链资金的地址为 0x89012a55cd6b88e407c9d4ae9b3425f55924919b,资金通过 CoW Swap、ParaSwap 等协议兑换为 ETH。
随后,该地址将 20,000 ETH 转入地址 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16,暂未转出。Beosin Trace 已将黑客相关地址加入黑地址库,后续将持续追踪。
总结
本次攻击的核心在于攻击者利用左移校验函数的实现错误,利用少量代币就可以从流动性池提取巨量的代币卖出获利。这本是一个非常容易发现的代码错误,但负责安全审计的公司在审计时,这类执行数值计算的库代码可能超出了其审计范围,未能发现漏洞,而项目方在进行安全测试时也未能测试到此类边缘情况。
Beosin 安全团队建议项目方应当对项目的合约代码加强审计与安全测试,特别是使用形式化验证检测 DeFi 业务正确性,从而避免类似情况的发生。
内容来源:TECHUB NEWS
财华网所刊载内容之知识产权为财华网及相关权利人专属所有或持有。未经许可,禁止进行转载、摘编、复制及建立镜像等任何使用。
如有意愿转载,请发邮件至content@finet.com.hk,获得书面确认及授权后,方可转载。
下载财华财经APP,把握投资先机
https://www.finet.com.cn/app
更多精彩内容,请点击:
财华网(https://www.finet.hk/)
财华智库网(https://www.finet.com.cn)
现代电视FINTV(http://www.fintv.hk)