7月2日事后分析:82.3 BTC 得到保护,攻击失败
7月2日,攻击者利用 Alkanes 索引器中的共识层级漏洞伪造了约 147 万枚幻影 DIESEL,抽干了 DIESEL/frBTC 池,并试图将 82.3 frBTC 解包为 BTC。攻击失败了。
摘要
7月2日,攻击者利用 Alkanes 索引器中的共识层级漏洞伪造了约 147 万枚幻影 DIESEL,抽干了 DIESEL/frBTC 池,并试图将 82.3 frBTC 解包为 BTC。
SUBFROST 的自动化签名层阻止了这次解包。没有任何 BTC 离开协议。没有任何资金损失。DIESEL 合约本身从未被攻破,其真实供应量也从未改变。
底层漏洞已被识别并修复,协议在检测到问题约 10 小时后完全恢复运行。
事件经过,逐步还原
7月2日,Alkanes 和 SUBFROST 挺过了一次严重的攻击尝试,而这并非靠运气。系统正是为这种场景设计了分层防御。以下是事件的完整经过。
在区块 956,326,攻击者在 Alkanes 上部署了一个自定义合约,并执行了一笔交易,利用了已部署索引器(v2.2.0-rc.8)中的一个状态一致性漏洞。该漏洞(下文将详述)允许他们复制代币余额。通过在单笔交易内级联约 24 次翻倍,他们将自己的 DIESEL 余额膨胀到约 147 万枚 DIESEL,超过了约 66.3 万枚全部合法供应量的两倍。
在继续之前,有两点至关重要。
第一:这是资产负债表复制,而非铸造。 DIESEL 合约本身从未被触碰。其总供应量端点始终保持正确,稳定在每区块 3.125 DIESEL。攻击者创造的是索引器账目中的幻影条目,而非 DIESEL 合约发行的真实代币。这一区别对于恢复的方式有着极其重大的意义,下文将解释。
第二:伪造的余额只有在能够转换为真实 BTC 时才有用。 而这正是攻击失败的地方。
攻击者将幻影 DIESEL 卖入 DIESEL/frBTC 流动性池,“带走”了 82.3 frBTC。随后他们试图通过 SUBFROST 将这些 frBTC 解包为原生 BTC,尝试了两次。
两次解包都被阻止。SUBFROST 框架不会盲目地满足解包请求。自动化安全机制标记了该活动并拒绝签名。这 82.3 BTC 从未移动。 这一切完全是自动化的,事实上,我们的核心团队在整个事件期间都在睡觉。
响应与恢复
在东部时间上午约 7:30,我们的团队采取了以下步骤。
- 出于预防,禁用了 frBTC→BTC 解包。这意味着无论链上状态如何,都没有 BTC 能离开系统。攻击者的解包此前已被阻止。
- 进行根本原因分析,识别出被利用的通胀漏洞——共识层级的漏洞。
- 使用自包含的概念验证(PoC)针对已部署版本确定性地复现了该漏洞。
- 编写并验证了修复方案,然后将漏洞 PoC 转换为永久的回归测试。
- 在事件开始约 10 小时后,协议再次恢复运行。
恢复的原理如下。修复后的索引器(v2.2.1)从区块 956,325 开始重放 Alkanes 索引,这是攻击者合约存在之前的最后一个干净区块。
在修正后的执行规则下,攻击者的交易根本不再复制任何东西。幻影 DIESEL 在重放的历史中从未成形。
随后我们验证攻击者的合约余额为零,且持有的 DIESEL 总量与真实供应量一致。接着我们通过现有的升级机制部署,以便每个运营者都收敛到对索引的相同解读。
没有索引器重组。没有回滚任何人的合法活动。只是对同一条链的修正解读。
技术细节
我们相信完全透明,因此以下是该漏洞过去的确切工作原理。
在消息处理期间,protorune 索引器在两个地方跟踪余额。
- 一个原子键值存储,它是事务性的,具有检查点/回滚语义。如果某条消息失败,其写入将被撤销。
- 一个内存余额映射,它不是事务性的。回滚不会触及它。
当一条消息结算时,索引器将传出代币逐个按代币 ID 升序记入该内存映射,并在过程中改变状态。如果任何单笔记账发生溢出,循环会在中途报错退出,将失败之前已应用的每笔记账留在内存映射中。
攻击者的交易产生了一张含两个代币的传出清单:一个低 ID 代币 V(DIESEL),价值为 x,以及攻击者自己的一个高 ID 代币 C 的一个单位,其在目标地址的余额已被预先加载到最大可能值(u128::MAX)。按 ID 顺序遍历清单:
V:x首先被记账并写入内存映射。C:1溢出了预加载的最大值,因此操作报错。- 错误路径回滚了原子 KV 存储,恢复了合约原始的
V余额,但V的内存记账幸存了下来,因为该映射在回滚触及范围之外。 - 区块处理完成,内存映射(包括幻影记账在内)被提交为规范状态。
最终结果:V 现在存在两份。合约拿回了它的 x,而目标输出持有一份重复的 x。重复该原语,余额每轮翻倍。攻击者在单笔交易中串联了约 24 次翻倍。
修复方案使记账操作变为全有或全无。第一遍在任何变更之前用检查算术验证每一次加法,只有在此之后第二遍才应用它们。溢出现在会在任何部分记账存在之前被捕获,因此回滚会让两个存储保持一致。
这对 DIESEL 持有者意味着什么
我们知道许多用户持有 DIESEL,也知道一次“针对 DIESEL”的攻击听起来令人担忧。所以让我们说清楚。
- DIESEL 合约从未被攻破。 其发行时间表(每区块 3.125)和总供应量始终正确。
- 恢复之后幻影 DIESEL 不复存在。 因为这是索引器账目损坏而非真实代币,所以修复方式是索引重放,而非代币干预。
- DIESEL 的规则、供应量或你的持仓没有任何改变。
系统为何挺住了
值得再次强调,为什么这份事后分析描述的是一次失败的攻击,而非一次损失。
SUBFROST 签名环独立地拒绝将欺诈性获取的 frBTC 转换为真实 BTC。即便索引被攻破,真实资金也有自己的关卡,而那道关卡守住了。
我们早在 2019 年就开始构建这套架构,并采用了此前一些最顶尖团队的最强安全机制。
这套架构的运作完全符合预期,而在7月2日,它在真实炮火下运作——在主网上,赌注是 82.3 BTC(500 万美元以上)。
结语
协议无法选择是否被攻击。它们只能选择自己准备得有多充分。
7月2日,Alkanes 和 SUBFROST 经受了真实对手的考验,以真实 BTC 为赌注,而答案是:没有损失一个聪,根本原因在数小时内被修复,而且最终诞生了一个更强大的协议。
比特币 DeFi 必须被要求达到比以往更高的标准。这就是那个标准在实践中的样子:透明、快速、可验证。你可以自己检查修复内容并运行回归测试。
我们哪儿也不去。
Gabe
SUBFROST 首席执行官