Erik Zhang氏、Neo N3 v3.10.2をリリース——マルチシグウィットネス検証のバイパスを修正
重要ポイント
- •Neoは10月23日、共同創業者Erik Zhang氏が執筆したセキュリティリリース「Neo N3 v3.10.2」を公開した。単一の論理修正のみを含み、新機能はない。
- •このパッチは、マルチシグネチャ契約オーバーロード間での公開鍵検証の不整合に起因するウィットネス検証バイパスを解消した。以前は不正なスクリプトがある検証パスを通過しつつ別のパスで拒否される可能性があった。
- •Helper.csへの小さな編集により、すべての検証コードパスで、スクリプトを有効なマルチシグ契約として分類する前に公開鍵の完全な暗号学的デコードが強制されるようになった。
- •コミットは2つの新規テストを追加し、既存の1つのテストを更新して、無効な公開鍵を含むスクリプトがウィットネスハッシュ不一致を含む完全なトランザクションのケースを含め、すべての検証パスで拒否されることを確認している。
- •Neo N3メインネットでの悪用の確認は報告されておらず、修正はパッチ適用済みリリースを稼働するノードでのみ有効となるため、運営者の採用が重要な次のステップとなる。

Neoは、Neo N3 v3.10.2をリリースしました。これは、不正なマルチシグネチャスクリプトがある検証パスでは通過しながら別のパスでは検出されていたウィットネス検証バイパスを解消する、対象を絞ったセキュリティパッチです。一般ユーザーにとっては、無効なトランザクションがノードソフトウェアの一部に有効に見えてしまう経路が取り除かれることになります。
Neoの共同創業者Erik Zhang氏が執筆した本リリースは10月23日に公開されました。内容はNeo N3のマルチシグネチャ契約検証ロジックに対する単一の論理修正のみで、新機能は含まれていません。
修正の内容
トランザクションがNeo N3ネットワークに提出されると、プロトコルは添付された署名が有効であり、正しい当事者からのものであることを検証します。トランザクションに添付された署名やチェックなどの認可データは、プロトコルで「ウィットネス」と呼ばれ、このパッチが強化するレイヤーです。トランザクションの承認に最低数の認可された署名者を必要とし、複数の当事者が同じ資金を共有する場面で広く使われるマルチシグネチャ契約では、この検証には、契約スクリプトに列挙されたすべての公開鍵が暗号学的に有効であることの確認が含まれます。
このパッチは、そのチェックの適用方法における抜け穴を塞ぐものです。Neo N3のマルチシグ検ロジックには、マルチシグスクリプトを検査する複数のコードパスがありました。そのうちの1つのパスは各公開鍵を完全にデコードしており、楕円曲線上の有効な点でない鍵は即座に拒否されました。もう1つのパスは、暗号学的デコードを行わず、スクリプトの構造的形状(正しいバイト長と正しい鍵の数)のみを確認していました。そのため、不正な公開鍵を含むスクリプトは2つ目のパスを通過しつつ1つ目のパスで拒否され、スクリプトの有効性をめぐって2つのパスの判定が食い違う状態が生じていました。こうした食い違いは、ブロックチェーン検証に期待される基本特性——どのコードパスが検査しても同じスクリプトは同じ判定を返すべき——に反するものでした。
この不整合は未知のものではありませんでした。この動作は2024年以降、Neo SPCCの開発者Anna Shaleva氏がNeoGoからC#リファレンスノードへ新しいウィットネス検証コードを移植した際に、Neo自身のテストスイートで記録されていました。そのプルリクエストで追加されたテストは、鍵のデコードをスキップする素の IsMultiSigContract オーバーロードを「不運」と指摘しましたが、その結果は欠陥ではなく期待される動作として扱われていました。そこで登場する2つの実装——C#リファレンスノードとNeoGo——は、なぜ一貫した動作が重要なのかを浮き彫りにします。複数のノード実装で維持されるネットワークでは、どの実装も同じトランザクションに対して同じ判定を下さなければなりません。
今回の修正はこの食い違いを解消します。検証ロジックのすべてのパスにおいて、スクリプトを有効なマルチシグ契約として分類する前に、鍵の完全なデコードが強制されるようになりました。
修正とテストカバレッジ
変更は src/Neo/SmartContract/Helper.cs への小さな編集です。修正により鍵が毎回デコードされるため、マルチシグスクリプトを検査するすべてのパスが同じチェックを実行するようになります。
このコミットは2つの新規テストを追加し、既存の1つのテストを更新しています。1つ目の新規テストは、壊れた公開鍵を含むマルチシグスクリプトを3つの検証パスすべてに渡し、それぞれが拒否することを確認します。2つ目は、壊れたマルチシグウィットネスを含む完全なトランザクションを構築し、ネットワークがそれを拒否することを確認します。このテストは、署名者のアドレスがウィットネスと一致する場合と一致しない場合の2回実行され、リリースノートに記載された「ウィットネスハッシュの不一致」のケースをカバーしています。
更新されたテスト TestIsMultiSigContract_WrongCurve は、以前はショートカットパスが無効な鍵を含むスクリプトを受け入れることを期待していましたが、現在は3つのパスすべてが拒否することを期待するように変更され、修正された動作を将来のリグレッションに備えてテストスイートに固定しています。
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で入手できます。