zERC20、zJPYCで約996万トークンが不正ミント。約335万円相当が流出

zJPYCで約996万トークンが不正ミント、約335万JPYCが流出

プライバシー保護型トークン送金基盤「zERC20」が、ポリゴン(Polygon)上の「zJPYC」で不正なトークン発行(ミント)が発生し、約335万JPYCが外部流出した。9月18日に公式Xアカウントで発表された。

zJPYCは、JPYC社が発行する日本円建てステーブルコイン「JPYC」を、プライバシーを保護しながら送金するためにzERC20が提供するトークンだ。ユーザーはJPYCを1対1でzJPYCに変換して送金し、受取側がzJPYCをJPYCに戻すことで、送金元と受取人のアドレスの直接的なつながりを分離できる。zJPYCはzERC20が独自に提供する非公式サービスで、JPYC株式会社は提供や共同開発、審査、推奨には関与していない。

zERC20によると、攻撃は9月13日に発生した。攻撃者は暗号学的な証明システム「Nova」の脆弱性を悪用し、累計出金額が1,000万zJPYCであるとする無効な証明を提出した。証明を確認する検証コントラクト(Verifier)がこれを受け入れたことで、0.35%(35bps)の償還手数料を差し引いた996万5,000zJPYCが攻撃者にミントされた。

攻撃者は不正に発行したzJPYCの一部をJPYCへ戻し、zJPYCからJPYCへの交換に使われる「LiquidityManager」が当時保有していた3,348,497.584171JPYC(約335万円、約21,600ドル)を全額引き出した。

このため、不正にミントされた996万5,000zJPYCのすべてがJPYCに交換されたわけではない。残る6,616,502.415829zJPYCは9月17日時点で攻撃者のアドレスに残っているが、LiquidityManagerが保有していたJPYCはすでに引き出されていたため、JPYCには交換されていない。

流出したJPYCはその後、DEX(分散型取引所)で暗号資産(仮想通貨)「POL」に交換され、223,790POLがクロスチェーンプロトコル「LI.FI」を通じて別のチェーンへ移動された。不正ミントから資産の移動までにかかった時間は約4分だった。

Novaの既知脆弱性とzJPYCの設定ミスが原因

zERC20は今回の原因について、同プロトコルが利用するNovaライブラリの既知の脆弱性に加え、本来無効化しておく必要があった出金経路が、zJPYCのデプロイ時の設定ミスによって利用可能になっていたためだと説明している。

zERC20 v1のリリース時点ではNovaライブラリ自体の監査が進行中だった。このため同プロトコルは未知の問題に備え、Novaを利用する一部の処理について証明を提出できるアドレスを許可リストで制限するとともに、一括出金機能「BatchWithdraw」を無効化していた。

zERC20の説明では、その後、今年4月ごろの監査で、無効な証明を構築できる可能性があるNovaの重大な脆弱性が発見された。ただし同プロトコルは、許可リストやBatchWithdrawの無効化によって、脆弱性が資産流出につながる経路で悪用されることを防げると判断した。当時はV2への移行も予定していたため、v1のNova自体には追加の修正を行わず、既存の安全策を維持することを決めた。

しかし、その後zJPYCをポリゴンとカイア(Kaia)へデプロイした際、本来無効化しておく必要があったBatchWithdrawが設定ミスによって利用可能になった。この結果、Novaの脆弱性を悪用した無効な証明を受け入れ、不正なzJPYCをミントできる経路が本番環境に生じた。

一方、zBNB、zETH、zUSDCなどその他のzERC20のデプロイでは、同じ出金経路は無効化されていた。このためzERC20は、今回の問題について、zERC20全体に共通するものではなく、ポリゴンとカイア上のzJPYCに固有のデプロイ設定上の問題だったと説明している。

同プロトコルは、本番環境の設定が想定したセキュリティ条件を満たしているかをデプロイ後に十分検証できていなかったことが、直接的な運用上の根本原因だったと説明している。

zERC20が全額補償へ、デプロイ後監査を導入

実際の資産流出が確認されているのは、ポリゴン上のzJPYCのみだ。カイア上のzJPYCにもポリゴンと同じNova設定が適用されており、技術的には同じ攻撃経路にさらされていたが、zERC20の報告時点では同様の資産流出は確認されていない。またzERC20は、今回の攻撃に関連するその他の類似した不審な資産流出も確認していないと説明している。

zERC20はインシデントの確認後、関連システムを停止して影響範囲と原因の調査を開始した。9月17日時点では関連するVerifierを緊急停止し、同じ経路を利用した追加の不正ミントを防止している。また、残る不正なzJPYCの移転やJPYCへの交換を防ぐため、攻撃者のアドレスをブロックリストに登録する対応も進めている。

同プロトコルは今回のインシデントによって影響を受けたすべてのユーザー資産を全額補償し、ユーザーに損失を負担させないと説明している。必要な修正や設定確認、追加のセキュリティレビューが完了するまで関連機能を停止し、安全性を確認した後にサービスを段階的に再開する方針だ。

再発防止策では、コード自体の監査だけでなく、本番環境にデプロイされたコントラクトの設定が設計通りになっているかを確認する工程を強化する。従来のデプロイ前監査に加え、コントラクトの権限や許可リスト、各機能の有効・無効などを確認する「デプロイ後監査(Post-Deployment Audits)」を導入する。

また、無効化が必要な機能を実際に利用できないことを確認するオンチェーンテストをデプロイ手順に組み込む。Novaを利用する機能は、V2への移行を含めて安全性を再検証するまで再び有効化しない。

さらに、緊急時にLiquidityManagerの資産移動を迅速に停止できる仕組みを導入・強化する。異常なミントや出金、準備資産の比率変化、大口取引などに対するリアルタイムのオンチェーン監視とアラートも強化するとのことだ。

zERC20は今後もNova証明や関連機能、デプロイ設定、流出した資産の移動について調査を継続する。新たな重要情報が判明した場合は、追加情報を公開するとのことだ。

 画像:PIXTA

関連ニュース

関連するキーワード

この記事の著者・インタビューイ

渡邉洋輔

「あたらしい経済」編集部 記者 ブロックチェーンおよびデジタル資産分野を専門とし情報発信を行っている。オンチェーンデータや流動性構造など、市場設計の観点からのリサーチにも取り組んでいる。