分散型金融(DeFi)の分野には多数のセキュリティリスクがあり、ユーザー、プラットフォーム、金融エコシステム全体に重大な損害を引き起こす可能性があります。DeFiのセキュリティリスクを3種類にまとめ、最近の実際のセキュリティインシデントを分析することでハッカー攻撃のプロセスと対応策を解説しました。
- 価格操作のリスク 
- スマートコントラクトの脆弱性リスク 
- ユーザーの操作リスク 
1. 価格操作リスク
DeFi では、価格操作リスクとは、資産の価格を操作することで利益を得る、または市場に影響を与えようとする悪意のある行為者を指します。このような操作は市場価格の異常な変動につながり、他の参加者に損失を与える可能性があります。以下に、DeFi で価格操作リスクが発生する可能性がある 3 つの状況をまとめます。
- フラッシュローン攻撃 
- サンドイッチ攻撃 
- オラクル攻撃 
1.1 フラッシュローン攻撃
フラッシュローン攻撃とは、DeFiアプリケーションに登場する攻撃手法です。これは、担保を提供せずにお金を借りることができる金融操作であるフラッシュ ローンを利用します。攻撃者はフラッシュ ローンを通じて多額の資金を借り、同じ取引で一連の操作を実行して詐欺を行います。
ShidoGlobalフラッシュローン襲撃事件
2023年6月23日、BSC(バイナンス・スマート・チェーン)に対してShidoGlobalフラッシュローン攻撃が発生しました。攻撃者は、ロック アンド クレーム メカニズムと 2 つのプール間の価格差を通じてトークンの裁定取引を実現します。976WBNBを盗むことに成功した。
Attack Tx:
攻撃者はどのようにしてフラッシュローン攻撃を実行するのでしょうか?
- 攻撃者は 40 WBNB のフラッシュ ローンを利用しました。 

- 攻撃者は、39 WBNB を 10、436、972、685、676、390、697 Shido Inu: SHIDO トークン (小数点以下 9 桁) と交換し、それらを PancakeSwap V2: SHIDO-WBNB プールにデポジットしました。このアクションにより、プール内の Shido Inu: SHIDO トークンの供給が増加し、トークンの価格が下がります。 

- 次に、攻撃者は ShidoLock.lockTokens と ShidoLock.claimTokens を順番に呼び出し、10, 436, 972, 685.676390697 Shido Inu: SHIDO トークン (小数点以下 9 桁) を 10, 436, 986, 704, 133, 494, 387, 000, 000 に変換します。 , 000 SHIDO トークン (小数点以下 18 桁)。 
攻撃者が ShidoLock コントラクトの lockTokens 関数を呼び出すと、コントラクト内の 10、436、972、685.676390697 Shido Inu: SHIDO トークンがロックされます。これは、特定の条件が満たされるまで、これらのトークンを譲渡または取引できないことを意味します。攻撃者はトークンをロックすることで、トークンの価格安定性をある程度維持することができます。
攻撃者は、claimTokens 関数を呼び出して、ロックされたトークンを 10, 436, 986, 704, 133, 494, 387, 000, 000, 000 SHIDO トークンに変換しました。このステップにより、SHIDO トークンの小数点以下の桁数が 9 から 18 に実質的に増加し、トークンの総供給量が増加します。

- PancakeSwap V2: SHIDO-WBNB プールと PancakeSwap V2: SHIDO 28 プールの間には、ロック アンド クレーム メカニズムによる価格差があります。具体的には、PancakeSwap V2: SHIDO-WBNB プール内の SHIDO トークンの供給量の増加により、価格が下落しました。 PancakeSwap V2: SHIDO 28 プールでは、供給が増えていないため、価格が比較的高くなっています。攻撃者はこの価格差を利用し、2 つのプール間でトークンを交換し、10, 436, 986, 704, 133, 494, 387, 000, 000, 000 SHIDO トークン (小数点以下) をより有利な価格で転送しました 18ビット) は 1,016 WBNB に交換されました。 

- 最終的に、攻撃者は 40 WBNB のフラッシュ ローンを返済し、約 976 WBNB の利益を受け取りました。 

