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

zJPYCの不正ミントが発生

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

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

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

その後攻撃者は、不正に発行したzJPYCの一部をJPYCに交換した。この交換により、交換用のJPYCを保管するコントラクト「リクイディティマネージャー(LiquidityManager)」から、当時保管されていたJPYCの全額に当たる334万8,497.584171JPYCが引き出された。

リクイディティマネージャーに保管されていたJPYCが尽きたため、残りのzJPYCはJPYCに交換されなかった。 9月17日時点で、攻撃者のアドレスには未交換の661万6,502.415829zJPYCが残っていた。

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

原因およびその経緯

今回の原因は、zERC20が利用する「Novaライブラリ」の既知の脆弱性に加え、zJPYCのデプロイ(稼働開始)時の設定ミスにより、本来無効化しておく必要があった出金経路が利用可能になっていたことだと、zERC20の運営側より説明されている。

zERC20 v1のリリース時点ではNovaライブラリ自体の監査が進行中だったという。

このため運営チームは未知の問題に備え、Novaを利用する一部の処理では、事前に許可したアドレスからのみ証明を受け付けていた。 併せて、一括出金機能「バッチウィズドロウ(BatchWithdraw)」も無効化していた。

その後、今年4月ごろの監査で、無効な証明を構築できる可能性があるNovaの重大な脆弱性が発見された。ただし運営チームは、前述の対応により、脆弱性の悪用による資産流出を防げると判断したという。当時はV2への移行も予定していたため、v1で使用するNovaライブラリには追加の修正を加えず、移行まで既存の対策を継続したとのこと。

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

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

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

ユーザー資産は全額補償、デプロイ後の監査導入

前述した通り、問題が生じたのは、ポリゴンとカイア上のzJPYCだ。しかし実際の資産流出が確認されているのは、ポリゴン上のzJPYCのみだ。

カイア上のzJPYCにも技術的には同じ攻撃経路にさらされていたが、今回の報告時点では同様の資産流出は確認されていない。また、今回の攻撃に関連するその他の類似した不審な資産流出も確認されていないという。

運営チームはインシデント確認後、関連システム停止のうえ、影響範囲と原因の調査を開始したとのこと。9月17日時点では関連する検証コントラクトを緊急停止し、同じ経路を利用した追加の不正ミントを防止している。

また、残る不正なzJPYCの移転やJPYCへの交換を防ぐため、攻撃者のアドレスをブロックリストに登録する対応も進めている。

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

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

また、コントラクトの導入時には、本来停止しておくべき機能が使えない状態になっているかを、ブロックチェーン上でテストする。Novaを使う機能は、V2への移行時も含め、安全性を改めて確認するまで再開しない。

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

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

 画像:PIXTA

関連ニュース

関連するキーワード

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

渡邉洋輔

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

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

合わせて読みたい記事