BitsLab 的 TonBit 再次发现 TON 虚拟机漏洞:RUNVM 指令可能污染智能合约执行环境

本文为机器翻译
展示原文
  • RUNVM指令漏洞导致子虚拟机耗尽gas时造成库损坏,使父虚拟机的库处于清除状态,尽管继续执行。
  • TonBit通过概念验证测试展示了漏洞,显示RUNVM执行后由于库被清空,XLOAD操作失败。
  • 作为TON的主要安全保证提供商,TonBit遵循负责任的披露实践,并已向TON基金会提交了缓解计划。

TonBit安全研究人员发现了TON虚拟机RUNVM指令中的关键非原子状态转换漏洞,当子虚拟机耗尽gas时会破坏库完整性,可能导致依赖系统的合约失败。


**合作社论内容,由TonBit提供。所表达的观点不代表CoinRank。非财务建议。

TonBit在BitsLab旗下,再次在TON虚拟机(TVM)代码中发现了一个"定时炸弹"——RUNVM指令中的非原子状态转换漏洞。攻击者可以在子虚拟机耗尽gas的瞬间破坏父虚拟机的库,并引发后续调用失败,最终导致依赖库完整性的合约异常运行。下文保留了原始技术细节,以展示完整的发现和验证过程,帮助开发者深入了解问题并提高对类似风险的认识。

BitsLab的TonBit再次发现TON虚拟机漏洞:RUNVM指令可能污染智能合约执行环境

以下是漏洞的详细描述:

TVM中的RUNVM指令可以污染调用者的状态并使库变得不可用。

RUNVM指令代码中出现新的漏洞。它允许污染调用者的状态。相关代码片段如下:

RUNVM指令代码中的新漏洞,允许污染调用者状态的代码片段

上面的代码负责启动子虚拟机。它将当前VmState中的"log"和"libraries"移动到新的VmState对象"new_state"中,然后用"new_state"替换当前VmState。

问题在于这个操作并非真正原子化。在执行"*this = std::move(new_state);"语句之前,虚拟机可能已耗尽gas并在"new_state"替换当前状态之前停止进程。因此,"libraries"可能已被移出,使子虚拟机的库处于清除(移动)状态。

由于RUNVM指令提供了isolate_gas参数来隔离子虚拟机和父虚拟机之间的gas消耗,这就创造了以下场景:

即使子虚拟机触发gas耗尽异常,父虚拟机仍然保留足够的gas继续执行。然而,依赖"libraries"的后续操作将失败,因为子虚拟机已在失败的状态转换期间移动/清除了库。这导致某些假设库完整性的合约出现意外行为。

概念验证:

我们实施了以下测试用例来证明这一漏洞:

概念验证

概念验证

概念验证

测试的关键修改:

为了便于本地观察库状态,我们修改了NOP指令以强制注册库条目:

测试的关键修改

重现步骤:

将此测试用例添加到crypto/test/vm.cpp

运行test-vm可执行文件

观察XLOAD执行期间由于库为空的异常。

预期行为:

NOP执行后:库包含1个条目

RUNVMX执行后,尽管父虚拟机继续,但库变为空

XLOAD失败并出现异常

这证明了非原子状态转换与gas隔离相结合,创造了违反执行上下文完整性的不一致状态。

这一发现再次突显了TonBit(BitsLab的子公司)在TON生态系统安全研究方面的深厚专业知识。我们已立即向TON基金会提交技术细节和缓解方案,并协助完成修复。我们建议所有开发者在官方补丁发布后立即更新其依赖库;同时,在自定义合约中加入更严格的库完整性检查和gas管理逻辑,以防止类似问题被恶意利用。BitsLab将继续坚持"负责任披露"原则,并与社区一起加强Web3安全防线。

关于TONBIT

TonBit是BitsLab的核心子品牌,是TON生态系统中值得信赖的安全专家和早期建设者。作为TON区块链的主要安全保证提供商(SAP),TonBit专门进行全面的安全审计,包括Tact和FunC语言审计,确保TON上构建的项目的完整性和弹性。经TON官方认可,TonBit已成功审计了众多知名项目,如Catizen、Algebra、UTonic、Ton Batch Sender、TonUp、PixelSwap、Tradoor、Miniton、Thunder Finance等近20个TON项目,展示了其在保护基于TON的解决方案方面的专业expertise。

BitsLab的TonBit再次发现TON虚拟机漏洞:RUNVM指令可能污染智能合约执行环境〉这篇文章最早发布于《CoinRank》。

来源
免责声明:以上内容仅为作者观点,不代表Followin的任何立场,不构成与Followin相关的任何投资建议。
喜欢
收藏
评论