Sui 链上 DeFi 借贷协议 Scallop 在官方 X 账号(@Scallop_io)发布安全事件通知,证实平台遭到攻击。Scallop 表示,团队发现一个与 sSUI 奖励池相关的侧合约(side contract)遭到利用,造成约 15 万枚 SUI 损失。Scallop 强调,受影响合约已被冻结,核心合约仍然安全,仅 sSUI 奖励池受到波及。
在后续更新中,Scallop 进一步说明:“核心合约已解冻,所有操作已恢复。此问题与核心协议无关,仅限于一个已弃用的奖励合约。使用者存款未受影响,所有资金安全无虞,存提款功能已恢复正常。”团队承诺将分享更多细节,并持续监控与强化协议安全。
前 NEAR 核心成员 Vadim:问题出在 17 个月前的旧版套件
针对此次事件,前 NEAR 核心开发者 Vadim(@zacodil)在 X 上发表深度技术分析,揭露漏洞细节。Vadim 指出,攻击者非常清楚该调用哪一个已弃用的套件。“不是当前运行中的代码,也不是 SDK 路径,而是 2023 年 11 月的一个旧版 V2,数月来无人使用。要么这是深度逆向工程,要么就是有人早就知道该往哪里找。这个漏洞已经潜伏了 17 个月。
Vadim 解释,spool 会追踪一个随着奖励分配而增长的 index。每个用户账户在质押时,原本应该记录当下的 last_index,这样赚取的点数计算公式为:质押量 × (current_index − last_index),使用者只能从加入时起赚取奖励。
但在已弃用的 V2 套件中,当建立全新的 spool_account 时,last_index 并未被初始化,仍保持为 0。因此当 update_points 执行时,计算结果变成:点数 = 质押量 × (current_index − 0) = 质押量 × 完整历史指数。使用者被记入自 2023 年 8 月 spool 建立以来累积的所有奖励。
Vadim 提供具体数据:spool 指数在 20 个月间成长到 11.9 亿。攻击者质押 13.6 万枚 sSUI,瞬间获得 162 兆点数的记入。由于奖励池采用 1:1 兑换比例(分子与分母皆为 1),162 兆点数直接转换为价值 16.2 万枚 SUI 的奖励。但奖励池内仅有 15 万枚 SUI,因此被全数抽干。
4 月链上安全事件皆发生在周边系统
Vadim 说明,正常使用者通过 SDK 使用新套件,新套件已修复 last_index 同步问题。旧版 V2 套件之所以仍留在链上,是因为 Sui 套件具有不可变性。—一旦发布,每个旧版本都将永远可被调用。共享的 Spool 与 RewardsPool 物件接受来自任何版本的调用,攻击者绕过 SDK,直接命中旧版程式码路径。
Vadim 将此归类为“Sui 过时套件类漏洞”。他指出,正确的修复方式需要在共享物件上加入版本字段,并在每个函数中加入 assert!(version == CURRENT_VERSION) 检查。没有这个机制,每一个过去发布的套件版本都将永远是活生生的攻击面。
Vadim 进一步指出,本月多数攻击事件都不是发生在核心协议程式码,而是周边系统:
KelpDAO:RPC 基础设施
Litecoin:MWEB 隐私层
Aethir:周边转接器的存取控制
Scallop:被遗忘的旧版套件
这篇文章 Sui 链 DeFi 借贷协议 Scallop 遭骇,旧版合约漏洞致 15 万 SUI 被盗 最早出现于 链新闻 ABMedia。