- RUNVM指令漏洞导致子虚拟机耗尽gas时造成库损坏,使父虚拟机的库处于清除状态,尽管继续执行。
- TonBit通过概念验证测试展示了漏洞,显示RUNVM执行后由于库被清空,XLOAD操作失败。
- 作为TON的主要安全保证提供商,TonBit遵循负责任的披露实践,并已向TON基金会提交了缓解计划。
TonBit安全研究人员发现了TON虚拟机RUNVM指令中的关键非原子状态转换漏洞,当子虚拟机耗尽gas时会破坏库完整性,可能导致依赖系统的合约失败。
**合作社论内容,由TonBit提供。所表达的观点不代表CoinRank。非财务建议。
TonBit在BitsLab旗下,再次在TON虚拟机(TVM)代码中发现了一个"定时炸弹"——RUNVM指令中的非原子状态转换漏洞。攻击者可以在子虚拟机耗尽gas的瞬间破坏父虚拟机的库,并引发后续调用失败,最终导致依赖库完整性的合约异常运行。下文保留了原始技术细节,以展示完整的发现和验证过程,帮助开发者深入了解问题并提高对类似风险的认识。
以下是漏洞的详细描述:
TVM中的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》。











