2025年10月 事後報告
(参考) 日本語訳
事後検証: アグリゲートトランザクションハッシュ衝突脆弱性(2025年10月)
Symbolネットワークにおいて、アグリゲートトランザクションに影響を与える脆弱性が特定され、修正されました。
この問題は、特定の条件下で2つの異なるアグリゲートトランザクションが同じトランザクションハッシュを生成してしまう可能性がありました。 この脆弱性は、悪用される前に修正されました。
タイムライン
※時間はいずれも日本時間です
9月7日 午前11時30分
@daokaがX(旧Twitter)でMaitsukiさんが問題を報告していることをチームに伝えたことで、この問題が初めてチームに知らされました。
9月26日 午前8時39分
ブロック高4,759,100で、修正を有効化するハードフォークが実施されました。
背景
Symbolにおけるアグリゲートトランザクションは、複数のインナートランザクションを1つのアトミックな(不可分な)操作としてまとめます。
各アグリゲートのハッシュは、そのインナートランザクションから構築されたマークルツリーから派生します。
コミュニティのコントリビューターによって発見され、コア開発チームによって確認されたこの問題は、埋め込まれたトランザクションの数が2の累乗ではない場合に、不完全なマークルツリーが構築される方法に起因していました。
このような場合、ハッシュアルゴリズムはツリーを完成させるために最後のリーフを複製します。
これらの複製されたリーフは、マークルツリーの構造を完成させるためにのみ使用され、アクティブなトランザクションには対応しません。
しかし、これは、暗黙的に埋められたこのようなアグリゲートをコピーし、最後のトランザクションの複製されたアクティブなコピーを追加することで、新しいトランザクションが構築される可能性があることを意味します。
このトランザクションは、すでに署名されたトランザクションと同じマークルハッシュ、したがって同じトランザクションハッシュを持つことになります。
実際には、もしアカウントAがアグリゲートの最後に埋め込まれたトランザクションでアカウントBに資金を送金した場合、Bは理論上、その送金を複数回複製する新しいアグリゲートを作成し、Aの署名を再利用することができました。
これは、結果として生成されるハッシュが一致するためです。
これにより、ネットワークが分岐しますが、最終的には2つのアグリゲートトランザクションのうちどちらか一方に収束することになります。
なお、ステートハッシュにより、過去のトランザクションが不正に変更されることは不可能です。
解決策
この脆弱性を排除するため、アグリゲートトランザクションのバージョン3では、すでにトランザクションヘッダーの一部であった、全ての埋め込みトランザクションのペイロードサイズの合計(バイト単位)をアグリゲートハッシュの計算に含めるようになりました。
これにより、たとえ構造的に似ており、埋め込みトランザクションが複製されているアグリゲートであっても、常に異なるハッシュが生成されることが保証されます。
このアップデートは、予定されていたハードフォークの一部としてリリースされました。
ハードフォークのブロック高以前は、バージョン2のアグリゲートトランザクションのみが有効でしたが、そのブロック以降はバージョン3のアグリゲートトランザクションのみが受け入れられます。
ハーベスティングノードと投票ノードの大部分は、アクティベート前にアップグレードを完了しており、ブロック生成やファイナライゼーションに支障をきたすことなく、スムーズな移行することができました。
⚠️
バージョン2のアグリゲートトランザクションを使用しているアプリケーションは動作しません。
新しいバージョンに更新したノードはバージョン2のアグリゲートトランザクションを拒否するため、アグリゲートトランザクションを使用しているアプリケーションは、バージョン3のアグリゲートトランザクションを発行するために最新のSDKにアップデートする必要があります。
影響分析
過去の分析を行い、この挙動を悪用した既知のトランザクションはなかったことが確認されました。 さらに、資金盗難の事例も報告されていません。
今後の展望
今回の問題を最初に報告してくださったMaitsukiさん、そしてネットワークの安全性と安定性を維持するために迅速にアップグレードしてくださった全てのノードオペレーターに感謝いたします。
また、Symbolにはバグやセキュリティ問題を報告についてはこちらを参照してください。