フラッシュローン機能の制限
フラッシュローン機能の制限とフラッシュローン手数料の導入フラッシュローン攻撃や不正操作のリスクを軽減する一般的な方法です。
- フラッシュローン機能を制限する:最低融資額や融資期限などを設定するなど、フラッシュローン機能を制限できます。これにより、攻撃者がフラッシュ ローンを使用して攻撃を実行する可能性が低くなります。 
- フラッシュ ローンの手数料の導入: 借り手に一定の手数料を請求することができます。これにより攻撃のコストが増加する可能性があり、フラッシュ ローン攻撃を実行する際に攻撃者はより高いリスクとコストに直面することになります。 

上記サンプルコードでは、フラッシュローン機能の利用を制限するため、最低融資金額、最大融資金額、融資時間などの制限を設けています。フラッシュ ローン操作を実行する前に、まず一定の割合の手数料を計算して請求します。
1.2 サンドイッチ攻撃
サンドイッチ攻撃は、分散型取引所(DEX)における情報の非対称性を利用した攻撃手法です。攻撃者は、2 つのトランザクションの間に悪意のあるトランザクションを挿入することで、価格差を利用して利益を獲得します。
CurveFinance サンドイッチ攻撃
2023 年 8 月 2 日、Hypernative システムは Curve Finance に対してサンドイッチ攻撃を開始しました。攻撃者は、流動性を追加したり削除したりする 2 つのトランザクションの間に悪意のあるトランザクションを挿入します。36.8K USDT を獲得します。
Attack Tx:
攻撃者はどのようにしてサンドイッチ攻撃を実行するのでしょうか?
- 攻撃者は、wstETH、WETH、USDT などの複数の資金源から巨額のフラッシュ ローンを取得しました。 

- 攻撃者は 155,000,000 USDT の流動性を 3 つのプールに提供し、3 つの CRV LP トークンを取得しました。 3 CRV は、攻撃で侵害されたマイニング プールである Curve TriPool (Curve DAI/USDC/USDT マイニング プール) の LP トークンです。 

- 攻撃者はプールから DAI と USDC の流動性を(ほぼすべて)削除し、3 つの CRV LP トークンを破壊しました。現時点では、プールはほぼ完全に USDT にあるため、一時的に DAI や USDC よりもはるかに安くなります。 

- UnderlyingBurner コントラクトのexecute() 関数を呼び出して、Curve DAI/USDC/USDT マイニング プールに流動性を追加し続けます。 UnderlyingBurnerは主にUSDTを保有しており、DAI:USDC:USDTの追加数は100,000:100,000:227,079,039,776となっています。その結果、プールのバランスがさらに不均衡になり、USDT の相対量が増加し、値が低くなります。 

- 攻撃者は、保有する DAI と USDC を Curve DAI/USDC/USDT プールに追加し、プレミアムを享受しました。これは、より多くの量の 3 CRV LP トークンを取得することを意味します。 

- 攻撃者は 3 つの CRV LP トークンを破壊し、USDT の流動性を引き出しました。 

- 攻撃者はフラッシュ ローンを返済し、36.8,000 USDT の利益を保持します。 

このプロセスにおいて、悪意のあるトランザクションとは、攻撃者が Curve DAI/USDC/USDT マイニング プールから大量の DAI および USDC 流動性を削除し、3 つの CRV LP トークンを破壊したトランザクションを指します。このトランザクションにより、USDT の相対量が増加し、プールのバランスが非常に不均衡になり、その結果、価値が低くなりました。
他の 2 つのトランザクションは、攻撃者が流動性を追加および引き出したトランザクションを指します。攻撃者は、保有していた DAI と USDC の流動性を Curve DAI/USDC/USDT マイニング プールに追加し、プレミアムで引き出して価格差を利用し、より多くの 3 CRV LP トークンを取得しました。
このように、攻撃者はサンドイッチ攻撃によって悪意のあるトランザクションを他の 2 つのトランザクションとパッケージ化し、USDT の流動性を低価格で購入し、その後高価格で売却して利益を獲得します。
取引指値注文
サンドイッチ攻撃を防ぐ場合、コードの実装には複雑なスマート コントラクトとトランザクション ロジックが含まれる場合があります。これは、渡す方法を示す簡略化された例です。トランザクション注文を制限し、トランザクション遅延を導入するサンドイッチ攻撃を防ぐため。

