Back to Blog

ミラープロトコルがどのように悪用されたか

Code Auditing
May 31, 2022
4 min read

Mirror Protocolが@FatManによって不正利用されたと報告されました。このブログには、その件に関する優れたレポートがあります。](https://www.theblock.co/post/149342/a-90-million-defi-exploit-on-terra-went-unnoticed-for-seven-months) この短い記事では、攻撃トランザクションを使用して、どのようにしてこれが起こったのかを詳しく説明します。

免責事項:この記事は、公開されているトランザクションと、MirrorプロトコルおよびTerraエコシステムに関する当社の理解に基づいています。不正確な点があればお知らせください。このブログに関するコメントは歓迎します。

1. 攻撃

1.1 準備

トランザクションは、攻撃の準備に使用されます。

ステップ1: このトランザクションでは、攻撃者はまず100,000 USTCをロックコントラクトに送信しました。これはポジションを開くために必須ではありませんが、攻撃にとって非常に重要です。

ステップ2: その後、攻撃者は10 USTCを担保として預け入れ、collateral_ratioを2.5に指定してポジションを開きました。

short_paramsが指定されているため、ミントコントラクトはミントされたmAssets(つまりmETH)を販売し、得られたUSTCをポジションのロックされた金額に追加します。

ステップ2.1: トランザクションをステップごとに見ていきましょう。まず、open_position関数が呼び出され、IDが43186のショートポジションが開かれます。

ステップ2.2: オプションのshort_paramsが追加されているため、コントラクトはまず0.001208 mETH(現在のETH価格に基づく)をミントし、次にmETH-USTペアでスワップして販売します。

ステップ2.3: 0.001208 mETHは4.06582 USTCにスワップされ、スワップされたUSTCは、関連する手数料(税金など)が差し引かれた後、ロックコントラクトに送信されます。これは、開かれたポジションは一定期間後にしかアンロックできないためです。

ステップ2.4: 次にlock_position_funds_hookが呼び出されます。この関数では、current_balanceをクエリし、current_balancelocked_fundsを比較することによってposition_locked_amountが計算されます。

しかし、ステップ1で見たように、100,000 USTCが直接ロックコントラクトに転送されているため、locked_amount4 USTCではなく、約100,004 USTCになります。

ステップ2.5: 最後に、increase_short_tokenが呼び出され、sLPトークンが記録されます。

これにより、攻撃者は直接ロックコントラクトに100,000 USTCを送信し、担保として10 USTCを送信してポジションを開きました。ポジションのロックされた金額は約100,004 USTCであり、一定期間後にアンロックできます。攻撃者は、1,000から100,000 USTCを送信して、このような多くのポジションを開きました。

1.2. 攻撃

Mirror Protocolは、ポジションIDの重複をチェックしません。この場合、攻撃者は1つのポジションのロックされた金額を繰り返しアンロックするために、多くの重複したポジションIDを供給できます。

トランザクションは、攻撃トランザクションです。例えば、ポジションID 43186の場合、攻撃者は437回重複させました。

元のコントラクトコードは重複をチェックしないため、約43.7M437 * 0.1M)USTCがアンロックされました(この単一の関数呼び出しで)。

他のポジションも同様のメカニズムでアンロックされていることに注意してください。

2. バグ修正

この脆弱性は、このコミットで修正されました。

具体的には、unlockable_positionsはアンロックされるポジションIDを含むベクトルです。元のコードでは、unlockable_positionsに重複したIDがないかどうかのチェックがありませんでした。パッチが適用されたコードでは、ポジションIDの重複チェックが追加されています。

3. 結論

@FatManや他のコミュニティメンバーが指摘したように、このバグは数ヶ月前から存在しており、実際に悪用されていました。すでに悪用されている脆弱性を静かにパッチすることは、優れたセキュリティプラクティスではないと考えています。さらに、注目度の高いDeFiプロジェクトは、アプリケーションの状態を積極的に監視し、異常が発生したときにアラートを受け取るためのゲートキーパーをデプロイすべきだと考えています。

Sign up for the latest updates
HarmonyのクロスシャードONEミント + 約4700万ドルの鍵漏洩による損失 | BlockSec
Security Insights

HarmonyのクロスシャードONEミント + 約4700万ドルの鍵漏洩による損失 | BlockSec

2026年8月10日〜16日の週、注目すべきセキュリティ事件5件を紹介、損失総額は約4700万ドル。詳細分析はHarmony Layer-1の連鎖実装欠陥に注目。Harmonyでは、クロスシャードのレシート再生により、未署名のMerkleProofのShardIDとBlockNumから支出マーカーを導出し、ONEが不正発行された。約3.01兆ONEが偽造されたが、名目価値は市場総額を大幅に超え、実現・確定損失ではないため総額から除外。約4700万ドルは秘密鍵漏洩(Unknown Whale Wallet約2500万ドル、Kite約1400万ドル、Coinsbuy約790万ドル)とFoxのロジック欠陥(約11.7万ドル)による。

約160万ドルの損失:MokeトークンとLpdFiへの攻撃 | BlockSec週次レポート
Security Insights

約160万ドルの損失:MokeトークンとLpdFiへの攻撃 | BlockSec週次レポート

2026年8月3〜9日の週、BNBチェーンで2件の重大なセキュリティインシデントが発生し、いずれも価格操作により総損失は約160万ドルに上った。LpdFi事件(約69.7万ドル)では、注文評価と利息償還の両方に同じ操作可能なPancakeSwapペアのリザーブが使用され、攻撃者がポジションの元本を水増しし過大な利息を請求した。Mokeトークン(約90.6万ドル)では、操作可能なスポット価格とLP配当の重複計上を組み合わせ、MOKEを水増し請求してBNB配当を複数回取得した。

COLDCARDの事件:ウォレットの「ランダム」シードがランダムではなかった時
Security Insights

COLDCARDの事件:ウォレットの「ランダム」シードがランダムではなかった時

COLDCARDファームウェアのビルド・統合バグにより、Bitcoin種生成がソフトウェアRNGフォールバックに誘導され、脆弱な乱数によりウォレットの秘密鍵がオフラインで復元可能となった。欠陥は種自体にあるためファームウェア更新では修正不可。2026年8月7日までに確認された被害は1,405 BTC(約91億円)、非公式推定では最大2,055 BTCに上る。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
ミラープロトコルがどのように悪用されたか