原创 Beosin Beosin 2025年05月29日 14:52 中国香港

近期,Sui生态最大的去中心化交易所Cetus Protocol因安全漏洞被攻击,导致超过2.2亿美元从流动性池中抽走,多个Sui生态代币价格暴跌。Beosin安全团队对该事件进行了漏洞分析和资金追踪,并将结果分享如下:

攻击步骤

以其中一笔攻击交易 (https://suivision.xyz/txblock/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x?tab=Overview) 为例,简化的攻击步骤如下:

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业务正确性,从而避免类似情况的发生。

Beosin作为全球最早一批从事形式化验证的区块链安全公司,主打”安全+合规“全生态业务,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控与阻断、被盗追回、虚拟资产反洗钱(AML)以及符合各地监管要求的合规评估等“一站式”区块链合规产品+安全服务。欢迎点击公众号留言框,与我们联系。