BitsLab 旗下 TonBit 发现 TON VM 核心漏洞:漏洞根本原因以及缓解措施详细阐述
近期,TON 网络的虚拟机系统迎来了一次重大Safety升级。BitsLab 旗下的Safety团队 TonBit 成功发现并协助修复了一个可能导致 TON 虚拟机资源耗尽的核心漏洞。这一漏洞利用虚拟机在处理 Continuation 嵌套时的递归机制,可能被恶意contract滥用,造成系统崩溃和网络不稳定。
如果该漏洞被恶意利用,不需要消耗一个 TON,就可能让所有验证节点宕机,直接威胁网络的可用性。在此次事件中,TonBit 凭借其出色的技术能力快速定位漏洞,并通过调整虚拟机的内部控制流机制,提出了以迭代替代递归的创新解决方案,成功为 TON 用户打造了一个更加Safety的生态环境。TON 官方团队在其最新的更新公告中特别致谢 TonBit 对生态Safety的卓越贡献。
在以下这份详细的安全报告中,我们将深入剖析此次漏洞的成因、技术细节及解决方案。报告详细描述了漏洞如何利用 Continuation 的深度嵌套构建触发资源耗尽攻击的递归链条,以及恶意contract如何通过扩展调用栈来耗尽主机的栈空间。同时,我们还将介绍 TonBit 团队如何通过消除递归链条的设计缺陷,改用协作迭代机制,协助彻底解决这一问题。此次修复不仅显著提升了 TON 网络的稳定性,还为Blockchain行业的底层安全提供了重要参考。
案例研究:TON VM中的DoS漏洞及相关缓解措施
Introduction
本报告描述了TON虚拟机中的一个 DoS(拒绝服务)漏洞以及解决该问题的缓解措施。该漏洞是由于虚拟机在contract执行过程中处理Continuation嵌套的方式引起的。该漏洞允许恶意合约通过创建Continuation,并以特定方式进行深度嵌套,从而在评估过程中触发深层递归,耗尽主机的栈空间并使虚拟机停止运行。为了缓解该问题,虚拟机对Continuation和控制流的处理进行了修改。现在,虚拟机不再通过Continuation链进行顺序尾调用,而是主动迭代链条。这种方法确保了只使用恒定的主机栈空间,防止栈溢出。
summary
根据官方文档,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,会得到一个类似这样的调用栈:
可以看出,栈空间与嵌套级别(即迭代次数)呈线性依赖关系,这表明可能会导致栈空间耗尽。
关于在实际环境中的利用
在实际的Blockchain中,燃料费限制使得恶意合约的构建相当困难。由于嵌套过程的线性复杂性(TVM设计有效地防止了通过自引用进行更廉价的构建),开发出实际可行的恶意合约并非易事。具体来说,一层嵌套会生成一个调用序列,在调试二进制文件中消耗三个主机栈帧(320字节),而在发布二进制文件中消耗两个(256字节,后两个调用内联为一个)。对于运行在现代POSIX操作系统上的验证节点,默认栈大小为8MiB,这足以支持发布二进制文件中超过30,000层的嵌套。尽管仍然可以构建一个能够耗尽栈空间的合约,但这比上一节的示例要困难得多。
缓解措施
该补丁修改了在Continuation嵌套情况下跳转的行为。我们可以看到Continuation跳转的签名发生了变化。
以 UntilCont为例,其他部分为简洁起见省略。
不再调用 VmState::jump来跳转到下一个Continuation,这意味着在每个Continuation上递归执行三重跳转并等待返回值向后传播。现在,Continuation跳转仅解析Continuation的下一级,然后将控制权交还给虚拟机。
虚拟机通过协作的方式迭代解析每一层级的 continuation,直到遇到一个 NullRef,表明链的解析已完成(如在 OrdCont或 ExuQuitCont中实现)。在这一迭代过程中,主机栈上始终只分配一个 continuation 跳转,从而保证栈的使用保持恒定。
in conclusion
对于需要高可用性的服务,递归的使用可能成为潜在的攻击向量。在涉及用户定义的逻辑时,强制递归终止可能具有挑战性。此DoS漏洞展示了在资源受限情况下(或其他限制条件下)正常功能被意外滥用的极端案例。如果递归依赖于用户输入,类似问题可能会发生,这Xiaobai Navigation在虚拟机的控制流原语中十分常见。
本报告详细分析了 TON 虚拟机中存在的核心 DoS 漏洞的技术细节、根本原因及其可能的攻击方式,同时展示了 TonBit 团队提出的高效解决方案。通过将虚拟机的递归跳转机制调整为迭代处理,TonBit 成功提出了修复漏洞的解决方案,协助修复了这一可能导致网络瘫痪的核心漏洞,为 TON 生态提供了更加稳健的安全保障。本次事件不仅体现了 TonBit 在Blockchain底层技术安全领域的深厚积累,也展现了其作为 TON 官方 Security Assurance Provider (SAP)的重要角色。
作为 TON 生态不可或缺的安全合作伙伴,TonBit 始终在保护Blockchain网络稳定性和用户资产安全方面走在行业前沿。从漏洞发现到解决方案设计,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
The article comes from the Internet:BitsLab 旗下 TonBit 发现 TON VM 核心漏洞:漏洞根本原因以及缓解措施详细阐述
related suggestion: AI Meme 的尽头是神秘学?一文速览神秘学 Meme $THE 的由来
怎么什么角度都有!? 作者:小白导航 coderworld AI Meme 的狂潮让人觉得熟悉的牛市又回来了,虽然只聚焦在 AI Meme 这一个概念上。 今天除了概念龙头小白导航 $goat 突破新高,$flavia 成为今日板块明星之外,还出现了一个相对特…