この例では、ユーザーの残高とトランザクション操作を管理するスマート コントラクト Sandwich AttackPrevention があると仮定します。サンドイッチ攻撃を防ぐために、2 つの主要な防御メカニズムを導入します。
まず、allowTransaction 関数では、コントラクトの所有者のみが isTransactionAllowed を true に設定して、ユーザーがトランザクションを実行できるようにします。これにより、トランザクションが正しい順序で実行されることが保証され、攻撃者が 2 つのトランザクションの間に悪意のあるトランザクションを挿入することができなくなります。
次に、executeTransaction 関数では、トランザクション遅延の概念を導入します。ユーザーは、現在のブロック時間が設定された遅延時間を超えた後にのみトランザクションを実行できます。これにより、他のユーザーがトランザクションを実行して価格を更新するのに十分な時間が与えられ、攻撃者が価格差を悪用する機会が減ります。
1.3 オラクル攻撃
価格オラクルは、暗号通貨のリアルタイムの価格情報を提供するデータ ソースです。この情報は、多くの DeFi プロトコルが適切に機能するために重要です。オラクル攻撃とは、価格操作に基づく取引から利益を得るために、攻撃者がオラクルによって提供されるデータを人為的に変更することを指します。
ロデオファイナンスオラクル攻撃事件
Rodeo は、価格オラクル サービスを提供する DeFi プラットフォームです。 2023 年 7 月 11 日、価格オラクルの操作により、ハッカーが Rodeo プロトコルから盗みました。約472ETH(約88万8000米ドル)。
Attack Tx:
価格オラクルはどのように操作されますか?
Rodeo Finance 攻撃の鍵は Rodeo TWAP Oracle でした。このオラクルは、ETH と unshETH の間の価格比率を追跡するために使用されます。
- 攻撃トランザクションの分析: 攻撃プロセスは、攻撃者が慎重に計画したトランザクションを実行することから始まります。攻撃者は、プラットフォーム アーキテクチャと時間加重平均価格 (TWAP) オラクルの潜在的な脆弱性についての深い理解を活用して、攻撃を開始しました。 
- TWAP オラクルの操作: 攻撃者は、未設定のポリシー アドレスに関連付けられた獲得関数を使用して、USDC と unshETH の交換を強制できます。この操作は、欠陥のある unshETH 価格オラクルによって引き起こされるスリッページ制御を効果的に回避します。基本的に、獲得関数は USDC から WETH に強制的に送られ、その後 unshETH に送られます。 
- TWAP 価格の計算: TWAP 価格は、それぞれ 45 分間隔で更新された、過去 4 回の更新の価格を平均することによって計算されます。しかし、欠陥のある価格オラクルにより操作された価格が返されたため、スマート コントラクトはポジションが健全であると判断しました。 
- レバレッジをかけたポジションのオープン: 攻撃者はサンドイッチ攻撃を通じて TWAP オラクルを操作し、投資家契約から獲得関数を呼び出してレバレッジをかけたポジションをオープンします。彼らはUSDCから40万ドル相当を借りました。 

