Back to Blog

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

Code Auditing
2022年5月31日
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_balanceとlocked_fundsを比較することによってposition_locked_amountが計算されます。

しかし、ステップ1で見たように、100,000 USTCが直接ロックコントラクトに転送されているため、locked_amountは4 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.7M(437 * 0.1M)USTCがアンロックされました(この単一の関数呼び出しで)。

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

2. バグ修正

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

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

3. 結論

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

Sign up for the latest updates
損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly
Security Insights

損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly

本週次レポートでは、2026年10月19日–2026年10月25日にEthereumとBNB Chainで発生した2件のセキュリティインシデントを取り上げます。フラッシュローンを資金源としたX100 Freezerのガバナンス乗っ取りと、BNB Chain上のNEMトークンの流動性プールに影響を及ぼした税の精算処理の欠陥を検証します。本レポートの対象範囲における推定損失額は合計で約557万 USDです。内訳は、代表例として取り上げるX100のトランザクションによる損失が約475万 USD、NEMプールのインシデントによる損失が約82.0万 USDです。この合計には、別途報告された、その後のX100からの資金奪取は含まれません。

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー
Security Insights

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー

この週次レポートでは、2026年10月12日–2026年10月18日に発生した3件のセキュリティインシデントを取り上げます。推定損失額の合計は約387万 USDです。Autheo Networkでは秘密鍵の侵害により約176万 USD、Qubic Walletでは脆弱なシード生成により約130万 USDの損失が発生しました。また、Ethereum、BNB Chain、Base、Robinhood Chain上のUNCX NetworkのSmart Token Vesting V2コントラクトでは、会計処理上の誤りにより約80.7万 USDの損失が発生しました。重点的に取り上げるUNCXの分析では、シェア総数の計算に欠陥があり、異なるトークン対シェア比率で作成されたベスティングのトランシェが混同された結果、共通プールからの過剰な引き出しが可能になった仕組みを説明します。

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース
Security Insights

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース

本レポートは2026/10/05~10/11にEthereumで発生したセキュリティ事故1件を扱う。推定損失は約54.2万ドル。攻撃コントラクトは悪意あるアダプターを展開し、アクセス制御のないMakerDaoBot関数に渡して、ボット内部のMakerDAO残高への操作権限を付与させた。アダプターは旧ETH-Aオークション4件を決済し、ETH-A担保200単位をWETHに変換。攻撃コントラクトがWETHをETHに戻し、攻撃者へ200 ETHを送金した。

Best Security Auditor for Web3

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

BlockSec Audit