2025年5月22日,Sui上最大的集中流动性DEX Cetus Protocol遭遇了灾难性的漏洞攻击,导致多个池子的流动性被耗尽,估计损失高达2.23亿美元。此次事件是2025年最大的一起DeFi黑客攻击事件,凸显了智能合约安全方面的关键漏洞,尤其是在定点数算术方面。
此次攻击源于一个自定义的溢出防护函数checked_shlw()中的一个缺陷。由于常量和比较不正确,该函数在执行用于定点u256算术的左移操作之前未能检测到不安全的情况。这种疏忽使得在关键的delta计算(例如,确定给定流动性所需的代币输入)过程中,最高位被静默截断。通过精心操纵流动性大小和tick/价格范围设置等参数,攻击者可以欺骗协议计算出仅需1个单位代币的存款,同时为其头寸赋予巨量的流动性。一旦这个膨胀的头寸在链上记录下来,攻击者就可以移除流动性并提取真实的储备金,从而耗尽池子。
理解集中流动性与定点数算术
Cetus Protocol采用集中流动性做市商(CLMM)设计,这是一种复杂的方法,流动性提供者(LP)仅在选定的价格范围(tick间隔)内提供资产。与传统上均匀分配流动性的AMM不同,CLMM允许LP将资金集中在特定的下限和上限之间。这种设计显著提高了资本效率,但却使得在以下两者之间进行转换严重依赖于精确的定点数算术:
- 计入头寸的流动性数量。
- 必须存入或可以提取的实际代币数量。
当用户添加流动性时,协议根据当前价格和所选范围计算代币的delta(所需的底层代币数量)。反之,当移除流动性时,反向计算确定头寸应获得的资产数量。
Cetus事件中的核心漏洞利用了这种复杂的关联:如果“您必须存入多少”的计算可以被操纵得太小,而头寸仍然被计入大量流动性,那么攻击者就可以稍后移除这些计入的流动性,从而提取池子中的真实储备金。这凸显了DeFi协议中涉及复杂数学运算的一个常见攻击向量。
关键的u256移位漏洞
此次大规模DeFi黑客攻击的根本原因在于一个旨在安全执行左移操作的辅助函数中的一个bug,左移是定点u256算术中的常见操作(通常是<< 64,以应用2^64的缩放因子)。在像Sui这样的基于Move的系统中,溢出检查并非在所有操作中都统一强制执行,这使得位移操作的手动保障至关重要。
Cetus实现了一个溢出防护辅助函数checked_shlw(),用于验证将u256值左移64位是否会超出256位的边界。然而,由于常量和比较不正确,对于某些应该被拒绝的大输入,这种关键检查可能被绕过。
具体来说,负责计算两种价格(sqrt_price_0和sqrt_price_1)之间提供流动性所需的底层代币(Token A)数量的get_delta_a函数会调用checked_shlw()。checked_shlw()在此的目的是确保Token A计算中的分子在移位时不会溢出。
缺陷在于checked_shlw()的溢出检查,它使用了一个掩码0xffffffffffffffff << 192(相当于2^256 - 2^192)。这个掩码远大于正确的阈值。因此,一个大于2^192但小于此错误掩码的输入值可以通过检查,尽管将其左移确实会超出u256的范围。随后的左移操作导致了静默截断,生成了一个不正确且显著减小的值。
下图说明了易受攻击的实现与已修补版本之间的区别。正确的边界应该是1 << 192,而不是远大于此的0xffffffffffffffff << 192。攻击者巧妙地利用了这一有缺陷的检查,在存入极少量代币(例如,1 wei的Token A)的同时,铸造了异常大量的LP代币。

