# 分散型金融常見のセキュリティ脆弱性と予防策最近、安全専門家がコミュニティのメンバーに分散型金融の安全知識を共有しました。彼はWeb3業界が過去1年以上にわたって遭遇した重大なセキュリティ事件を振り返り、事件が発生した原因と回避方法を探り、一般的なスマートコントラクトのセキュリティ脆弱性と予防策をまとめ、いくつかの安全に関する提言をしました。一般的な分散型金融の脆弱性には、フラッシュローン、価格操縦、関数権限の問題、任意の外部呼び出し、フォールバック関数の問題、ビジネスロジックの脆弱性、秘密鍵の漏洩、再入攻撃などが含まれます。この記事では、フラッシュローン、価格操縦、再入攻撃の3つのタイプに重点を置いて説明します。## フラッシュローンフラッシュローン自体は分散型金融の一種の革新ですが、ハッカーに利用されると、無コストで大量の資金を借り入れて攻撃することができます。一般的な攻撃はフラッシュローンを伴うことが多く、攻撃者は大量の資金を借りた後、価格を操作したり、ビジネスロジックを攻撃したりします。開発者は、契約機能が巨額の資金によって異常を引き起こすか、あるいは不当な利益を得るために1回の取引で複数の関数と相互作用するために悪用されるかどうかを考慮する必要があります。いくつかのプロジェクトは、固定された時間に保有量に基づいて報酬を配布しますが、攻撃者がフラッシュローンを利用して大量のトークンを購入し、大部分の報酬を得ることがあります。また、いくつかのプロジェクトはトークンで価格を計算しますが、フラッシュローンの影響を受ける可能性があります。プロジェクト側はこれらの問題に注意を払うべきです。## 価格操作価格操作問題はフラッシュローンと密接に関連しており、主に2種類があります:1. 価格を計算する際に第三者データを使用しますが、使用方法が正しくないか、チェックが欠けているため、価格が悪意を持って操作されることがあります。2. 特定のアドレスのトークン数を計算変数として使用し、これらのアドレスのトークン残高は一時的に増減する可能性があります。## リエントランシー攻撃外部契約を呼び出す主なリスクは、それらが制御フローを引き継ぎ、データに意図しない変更を加える可能性があることです。例えば:ソリディティマッピング (address => uint) private userBalances;関数 withdrawBalance() public { uint amountToWithdraw = userBalances[msg.sender]; 成功(bool、) = msg.sender.call.value(amountToWithdraw)("" ); require(success); userBalances[msg.sender] = 0;}残高は関数の最後まで0に設定されないため、繰り返し呼び出すと成功して引き出すことができます。再入攻撃の方法は多様であり、複数の関数やコントラクトが関与する可能性があります。再入問題を解決する際には注意が必要です:1. 単一の関数の再入を防ぐだけではない2. Checks-Effects-Interactionsパターンのコーディングに従います 3. 検証済みの再入防止モディファイアを使用する成熟したセキュリティプラクティスをできるだけ使用し、輪を再発明することを避けるべきです。## プロジェクトチームの安全に関する提案1. 契約開発は最良のセキュリティプラクティスに従う2. コントラクトはアップグレード可能で、一時停止できます: 迅速に発見し、損失を軽減する3. タイムロックを採用する: チェックと反応の時間を与える4. 完全なセキュリティシステムを構築する: リスクを回避する5. 全ての従業員の安全意識を高める6. 内部の悪用を防ぎ、効率を向上させつつリスク管理を強化する7. 第三者を慎重に導入する: 上流と下流の安全性を検証する## ユーザーはスマートコントラクトの安全性をどのように判断するか1. コントラクトはオープンソースですか2. Ownerは去中心化されたマルチシグを採用していますか?3. コントラクトの既存の取引状況を確認する4. 契約はアップグレード可能か、時間ロックはあるか5. 複数の機関による監査を受け入れるか、オーナーの権限が過大であるか6. オラクルの信頼性に注意する総じて、分散型金融の分野では安全が非常に重要です。プロジェクト側とユーザーはともに警戒を強め、リスクを低減するために必要な措置を講じるべきです。! [Cobo DeFiセキュリティセクション(パートII):D eFiの一般的なセキュリティの脆弱性と防止](https://img-cdn.gateio.im/social/moments-cf2aa755426b31e8f21cbb05cc1fe39a)
DeFiの3つの主要なセキュリティ脆弱性(フラッシュローン、価格操作、リエントランシー攻撃)の分析
分散型金融常見のセキュリティ脆弱性と予防策
最近、安全専門家がコミュニティのメンバーに分散型金融の安全知識を共有しました。彼はWeb3業界が過去1年以上にわたって遭遇した重大なセキュリティ事件を振り返り、事件が発生した原因と回避方法を探り、一般的なスマートコントラクトのセキュリティ脆弱性と予防策をまとめ、いくつかの安全に関する提言をしました。
一般的な分散型金融の脆弱性には、フラッシュローン、価格操縦、関数権限の問題、任意の外部呼び出し、フォールバック関数の問題、ビジネスロジックの脆弱性、秘密鍵の漏洩、再入攻撃などが含まれます。この記事では、フラッシュローン、価格操縦、再入攻撃の3つのタイプに重点を置いて説明します。
フラッシュローン
フラッシュローン自体は分散型金融の一種の革新ですが、ハッカーに利用されると、無コストで大量の資金を借り入れて攻撃することができます。一般的な攻撃はフラッシュローンを伴うことが多く、攻撃者は大量の資金を借りた後、価格を操作したり、ビジネスロジックを攻撃したりします。
開発者は、契約機能が巨額の資金によって異常を引き起こすか、あるいは不当な利益を得るために1回の取引で複数の関数と相互作用するために悪用されるかどうかを考慮する必要があります。
いくつかのプロジェクトは、固定された時間に保有量に基づいて報酬を配布しますが、攻撃者がフラッシュローンを利用して大量のトークンを購入し、大部分の報酬を得ることがあります。また、いくつかのプロジェクトはトークンで価格を計算しますが、フラッシュローンの影響を受ける可能性があります。プロジェクト側はこれらの問題に注意を払うべきです。
価格操作
価格操作問題はフラッシュローンと密接に関連しており、主に2種類があります:
価格を計算する際に第三者データを使用しますが、使用方法が正しくないか、チェックが欠けているため、価格が悪意を持って操作されることがあります。
特定のアドレスのトークン数を計算変数として使用し、これらのアドレスのトークン残高は一時的に増減する可能性があります。
リエントランシー攻撃
外部契約を呼び出す主なリスクは、それらが制御フローを引き継ぎ、データに意図しない変更を加える可能性があることです。例えば:
ソリディティ マッピング (address => uint) private userBalances;
関数 withdrawBalance() public { uint amountToWithdraw = userBalances[msg.sender]; 成功(bool、) = msg.sender.call.value(amountToWithdraw)("" ); require(success); userBalances[msg.sender] = 0; }
残高は関数の最後まで0に設定されないため、繰り返し呼び出すと成功して引き出すことができます。
再入攻撃の方法は多様であり、複数の関数やコントラクトが関与する可能性があります。再入問題を解決する際には注意が必要です:
成熟したセキュリティプラクティスをできるだけ使用し、輪を再発明することを避けるべきです。
プロジェクトチームの安全に関する提案
契約開発は最良のセキュリティプラクティスに従う
コントラクトはアップグレード可能で、一時停止できます: 迅速に発見し、損失を軽減する
タイムロックを採用する: チェックと反応の時間を与える
完全なセキュリティシステムを構築する: リスクを回避する
全ての従業員の安全意識を高める
内部の悪用を防ぎ、効率を向上させつつリスク管理を強化する
第三者を慎重に導入する: 上流と下流の安全性を検証する
ユーザーはスマートコントラクトの安全性をどのように判断するか
コントラクトはオープンソースですか
Ownerは去中心化されたマルチシグを採用していますか?
コントラクトの既存の取引状況を確認する
契約はアップグレード可能か、時間ロックはあるか
複数の機関による監査を受け入れるか、オーナーの権限が過大であるか
オラクルの信頼性に注意する
総じて、分散型金融の分野では安全が非常に重要です。プロジェクト側とユーザーはともに警戒を強め、リスクを低減するために必要な措置を講じるべきです。
! Cobo DeFiセキュリティセクション(パートII):D eFiの一般的なセキュリティの脆弱性と防止