近期,TON 网络的虚拟机系统迎来了一次重大安全升级。BitsLab 旗下的安全团队 TonBit 成功发现并协助修复了一个可能导致 TON 虚拟机资源耗尽的核心漏洞。这一漏洞利用虚拟机在处理 Continuation 嵌套时的递归机制,可能被恶意合约滥用,造成系统崩溃和网络不稳定。
如果该漏洞被恶意利用,不需要消耗一个 TON,就可能让所有验证节点宕机,直接威胁网络的可用性。在此次事件中,TonBit 凭借其出色的技术能力快速定位漏洞,并通过调整虚拟机的内部控制流机制,提出了以迭代替代递归的创新解决方案,成功为 TON 用户打造了一个更加安全的生态环境。TON 官方团队在其最新的更新公告中特别致谢 TonBit 对生态安全的卓越贡献。
在以下这份详细的安全报告中,我们将深入剖析此次漏洞的成因、技术细节及解决方案。报告详细描述了漏洞如何利用 Continuation 的深度嵌套构建触发资源耗尽攻击的递归链条,以及恶意合约如何通过扩展调用栈来耗尽主机的栈空间。同时,我们还将介绍 TonBit 团队如何通过消除递归链条的设计缺陷,改用协作迭代机制,协助彻底解决这一问题。此次修复不仅显著提升了 TON 网络的稳定性,还为区块链行业的底层安全提供了重要参考。
案例研究:TON VM中的DoS漏洞及相关缓解措施
简介
本报告描述了TON虚拟机中的一个 DoS(拒绝服务)漏洞以及解决该问题的缓解措施。该漏洞是由于虚拟机在合约执行过程中处理Continuation嵌套的方式引起的。该漏洞允许恶意合约通过创建Continuation,并以特定方式进行深度嵌套,从而在评估过程中触发深层递归,耗尽主机的栈空间并使虚拟机停止运行。为了缓解该问题,虚拟机对Continuation和控制流的处理进行了修改。现在,虚拟机不再通过Continuation链进行顺序尾调用,而是主动迭代链条。这种方法确保了只使用恒定的主机栈空间,防止栈溢出。
概要
根据官方文档,TON VM是一个基于栈的虚拟机,采用Continuation-Passing Style(CPS,Continuation传递风格)作为其控制流机制,用于内部流程和智能合约。控制流寄存器对合约是可访问的,从而提供了灵活性。
TVM中的Continuation理论上可以分为三类:
-
OrdCont(即vmc_std),包含需要执行的TON ASM片段,是TVM中的一级对象。合约可以在运行时显式创建它们并传递,以实现任意的控制流。
-
非普通Continuation(Extraordinary continuations),通常包含OrdCont作为组件,通过显式迭代原语和特殊隐式操作创建,用于处理相应的控制流机制。
-
额外的ArgContExt,封装其他Continuation以保存控制数据。
在合约执行过程中,虚拟机进入主循环,每次解码合约片段的一个字,并将相应的操作分派到合适的处理程序。普通处理程序在执行相应操作后立即返回。
相对而言,迭代指令会使用提供的Continuation作为组件创建一个非普通Continuation,并在适当的上下文中跳转到非普通Continuation。非普通Continuation本身在跳转时实现逻辑,并根据条件跳转到某个组件。例如,使用WHILE指令时,我们可以在图1中演示这一过程(省略了可能的跳出)。
图1:非普通Continuation逻辑
根本原因
在存在漏洞的虚拟机版本中,这些跳转会导致连续的动态尾调用,这要求主机栈为每次跳转维护一个栈帧(如图2所示)。
以WhileCont为例,其他部分为简洁起见省略。
图2:三重跳转递归以深入嵌套
理想情况下,这不会构成问题,因为组件通常表示为OrdCont,其跳转只会保存当前上下文,然后指示虚拟机执行它所持有的片段,先于剩余的合约片段执行,并不会引入更多递归。然而,非普通Continuation在理论上设计允许其组件通过TVM中的cc(c0)寄存器(即上文的set_c0分支)访问。因此,合约可以滥用此功能来执行深度递归(稍后描述)。相比于更改此常规功能的实现,直接在非普通Continuation的跳转过程中消除递归更为清晰且容易。
通过反复使用已获得的非普通Continuation来构建上一级的非普通Continuation,可以通过迭代创建一个深度嵌套的Continuation。这些深度嵌套的Continuation在评估时,可能会耗尽主机的可用栈空间,导致操作系统发出SIGSEGV信号并终止虚拟机进程。
图3提供了嵌套过程的概念验证(PoC)。
图3:嵌套过程
我们看到每次迭代中,主体都扩展了一个WhileCont{chkcond=true}。通过执行上一次迭代中生成并保存的cc,会得到一个类似这样的调用栈:
可以看出,栈空间与嵌套级别(即迭代次数)呈线性依赖关系,这表明可能会导致栈空间耗尽。
关于在实际环境中的利用
在实际的区块链中,燃料费限制使得恶意合约的构建相当困难。由于嵌套过程的线性复杂性(TVM设计有效地防止了通过自引用进行更廉价的构建),开发出实际可行的恶意合约并非易事。具体来说,一层嵌套会生成一个调用序列,在调试二进制文件中消耗三个主机栈帧(320字节),而在发布二进制文件中消耗两个(256字节,后两个调用内联为一个)。对于运行在现代POSIX操作系统上的验证节点,默认栈大小为8MiB,这足以支持发布二进制文件中超过30,000层的嵌套。尽管仍然可以构建一个能够耗尽栈空间的合约,但这比上一节的示例要困难得多。
缓解措施
该补丁修改了在Continuation嵌套情况下跳转的行为。我们可以看到Continuation跳转的签名发生了变化。
以 UntilCont为例,其他部分为简洁起见省略。
不再调用 VmState::jump来跳转到下一个Continuation,这意味着在每个Continuation上递归执行三重跳转并等待返回值向后传播。现在,Continuation跳转仅解析Continuation的下一级,然后将控制权交还给虚拟机。
虚拟机通过协作的方式迭代解析每一层级的 continuation,直到遇到一个 NullRef,表明链的解析已完成(如在 OrdCont或 ExuQuitCont中实现)。在这一迭代过程中,主机栈上始终只分配一个 continuation 跳转,从而保证栈的使用保持恒定。
结论
对于需要高可用性的服务,递归的使用可能成为潜在的攻击向量。在涉及用户定义的逻辑时,强制递归终止可能具有挑战性。此DoS漏洞展示了在资源受限情况下(或其他限制条件下)正常功能被意外滥用的极端案例。如果递归依赖于用户输入,类似问题可能会发生,这在虚拟机的控制流原语中十分常见。
本报告详细分析了 TON 虚拟机中存在的核心 DoS 漏洞的技术细节、根本原因及其可能的攻击方式,同时展示了 TonBit 团队提出的高效解决方案。通过将虚拟机的递归跳转机制调整为迭代处理,TonBit 成功提出了修复漏洞的解决方案,协助修复了这一可能导致网络瘫痪的核心漏洞,为 TON 生态提供了更加稳健的安全保障。本次事件不仅体现了 TonBit 在区块链底层技术安全领域的深厚积累,也展现了其作为 TON 官方 Security Assurance Provider (SAP)的重要角色。
作为 TON 生态不可或缺的安全合作伙伴,TonBit 始终在保护区块链网络稳定性和用户资产安全方面走在行业前沿。从漏洞发现到解决方案设计,TonBit 凭借其强大的技术能力和对区块链发展的深刻理解,为 TON 网络的长期发展奠定了坚实基础。同时,TonBit 团队也在网络安全架构、用户数据保护以及区块链应用场景的安全性提升等领域持续发力。未来,TonBit 将继续以创新驱动安全技术进步,为 TON 生态以及整个区块链行业的健康发展提供源源不断的支持和保障。这次漏洞发现以及协助修复工作获得了 TON 官方的高度认可,进一步巩固了 TonBit 在区块链安全领域的行业地位,也展现了其对推动去中心化生态发展的坚定承诺。
TonBit 官网:https://www.tonbit.xyz/
TonBit 官方Twitter:https://x.com/tonbit_
Telegram:https://t.me/BitsLabHQ
Linkedin: https://www.linkedin.com/company/tonbit-team/
Blog: https://www.tonbit.xyz/#blogs
Telegram 审计需求联系:@starchou
免责声明:本文提供的信息不是交易建议。BlockWeeks.com不对根据本文提供的信息所做的任何投资承担责任。我们强烈建议在做出任何投资决策之前进行独立研究或咨询合格的专业人士。