币圈子(120bTc.coM):日前震惊币圈的Cetus协议2.2亿美元被盗案,引起各界讨论。资安团队慢雾也发布了整起事件的完整报告,慢雾团队表示本次攻击展现了数学溢位漏洞的威力。攻击者透过精确计算选择特定参数,利用checked_shlw函数的缺陷,以1个代币的成本获得价值数十亿的流动性。这是一次极为精密的数学攻击,并建议开发人员在智能合约开发中严格验证所有数学函数的边界条件。
慢雾:事件核心是溢出检查的漏洞
慢雾团队表示这次事件的核心是攻击者透过精心建构参数,使溢位发生但又能绕过侦测,最终以极小的代币金额即可换取巨额流动性资产。与先前@neeksec的分析一致。
攻击者首先透过闪电贷借出1,002万枚haSUI,迅速使haSUI/SUI的池中价格暴跌99.9%。接着在tick值300000~300200的区间添加流动性,这个价格区间仅1%的区间宽度。
接着就是事件的关键漏洞,攻击者声称加入巨量流动性(超过10的27次方),但由于checked_shlw函数的编码错误,合约仅向其收取1枚haSUI。
计算所需流动性公式(来源:慢雾科技)
慢雾分析攻击者之所以能够用1个代币换出巨额流动性。其核心原因在于get_delta_a函数中的checked_shlw存在溢出检查出现漏洞。攻击者正是利用了这一点,使得系统在计算实际需要添加多少haSUI时出现了严重偏差。由于溢出未被侦测,系统误判了所需haSUI的数量,导致攻击者仅需极少的Token,就能兑换出大量的流动性资产。
任何小于0xffffffffffffffff<<192的输入值都会绕过溢出检查。然而,当这些值被左移64位元时,结果会超出u256的表示范围,此时高位元资料被截断,导致得到的结果远小于理论值。这样一来,系统在后续计算中就会低估所需的haSUI数量。
出现问题的代码(来源:慢雾科技)
攻击者分三次移除流动性,共获得2,004万枚haSUI与超过576万枚SUI。最后攻击者归还闪电贷,最终净获利逾2.3亿美元。
Cetus已修复代码
事后Cetus修复了代码,包含:
将0xffffffffffffffff<<192修正为正确的阈值1<<192。
将判断条件从n>mask修正为n>=mask。
确保当左移64位元可能导致溢出时,能正确侦测并传回溢出标志。
修复后的checked_shlw函数(来源:慢雾科技)
慢雾团队:开发者应严格验证所有数学函数的边界条件
慢雾表示攻击者在两天前就准备好gasfee了,在攻击前还有一次尝试,但失败了。目前攻击者的Sui地址资金已被冻结,EVM地址也被慢雾加入黑名单进行追踪。
慢雾团队表示本次攻击展现了数学溢位漏洞的威力。攻击者透过精确计算选择特定参数,利用checked_shlw函数的缺陷,以1个代币的成本获得价值数十亿的流动性。这是一次极为精密的数学攻击,慢雾安全团队建议开发人员在智能合约开发中严格验证所有数学函数的边界条件。