- 資産の交換: 攻撃者は、借りた資産を基礎となる CamelotDEX プールと交換し、同時に準備した unshETH をプールに売り戻します。 
- 実行検証のバイパス: 契約では、操作が有効であることを検証することがよくあります。しかし、攻撃者はこの戦略を制御していたため、このチェックを簡単に回避してしまいました。これにより、攻撃者は準備された unshETH をプールに売り戻し、プラットフォームから流動性を効果的に抽出することで、操作されたポジションを悪用することができます。 
- 盗まれた資金の転送: 攻撃者は盗まれた資金を Arbitrum からイーサリアムに移動し、285 ETH を unshETH と交換し、その後攻撃を継続するために Arbitrum に移動しました。盗まれた150 ETH相当の資金は、プライバシーを重視したイーサリアムミキシングサービスであるTornado Cashに送金された。残りの 371.2 ETH (約 701,679 ドル相当) は、依然として攻撃者が管理するアドレスに保持されています。 
この攻撃の重大な脆弱性は、Rodeo TWAP Oracle の実行における欠陥です。オラクルは、流動性が低いため、価格変動が大きいWETH/unshETH取引ペアの準備金に依存しています。
複数のオラクルに基づいて価格を計算する
価格クエリの信頼性を確保するには、信頼できるオラクルを使用する必要があります複数のオラクルまたは集約価格フィードトークンペア比率だけに依存するのではなく、価格を計算します。特にマイニングプールの流動性が低い状況では、この多様な価格情報源により価格データの精度が向上し、攻撃者によるデータの操作がより困難になる可能性があります。
これを達成するために考えられる解決策の 1 つは、Chainlink などの分散型オラクルを使用することです。 Chainlink オラクルは、さまざまなデータソースからデータを収集し、ブロックチェーンテクノロジーを使用してデータの正確性を検証および確認できます。 Chainlink は複数のデータ ソースを使用することで、単一障害点の可能性を減らし、攻撃者によるデータの操作をより困難にします。
以下は、Chainlink アグリゲーター コントラクトを使用して価格データを取得するコード例です。

上記のコードでは、AggregatorV3Interface タイプの配列を使用して複数の Oracle インスタンスを保存します。コンストラクターは、Oracle アドレスの配列をパラメーターとして受け取り、各アドレスを AggregatorV3Interface オブジェクトとしてインスタンス化します。
getlatestPrice 関数は、複数のデータ ソースから最新の価格データを取得するために使用されます。これは、priceFeeds 配列を反復処理し、各オラクルのlatestRoundData 関数を呼び出して価格データを取得します。すべての価格データは int 型の配列に格納され、呼び出し元に返されます。
このようにして、複数のデータ ソースから価格データを取得し、価格クエリが資産価格をより正確に反映できるようになります。
2. スマートコントラクトの脆弱性リスク
スマート コントラクトの脆弱性 スマート コントラクトの脆弱性とは、イーサリアムまたはその他のスマート コントラクト プラットフォーム上に記述されたコードのセキュリティ ホールまたはバグを指します。DeFi の中核はスマート コントラクトに基づく金融プロトコルであるため、スマート コントラクトの脆弱性はユーザーの資金の損失、市場操作、その他の悪意のある行為につながる可能性があります。
これらの脆弱性を特定することは重要です。私たち監査の対象となるのは、さまざまな潜在的な問題。これには、再入可能性の脆弱性、アクセス制御の脆弱性、整数オーバーフローの脆弱性、ビジネス ロジックの脆弱性が含まれますが、これらに限定されません。当社の包括的な監査サービスは、スマート コントラクトのセキュリティを強化し、これらのリスクから保護するように設計されています。
以下では、スマート コントラクトの脆弱性が DeFi に及ぼす影響を説明するために、アクセス制御の脆弱性を例として使用します。
LeetSwap アクセス制御の脆弱性
LeetSwapが攻撃されました、損失は340 ETHを超えました。根本的な原因は、LeetSwap V2 ペア コントラクトにアクセス制御の脆弱性があり、_transferFeesSupportingTaxTokens 関数の可視性が公開されていることです。
Attack Tx:
Vulnerable Contract:
https://basescan.org/address/0x94dac4a3ce998143aa119c05460731da80ad90cf
 攻撃者は、_transferFeesSupportingTaxTokens 関数を呼び出してプールを操作しました。攻撃プロセスは次のとおりです。
