Erik Zhang publie Neo N3 v3.10.2, corrigeant un contournement de la vérification des témoins multisignatures
Points clés
- •Neo a publié Neo N3 v3.10.2 le 23 octobre, une version de sécurité rédigée par le cofondateur Erik Zhang qui contient un seul correctif logique et aucune nouvelle fonctionnalité.
- •Le correctif élimine un contournement de la vérification des témoins causé par une validation incohérente des clés publiques entre les surcharges de contrats multisignatures, qui permettait auparavant à des scripts malformés de passer par un chemin de validation tout en échouant sur un autre.
- •Tous les chemins de validation imposent désormais un décodage cryptographique complet des clés publiques avant de classer un script comme contrat multisignature valide, via une petite modification de Helper.cs.
- •Le commit ajoute deux nouveaux tests et met à jour un test existant pour confirmer que les scripts avec des clés publiques invalides sont rejetés par chaque chemin de validation, y compris un cas de transaction complète avec des hash de témoins non concordants.
- •Aucune exploitation confirmée sur le MainNet Neo N3 n'a été signalée, et le correctif ne prend effet que sur les nœuds exécutant la version corrigée, ce qui fait de l'adoption par les opérateurs la prochaine étape clé.

Neo a publié Neo N3 v3.10.2, un correctif de sécurité ciblé qui referme un contournement de la vérification des témoins permettant auparavant à des scripts multisignatures malformés de passer par un chemin de validation tout en étant rejetés par un autre. Pour les utilisateurs ordinaires, ce correctif élimine une voie par laquelle une transaction invalide pouvait apparaître valide à une partie du logiciel du nœud.
La version, rédigée par le cofondateur de Neo Erik Zhang, a été publiée le 23 octobre. Elle contient un seul correctif logique apporté à la logique de validation des contrats multisignatures de Neo N3, et aucune nouvelle fonctionnalité.
Ce que corrige le correctif
Lorsqu'une transaction est soumise au réseau Neo N3, le protocole vérifie que les signatures jointes sont valides et proviennent des bonnes parties. Ces données d'autorisation — les signatures et les vérifications attachées à une transaction — constituent ce que le protocole appelle son témoin (witness), et c'est la couche que ce correctif renforce. Pour les contrats multisignatures, qui exigent un nombre minimal de signataires autorisés pour approuver une transaction et sont couramment utilisés partout où plusieurs parties partagent le contrôle des mêmes fonds, cette vérification inclut le contrôle de la validité cryptographique de chaque clé publique listée dans le script du contrat.
Le correctif referme une faille dans la manière dont cette vérification était appliquée. La logique de validation multisignature de Neo N3 comprenait plusieurs chemins de code pour inspecter un script multisignature. L'un de ces chemins décodait entièrement chaque clé publique, un processus qui rejetait immédiatement toute clé n'étant pas un point valide sur la courbe elliptique. Un second chemin ne vérifiait que la forme structurelle du script — les longueurs d'octets correctes et le nombre correct de clés — sans effectuer le décodage cryptographique. Un script contenant une clé publique malformée pouvait donc passer le second chemin et échouer au premier, les deux chemins étant en désaccord sur la validité du script. Ce type de désaccord va à l'encontre d'une propriété fondamentale attendue de la validation blockchain : le même script devrait produire le même verdict quel que soit le chemin de code qui l'inspecte.
L'incohérence n'était pas inconnue. Ce comportement était documenté dans la suite de tests de Neo depuis 2024, lorsque la développeuse de Neo SPCC Anna Shaleva a porté un nouveau code de vérification des témoins de NeoGo vers le nœud de référence C#. Un test ajouté dans cette pull request signalait la surcharge basique IsMultiSigContract comme « unlucky » (malchanceuse) pour avoir omis le décodage des clés, mais considérait le résultat comme un comportement attendu plutôt que comme un défaut. Les deux implémentations en jeu — le nud de référence C# et NeoGo — soulignent pourquoi l'uniformité du comportement importe : sur un réseau maintenu dans plusieurs implémentations de nœud, chacune doit statuer de la même manière sur la même transaction.
Le correctif résout cette divergence. Tous les chemins de la logique de validation imposent désormais un décodage complet des clés avant de classer un script comme contrat multisignature valide.
Correctif et couverture de tests
La modification est une petite retouche à src/Neo/SmartContract/Helper.cs. Le correctif décode la clé à chaque fois, de sorte que chaque chemin inspectant un script multisignature exécute désormais la même vérification.
Le commit ajoute deux nouveaux tests et met à jour un test existant. Le premier nouveau test soumet un script multisignature avec une clé publique défectueuse aux trois chemins de validation et confirme que chacun le rejette. Le second construit une transaction complète avec un témoin multisignature défectueux et confirme que le réseau la refuse. Ce test s'exécute deux fois — une fois avec l'adresse du signataire correspondant au témoin et une fois avec une non-concordance — couvrant le cas des « hash de témoins non concordants » mentionné dans les notes de version.
Le test mis à jour, TestIsMultiSigContract_WrongCurve, s'attendait auparavant à ce que le chemin raccourci accepte les scripts avec des clés invalides. Il attend désormais que les trois chemins les rejettent, verrouillant ainsi le comportement corrigé dans la suite de tests contre de futures régressions.
Jimmy Liao, développeur principal de Neo et fondateur de R3E Network, a décrit la version sur 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.
Aucune exploitation connue
Aucune alerte de sécurité formelle n'a été publiée avec la version. Ni les notes de version ni le message de commit ne décrivent d'exploitation confirmée sur le MainNet Neo N3.
Les opérateurs de nœuds et les fournisseurs d'infrastructure exécutant Neo N3 devraient passer à la v3.10.2 — s'agissant d'un correctif côté client, sa vérification renforcée ne prend effet que sur les nœuds exécutant réellement la version corrigée, ce qui fait de l'adoption par les opérateurs la prochaine étape concrète à surveiller. La version complète est disponible sur GitHub.