Movement 已合并 Aptos Core 中的一项关键错误修复,解决了 Move VM 值编解码器中枚举 (RuntimeVariants) 值的非对称性。该问题允许序列化悄悄接受反序列化稍后会拒绝的超出范围的 variant 标签,导致危险的序列化/反序列化不匹配。
问题
RuntimeVariants 值携带一个 u16 variant 标签。当值针对不描述其标签的布局进行序列化时(例如,在枚举升级引入 variant 之前缓存的布局),生成的字节会在反序列化期间被拒绝。这种非对称性可能导致状态卡死(资源可以写入但无法读回)或导致区块级故障。
具体的间隙是零字段范围外标签:带有非空有效负载的标签已被现有字段计数检查捕获,但零字段标签通过并无声地序列化为有效的 variant,与有效的 unit variant 无区别。
修复方案
seanyoung 编写的 PR #411 更新了序列化以拒绝范围外的 variant 标签,确保编解码器的两部分相互一致。测试包括单元测试,验证零字段范围外标签(3、4、100、u16::MAX)无法序列化,而真正的 unit variant 仍能正常往返。端到端测试确认修复可以正确处理枚举升级和 variant 变更,即使在同一个区块中执行。
这项修复增强了 Movement 网络核心 VM 的韧性,消除了微妙但可能具有灾难性的序列化漏洞。