攻撃者は、_transferFeesSupportingTaxTokens 関数を呼び出してプールを操作しました。攻撃プロセスは次のとおりです。
- WETH を使用して別のトークン A と交換します。 
- トークン A を転送するために _transferFeesSupportingTaxTokens 関数が呼び出され、その後同期関数が呼び出されて、トークン A の価格が上昇します。 
- トークン A をさらに WETH と交換し、プールを空にします。 
解決
_transferFeesSupportingTaxTokens 関数のアクセス制御の脆弱性を修正するには、関数の可視性をプライベートまたは内部に変更する必要があります。コントラクト内の他の関数だけが関数を呼び出せるように、関数をプライベートとして宣言します。このコントラクトを継承するコントラクトからアクセスできるように、関数を内部関数として宣言します。他のコントラクトが LeetSwap V2 ペア コントラクトを継承する場合、super キーワードを使用して _transferFeesSupportingTaxTokens 関数を呼び出すことができます。外部ユーザーはこの機能に直接アクセスできないため、契約のセキュリティが向上します。
セキュリティを向上させながらコントラクトの通常の動作に影響を与えないようにするには、特定のコントラクト ロジックと要件に基づいて機能の可視性を変更する方法を決定する必要があります。
スマート コントラクトの監査は、脆弱性を特定して防止するための重要なステップです。存在するSalus,当社には、契約のセキュリティ強化を支援できる経験豊富なスマート コントラクト開発者と監査専門家のチームがいます。当社の専門知識により、潜在的な弱点を特定し、プロジェクトの安全性と信頼性を確保することができます。
3. ユーザーの運用リスク
DeFiの分野において、ユーザーの運用リスクとは、DeFiプラットフォームを使用する際のユーザー自身の運用ミス、セキュリティ意識の欠如、または軽率な行動によって引き起こされる資本損失のリスクを指します。一般的なユーザー行動のリスクは次のとおりです。
- 悪意のあるリンクをクリックする: ユーザーが誤って悪意のあるリンクをクリックすると、マルウェアやウイルスがデバイスに感染する可能性があり、攻撃者はこれを利用してユーザーの機密情報にアクセスしたり、ウォレットを制御したりする可能性があります。 
- 安全でないウォレットを使用する: ユーザーが安全でないウォレット アプリケーションまたはハードウェア ウォレットの使用を選択した場合、攻撃者はこれらの脆弱性を悪用してユーザーの秘密キーや操作権限を盗む可能性があります。 
- 秘密キーの漏洩: ユーザーが暗号化されていない環境で秘密キーを漏洩した場合、または秘密キーを安全でない場所に保管した場合、攻撃者がユーザーの秘密キーを簡単に入手して資金を管理する可能性があります。 
- 軽率な取引操作:取引の際、取引内容(宛先住所、取引金額等)をよく確認しないと、誤った宛先に送金されたり、誤った金額が送金される可能性があります。 
ユーザーの運用リスクを軽減するために、次のような提案があります。
- セキュリティ意識を高める: 一般的なフィッシング、マルウェア、詐欺の手口を理解し、それらを認識して回避する方法を学びます。 DeFi 関連のリンクやアプリケーションを注意深く調べてください。 
- 安全なウォレットを使用する: セキュリティ監査を受けており、評判の良いウォレット アプリまたはハードウェア ウォレットを使用することを選択します。ウォレットのアプリケーションとファームウェアが最新であることを確認し、セキュリティのベストプラクティスに従ってください。 
- 秘密キーをバックアップして保護する: 秘密キーを安全な場所に保管し、強力なパスワードで暗号化します。偶発的なデータ損失を防ぐために、秘密キーを定期的にバックアップし、オフラインの安全な場所に保管してください。 
- 取引詳細の再確認: 取引を実行する前に、取引詳細を再確認して、宛先アドレス、取引金額などが正しいことを確認してください。二重チェックを行うことで、過失による資金の損失を防ぐことができます。 
4. まとめ
上記の各攻撃や脆弱性に対する解決策は単純な例であり、対応する攻撃を完全に防止したり、対応する脆弱性を修正したりするものではないことにご注意ください。スマートコントラクトの監査に興味がある場合は、お問い合わせ、当社はお客様と協力して専門的な監査サービスを提供し、お客様の契約が安全で信頼できるものであることを確認します。当社は、お客様のスマート コントラクトが安全で信頼できる環境で確実に実行されるように、高品質のサービスと包括的な技術サポートを提供することに尽力しています。


