Back to Blog

SwapNetとAperture Financeにおける1700万ドルのクローズドソーススマートコントラクト脆弱性:任意コール問題

Code Auditing
January 28, 2026
8 min read

2026年1月25日、SwapNetとAperture Financeが展開した脆弱なコントラクトを標的とした一連の不正なトランザクションを検出し、合計損失額は1700万ドルを超えました。これらのインシデントの根本原因は、高レベルで見ると単純であり、初期アラートですでに概要が示されていました[12]:入力検証の不備により、脆弱なコントラクトが任意の呼び出し機能を公開しており、攻撃者が既存のトークン承認を悪用し、transferFromを呼び出して資産を流出させることが可能でした。

しかしながら、両方の脆弱なコントラクトはクローズドソースであり、逆コンパイルすると数千行のコードと深くネストされた複雑な分岐ロジックが展開されるため、分析の難易度が著しく増します。さらに、影響を受けたプロジェクトが公開した事後分析レポート[34]は、主に修復と回復に焦点を当てており、根本的な技術的詳細に関する議論は限定的でした。その結果、脆弱な呼び出しパスがどのように構築されたのか、そして既存のチェックがなぜ悪用を防げなかったのかといった、いくつかの重要な質問が未解決のまま残されています。

本レポートでは、逆コンパイルされたバイトコードとオンチェーン実行トレースに基づいた、より詳細な技術分析を提供します。ソースコードの欠如は可視性を制限しますが、バイトコードレベルの分析は脆弱なロジックを再構築するのに十分であり、高レベルのアラートからはすぐに明らかにならないコントラクト設計に関するいくつかの興味深い観察結果を明らかにします。

まずSwapNetインシデントについて深く掘り下げ、次にAperture Financeインシデントの詳細な分析を行います。


SwapNet インシデント

背景

SwapNet [5]は、AMMやプライベートマーケットメーカーを含む複数のオンチェーンソースから流動性を集約することで、最適なスワップルートを見つけるためのDEXアグリゲーターです。このプロトコルでは、ユーザーがスワップ実行時にカスタムルーターまたはプールを指定することも可能で、追加の柔軟性を提供します。

根本原因分析

このインシデントは、ユーザー提供の入力検証の不備に起因しており、攻撃者が任意のパラメータtransferFrom()呼び出しをトリガーすることを可能にします。その結果、以前に脆弱なコントラクト(例:0x616000e384Ef1C2B52f5f3A88D57a3B64F23757e)に承認されていた資産が攻撃者に転送される可能性がありました。

逆コンパイルされたバイトコードに基づくと、関数0x87395540()は、重要な入力に対する適切な検証が欠けているようです。期待されるルーターまたはプールのアドレスをトークンアドレス(例:USDC)に置き換えることで、コントラクトは誤ってトークンを実行可能なターゲットと見なします。これにより、攻撃者が制御するcalldataを使用して低レベルの呼び出しが実行されます。

結果として、脆弱なコントラクトはapprovedAsset.transferFrom(victim, attacker, amount)という形式の呼び出しを実行し、攻撃者は承認されたすべての資産を不正に引き出すことができます。

攻撃フロー

SwapNetに対して複数の攻撃が観測されました。ここでは、Baseトランザクション0xc15df1d131e98d24aa0f107a67e33e66cf2ea27903338cc437a3665b6404dd57を例として使用します。

攻撃者は、脆弱なコントラクトの関数0x87395540()を悪意のある入力で呼び出しただけです。この呼び出しは、主に2つのステップで構成されます。

  1. キーとなる内部変数(例:v51)がUSDCに設定され、意図されたルーティングロジックをバイパスします。
  1. 攻撃者が制御するcalldataを使用して低レベルの呼び出しが実行され、USDC.transferFrom()が呼び出され、承認されたすべてのUSDCが流出します。

損失概要、トランザクション、および影響を受けたコントラクト

SwapNetインシデントにより、複数のチェーンで推定約1341万ドルの損失が発生しました。以下の表は、主要なエクスプロイトトランザクションと関与した脆弱なコントラクトアドレスをまとめたものです。


Aperture Finance インシデント

背景

Aperture Finance [6]は、ユーザーに代わってUniswap V3 LPなどの集中流動性ポジションを管理するDeFiプロトコルです。そのクローズドソースコントラクト(例:0xD83d960deBEC397fB149b51F8F37DD3B5CFA8913)により、ユーザーはネイティブトークンを使用してUniswap V3ポジションを作成および管理できます。

UniswapV3ポジション作成の意図されたワークフロー

0x67b34120()関数を介してUniswap V3ポジションを作成する際、コントラクトは意図された3段階のワークフローに従います。

  1. ネイティブトークンをラップ
  2. 内部関数0x1d33()を介してネイティブトークンをスワップ
  3. Uniswap V3ポジションを作成

問題はステップ2で発生します。0x1d33()は低レベルの呼び出しを通じてカスタムスワップを実行し、その際、呼び出しターゲットやcalldataなどの重要なパラメータがユーザー制御可能であり、十分な検証が行われていないため、意図しない外部呼び出しが可能になります。詳細は次のセクションで説明します。