Cetus DeFi黑客攻击的剖析
尽管攻击者在多个池子中应用了相同的技术,但底层攻击流程保持一致。让我们分析一个具体的交易,以了解这次复杂的区块链安全漏洞所涉及的步骤。
1. 使用闪电贷操纵池子价格
攻击始于攻击者利用闪电贷迅速获得了10,024,321.28 haSUI。然后,他们兑换出5,765,124.79 SUI,故意将池子价格从18,956,530,795,606,879,104 降低到18,425,720,184,762,886。这种战略性的价格变动至关重要,因为它允许攻击者开设一个CLMM头寸,该头寸仅需要极少量的其中一种代币,从而利用了集中流动性设计固有的“单边/近乎单边代币”流动性行为。

2. 以“几乎免费”的存款添加流动性
接下来,攻击者选择了一个非常狭窄的tick范围(例如,300000–300200),并精确调整了目标流动性。在CLMM系统中,代币delta的计算高度依赖于范围边界处的平方根价格,狭窄的范围可能会使某些中间值对微小变化极其敏感。
通过仔细调整这些参数,攻击者导致内部乘法产生了一个u256中间值。当左移时,该值本应溢出,但它成功通过了存在缺陷的checked_shlw()保护。作为不安全移位引起的截断的直接后果,协议将所需的Token A数量计算为1个单位,同时铸造并记录了该头寸巨量的流动性(即,10,365,647,984,364,446,732,462,244,378,333,008)。

3. 移除流动性以提取真实储备金
一旦在链上拥有了一个错误地显示为具有膨胀流动性的头寸,攻击者就继续移除流动性并提取资产,就好像该头寸已得到充分资助一样。这一关键步骤是池子真实储备金被系统性耗尽的地方,导致了高达2.23亿美元的损失。
4. 在多个池子中重复操作
成功验证了攻击的原始手法后,攻击者在多个池子中复制了相同的流程,迅速累积了总损失,并执行了迄今为止规模最大的DeFi黑客攻击之一。
Web3最佳安全审计服务
在上线前验证设计、代码和业务逻辑
关键教训和区块链安全经验
Cetus事件再次提醒我们,区块链安全,尤其是在复杂的DeFi协议中,面临着错综复杂的挑战。根本原因在于定点数算术路径中u256左移操作周围存在一个有缺陷的溢出检查。这使得溢出移位能够静默截断高位比特,导致所需存款看起来接近于零,但仍然向LP头寸赋予了巨量流动性,最终实现了储备金的提取。
智能合约安全方面的经验教训:
- 算术的严格性: 在处理定点数算术中的移位、缩放因子、舍入和边界条件时,务必极其严格。这些是关键漏洞的常见来源。
- 已验证的原始函数: 优先使用已验证的安全数学原始函数或形式化不变量,而不是开发临时辅助函数。如果需要自定义辅助函数,请务必极其仔细地验证其常量和阈值。
- 全面测试: 实现广泛的边缘情况和基于属性的测试,以覆盖最大值、边界tick和对抗性参数组合。这种主动方法可以在部署前发现细微的缺陷。
- 持续监控: 即使有可靠的审计,实时监控解决方案仍然至关重要。像BlockSec的Phalcon Security这样的工具可以检测可疑的链上活动和潜在的攻击,提供重要的最后一道防线。
Cetus事件强调了多层次区块链安全方法的重要性,结合细致的代码审查、先进的测试方法和持续的链上监控,以防范复杂的DeFi黑客攻击。
参考
关于BlockSec
BlockSec是一家全栈式区块链安全和加密合规提供商。我们构建产品和服务,帮助客户在协议和平台的整个生命周期中进行代码审计(包括智能合约、区块链和钱包)、实时拦截攻击、分析事件、追踪非法资金,并满足AML/CFT义务。
BlockSec已在顶级会议上发表了多篇区块链安全论文,报告了多个DeFi应用的零日攻击,阻止了多次黑客攻击挽回了超过2000万美元的损失,并保护了数十亿美元的加密货币。
- 官方网站:https://blocksec.com/
- 官方Twitter账号:https://twitter.com/BlockSecTeam



