作者:TonBit
引言:
BitsLab 旗下 TonBit 再次发现 TON 虚拟机关键漏洞并获 TON 官方致谢:INMSGPARAM 指令在处理消息参数时未做空指针校验,可能导致 TON 虚拟机崩溃。
TON 官方漏洞修复以及致谢 TonBit 详情链接:
https://github.com/ton-blockchain/ton/releases/tag/v2025.06
近日,BitsLab 旗下 TonBit 在最新 TVM 源码(master 分支 / TON v2025.04)中发现了一处严重安全隐患——INMSGPARAM 指令在处理消息参数时未做空指针校验,可能导致 TON 虚拟机崩溃。此次漏洞同样深藏于 TVM 的深层调用流程中,攻击者可通过构造特殊消息参数令 VM 在执行时触发 null pointer dereference,从而造成执行中断,严重影响合约执行的可用性与稳定性。以下内容保留了技术细节,供开发者深入研判与防范。
我们在 TVM11 上线之前就发现了此漏洞,并立即向 Ton Core 报告,从而避免了该漏洞对任何链上资产造成安全风险。Ton Core 认真分析了我们的报告,在正式上线前修复了该漏洞,并向我们发放了赏金与鸣谢。我们由衷感谢 Ton Core 的专业精神和守约态度。
受影响的代码(位于 crypto/vm/tonops.cpp)如下:
根本原因:
这一行代码
Ref t = get_param(st, inmsgparams_idx).as_tuple();
未对变量 t 是否为 nullptr进行检查。若将 c7 寄存器的槽 0 配置为一个第 17 个元素不是 Tuple类型的 tuple,as_tuple() 将返回空指针。当该空指针 t 被传入 tuple_index 时,会触发空指针解引用,导致虚拟机崩溃。该严重错误可在全局版本 11 (Global Version 11)中稳定复现。
POC 代码:
为了便于本地测试(因为 global_version 通常由链配置),我们在 run_vm_code 函数中修改了虚拟机的初始化,将 global_version 强制设为 11:
将 PoC代码复制到 crypto/test/vm.cpp 文件中。
按照上述方式修改 run_vm_code,将 global_version 设置为 11。
编译并运行 test-vm 可执行文件。
崩溃:
虚拟机会因空指针解引用而崩溃:
总结来看,BitsLab 旗下的 TonBit 始终秉持“深耕安全、责任披露”的原则,持续在 TON 虚拟机核心代码中挖掘并修复关键漏洞。从 RUNVM 指令的非原子迁移隐患,到此次 INMSGPARAM 指令的空指针解引用问题,TonBit 都以专业的技术实力和高效的响应速度,第一时间向 Ton Core 提交报告并协助修复,不仅有效保障了链上资产的安全,也推动了 TVM 的稳定性与可靠性提升。未来,TonBit 将继续与 Ton Core 及社区紧密合作,共同构筑更为坚实的 Web3 安全防线。
TonBit 作为 BitsLab 的核心子品牌,是 TON 生态系统内的安全专家和早期建设者。作为 TON 区块链的主要安全保障提供商,TonBit 专注于全面的安全审计,包括 Tact 和 FunC语言的审计,确保基于 TON 的项目具备完整性和弹性。迄今为止,TonBit 已成功审计了包括 Catizen、Algebra、UTonic 等多个知名项目,并发现了多个关键漏洞,展现了我们在区块链安全领域的卓越能力。此外,TonBit 还成功举办了 TON CTF 比赛,吸引了众多参与者并收获了广泛关注,进一步巩固了其在 TON 生态中的安全专家地位。未来,TonBit 将继续为区块链安全保驾护航,推动技术和生态的持续发展。