Erik Zhang 发布 Neo N3 v3.10.2,修复多重签名见证验证绕过漏洞
要点速览
- •Neo 于 10 月 23 日发布 Neo N3 v3.10.2,这是由联合创始人 Erik Zhang 撰写的安全版本,仅包含一处逻辑修复,未加入新功能。
- •该补丁消除了由多重签名合约重载之间公钥验证不一致导致的见证验证绕过漏洞,该漏洞此前使含有畸形内容的脚本得以通过一条验证路径而被另一条路径拒绝。
- •通过.Helper.cs 的一处小改动,所有验证代码路径现在在将脚本判定为有效多重签名合约之前都会强制进行完整的密码学公钥解码。
- •该提交新增两个测试并修改一个现有测试,以确认含无效公钥的脚本会被所有验证路径拒绝,其中包括见证哈希不匹配的完整交易用例。
- •目前尚无 Neo N3 主网遭利用的确认报告,且该修复仅在运行已打补丁版本的节点上生效,因此运营方的采用是关键的下一步。

Neo 已发布 Neo N3 v3.10.2,这是一项针对性的安全补丁,修复了一个见证验证绕过漏洞——该漏洞此前允许含有畸形内容的多重签名脚本通过一条验证路径,却被另一条路径拦截。对普通用户而言,此次修复消除了无效交易可能在部分节点软件中显得有效的途径。
该版本由 Neo 联合创始人 Erik Zhang 撰写,于 10 月 23 日发布,仅包含对 Neo N3 多重签名合约验证逻辑的一处逻辑修复,未引入任何新功能。
修复内容
当交易提交至 Neo N3 网络时,协议会验证所附签名是否有效以及是否来自正确的主体。这类授权数据——即签名及附加在交易上的检查项——正是协议所称的见证(witness),也是本次补丁所加固的层面。对于多重签名合约——即要求最低数量的授权签名者批准交易、并在多方共同控制同一资金的场景中广泛使用的合约——该验证包括检查合约脚本中列出的每个公钥在密码学上是否有效。
此次补丁弥补了该检查在应用方式上的漏洞。Neo N3 的多重签名验证逻辑原本包含多条用于检查多重签名脚本的代码路径。其中一条路径会对每个公钥进行完整解码,任何不是椭圆曲线上有效点的密钥都会被立即拒绝。另一条路径则只检查脚本的结构形状——即正确的字节长度和正确的密钥数量——而不执行密码学解码。因此,含有畸形公钥的脚本可能通过第二条路径却被第一条路径拒绝,导致两条路径对脚本是否有效得出相互矛盾的结论。这种不一致违背了区块链验证应有的基本属性:无论由哪条代码路径检查,同一脚本都应得到相同的判定结果。
这一不一致并非无人知晓。该行为自 2024 年起就已记录在 Neo 自己的测试套件中——当时 Neo SPCC 开发者 Anna Shaleva 将 NeoGo 中的新见证验证代码移植到 C# 参考节点。该拉取请求中新增的一个测试将裸的 IsMultiSigContract 重载标注为“不走运”,因为它跳过了密钥解码,但测试将结果视为预期行为而非缺陷。其中涉及的两个实现——C# 参考节点和 NeoGo——也凸显了行为一致性的重要:在一个由多种节点实现共同维护的网络上,每种实现对同一笔交易必须给出相同的判定。
此次修复解决了这一差异。现在,验证逻辑中的所有路径在将脚本判定为有效的多重签名合约之前,都会强制进行完整的密钥解码。
修复与测试覆盖
此次改动是对 src/Neo/SmartContract/Helper.cs 的一处小规模修改。修复方案在每次检查时都对密钥进行解码,因此每条检查多重签名脚本的路径现在都执行相同的检查。
该提交新增了两个测试并修改了一个现有测试。第一个新测试将一个含有损坏公钥的多重签名脚本输入到全部三条验证路径,并确认每条路径都拒绝该脚本。第二个测试构建了一个带有损坏多重签名见证的完整交易,并确认网络拒绝该交易。该测试运行两次——一次签名者地址与见证匹配,一次是不匹配——覆盖了发布说明中提到的“见证哈希不匹配”情形。
被更新的测试 TestIsMultiSigContract_WrongCurve 此前预期快捷路径会接受含有无效密钥的脚本,现在则预期全部三条路径都会拒绝它们,从而在测试套件中固化了修正后的行为,防止未来出现回归。
Neo 核心开发者、R3E Network 创始人 Jimmy Liao 在 X 上对该版本作了如下说明:
Neo N3 v3.10.2 — security release. Fixes a witness-verification bypass from inconsistent public-key validation between
IsMultiSigContractoverloads. Keys are now validated before multisig classification.
未见已知利用
该版本发布时未附正式的安全公告。此外,无论是发布说明还是提交信息,均未提及 Neo N3 主网上存在任何已确认的利用行为。
运行 Neo N3 的节点运营方和基础设施提供商应升级至 v3.10.2——由于这是一项客户端修复,其更严格的检查仅在运行已打补丁版本的节点上生效,因此运营方的采用情况是接下来值得关注的实际重点。完整版本已发布在 GitHub 上。