根本原因分析

SwapNetのケースと同様に、Aperture Financeインシデントは、低レベルの呼び出しに対する入力検証の不備によって引き起こされます。0x67b34120()が呼び出されると、内部関数0x1d33()は、呼び出しターゲットや関数セレクターに対する厳格な制約を強制することなく、ユーザーが供給したcalldataを使用して低レベルの呼び出しを実行します。

以下の図に示すように、低レベルの呼び出しをトリガーするために使用されるcalldataは、純粋に攻撃者の入力に基づいています。

これにより、攻撃者はapprovedToken.transferFrom(victim, attacker, amount)という結果になる悪意のあるcalldataを構築することが可能になり、これは脆弱なコントラクトのコンテキストで実行されます。その結果、ERC20トークンだけでなく、承認されたUniswap V3ポジションNFTも不正に引き出すことができます。

攻撃フロー

Aperture Financeに対して複数の攻撃が観測されました。このセクションでは、Ethereumトランザクション0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25aを代表的な例として使用します。

  1. 攻撃者は攻撃コントラクト0x5c92884dFE0795db5ee095E68414d6aaBf398130を作成しました。
  2. 攻撃コントラクトは、悪意のある入力と100 weiのETH(つまり、msg.value == 100)で関数0x67b34120()を呼び出しました。
    • a) ネイティブETHは、関数WETH.deposit()を介してWETHにラップされました。
* b) 内部関数`0x1d33()`が低レベルの呼び出しを実行するために呼び出されました。このステップでは、`WBTC.transferFrom(victim, attacker, amount)`という呼び出しが脆弱なコントラクトのコンテキストで実行され、攻撃者は承認されたトークンを不正に引き出すことができました。`0x1d33()`関数の最後にバランスチェックが通過したことに注意する価値があります。具体的には、関数`0x1d33()`は、攻撃者が指定したスワップ出力値(つまり、`varg2.word2`)との残高変更を比較しました。その結果、何も受け取らずに正常に実行されました。
3. 最後に、関数`NonfungiblePositionManager.mint()`が呼び出され、100 weiのWETHを使用して攻撃者のポジションが作成されました。

興味深い発見

通常の異常なミントトランザクションを比較することで、両方が同じ支出者(例:OKX DEX: TokenApprove)にトークンを承認しましたが、異なるルーターアドレス(つまり、DexRouterWBTC)を指定していることが観察されました。これは、コントラクトが承認された支出者の検証を強制する一方で、実際の実行ターゲットの検証に失敗している可能性を示唆しており、任意の呼び出しによって悪用可能な重大なギャップを残しています。

通常トランザクション:https://app.blocksec.com/phalcon/explorer/tx/eth/0xc823b703c716fa9078e1d71714b734557bd540ddd1e41590dd73da7c5aba0200

異常トランザクション:https://app.blocksec.com/phalcon/explorer/tx/eth/0x8f28a7f604f1b3890c2275eec54cd7deb40935183a856074c0a06e4b5f72f25a

損失概要、トランザクション、および影響を受けたコントラクト

Aperture Financeインシデントにより、複数のチェーンで合計約367万ドルの損失が発生しました。以下の表は、主要なエクスプロイトトランザクションと関連する脆弱なコントラクトアドレスをまとめたものです。


結論

SwapNetとAperture Financeのインシデントは、異なるプロトコルとチェーンに影響を与えましたが、両方の根本的な問題は複雑ではありません:トークン承認を保持するコントラクトにおける、ユーザー制御の低レベル呼び出しと入力検証の不備の組み合わせです。これらのインシデントは、コントラクト設計における柔軟性は、厳格な呼び出し制約との慎重なバランスが必要であることを思い出させてくれます。特に、外部レビューが限定的なクローズドソースシステムにおいてはそうです。

参照

[1] https://x.com/Phalcon_xyz/status/2015614087443697738

[2] https://x.com/Phalcon_xyz/status/2015624519898234997

[3] https://meta.matcha.xyz/SwapNet-Incident-Post-Mortem

[4] https://x.com/ApertureFinance/status/2015938720453820752

[5] https://x.com/0xswapnet

[6] https://x.com/ApertureFinance

BlockSecについて

BlockSecは、フルスタックのブロックチェーンセキュリティおよび暗号コンプライアンスプロバイダーです。私たちは、顧客がコード監査(スマートコントラクト、ブロックチェーン、ウォレットを含む)、リアルタイムでの攻撃傍受、インシデント分析、不正資金追跡、およびAML/CFT義務の履行を、プロトコルおよびプラットフォームのライフサイクル全体にわたって支援する製品とサービスを構築しています。

BlockSecは、著名なカンファレンスで複数のブロックチェーンセキュリティ論文を発表し、DeFiアプリケーションのいくつかのゼロデイ攻撃を報告し、多数のハッキングを阻止して2000万ドル以上を救済し、数十億ドル相当の暗号通貨を保護してきました。

Best Security Auditor for Web3

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

BlockSec Audit