
2024 年 3 月 28 日、Prisma Finance はフラッシュ ローン攻撃を受け、プロジェクトは約 1,221 万米ドルを失いました。
SharkTeam はこのインシデントの技術分析を実施し、セキュリティ上の注意事項をまとめました。今後のプロジェクトがこれから学び、ブロックチェーン業界のセキュリティ防御ラインを共同で構築できることを期待しています。
1. Prisma Finance攻撃トランザクション分析
攻撃者 1: 0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202 (0x 7 e 39 と省略)
攻撃契約 1: 0xd996073019c74b2fb94ead236e32032405bc027c (0x d 996 と省略)
攻撃者 2: 0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
攻撃契約 2: 0x4148310fe4544e82f176570c6c7b649290a90e17
攻撃対象コントラクト: 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
この攻撃には 16 のトランザクションが含まれており、最初の攻撃トランザクションを例に挙げます。
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
攻撃プロセスは次のとおりです。
1. アドレス 0x56a201b872b50bbdee0021ed4d1bb36359d291ed (0x 56 a 2 と省略) にあるターゲット契約のすべての担保と負債を読み取ります。
返された結果は次のとおりです。
アドレス 0x 56 a 2 対象契約の担保総額は 1,745 wstETH、負債総額は 1,442,100 mkUSD です。
2. 攻撃者 0x 7 e 39 は、コントラクト 0x d 996 を攻撃して、mkUSD 債務コントラクト内の flashLoan 関数を呼び出します。
パラメーター受信者は MigrateTroveZap に設定され、金額は上記でクエリされたすべての負債です。
次に、受信側 (ここでは MigrateTroveZap) の onFlashLoan 関数が flashLoan 関数内で呼び出されます。
onFlashLoan 関数は、最初にフラッシュ ローンを通じて元の負債をすべて返済し、受け手に担保を引き出し、次に受け手が一定量の担保を再度抵当に入れて一定量の借金を借ります。主に次の 2 つの関数があります。
(1) closeTrove 関数、借金を返済し、troverManager から受信者にすべての担保 (1745.08 swtETH) を抽出します (ここに MigrateTroveZap コントラクトがあります)。
(2) openTrove 関数、受信者は 463.18 wstETH を troverManager に再抵当し、1,443,598 mkUSD の負債を負います。
上記のデータから、flashLoan 関数が実行された後も、受信者はアドレス 0x 56 a 2 に属する troverManager から抽出された担保を保持しており、その額は約 1745.08 – 463.18 = 1281.90 wstETH であることがわかります。
3. 攻撃者 0x 7 e 39 は、コントラクト 0x d 996 を攻撃することにより、フラッシュ ローンを通じてバランサーから 1 wstETH を借りました。
次に、1 wstETH を抵当に入れ、2000 mkUSD の借金と手数料を借りて、合計 2200 mkUSD の負債になります。
4. ステップ 2 と同様に、mkUSD 債務コントラクトの flashLoan 関数を呼び出します。ここでは、パラメータ受信者は依然として MigrateTroveZap に設定されており、金額は 1 wstETH の最後の誓約後の債務全体、つまり 2000 mkUSD です。 FflashLoan 関数では、受信側の onFlashLoan 関数が呼び出され、続いて closeTrove 関数と openTrove 関数が呼び出されます。
ただし、closeTrove 関数と openTrove 関数のパラメーター アカウントは、上記のアドレス 0x 56 a 2 ではなくなり、1 wstETH を約束する攻撃コントラクト 0x d 996 になります。
(1) closeTrove 関数、借金を返済し、すべての担保 (1 swtETH) を troverManager から受取人に引き出します (ここにはまだ MigrateTroveZap 契約があります)。この時点で、受信機には 1281.90 + 1 = 1282.90 wstETH が存在します。
(2) openTrove 関数、受信者は 1282.80 wstETH (ほぼ全額) を troverManager に再抵当し、2001.8 mkUSD の負債を負います。
実際、ここで担保にある 1281.80 wstETH は、攻撃コントラクト 0x d 996 に属しているのではなく、上記のアドレス 0x 56 a 2 に属しています。
5. 最後に、攻撃者 0x 7 e 39 は、攻撃コントラクト 0x d 996 を通じて closeTrove 関数を個別に呼び出し、抵当に設定された 1282.80 wstETH を攻撃コントラクト 0x d 996 に抽出しました。
フラッシュローンを返済した後も、攻撃者は 1281.80 wstETH (約 230 万米ドル) の利益を得ました。
2. 脆弱性分析
このインシデントの根本原因は、プロジェクト契約にロジックと権限の検証があり、攻撃者がこの脆弱性を利用して他のアカウント アドレスから質入された資産を取得できることです。
攻撃者が最終的に取得した wstETH は、troverManager コントラクトの元のアドレス 0x 56 a 2 の担保であり、mkUSD コントラクトの flashLoan 関数を通じて、MigrateTroveZap コントラクトの onFlashLoan 関数のパラメータがカスタマイズされ、MigrateTroveZap がそれを攻撃契約の担保に変換し、抽出します。
攻撃者は、mkUSD コントラクトの flashLoan 関数および MigrateTroveZap コントラクトの onFlashLoan 関数を通じて、他のアカウント アドレスの住宅ローンと引き出しを操作します。
(1) flashLoan 関数にはパラメータ受信者アドレスの検証がありません。onFlashLoan 関数の受信者は口座のすべての担保を受け取るため、受信者は信頼できると検証される必要があるためです。
(2) onFlashLoan 関数にはアカウント アドレスの検証がありません。closeTrove 関数と openTrove 関数は両方とも運用アカウントの資産であるため、アカウントに権限検証を追加する必要があります。
これら 2 つのアドレス パラメーターの検証に加えて、数量パラメーターと flashLoan 関数の実装ロジックも検証する必要がある場合があります。
3. 安全に関する提案
この攻撃に対応するには、開発プロセス中に次の予防措置に従う必要があります。
(1) プロジェクトの設計および開発プロセス中、特に資産の譲渡を伴う場合には、ロジックの完全性と厳密性を維持する必要があり、呼び出し元が確実に機能研究許可を取得できるようにするための検証を強化する必要もあります。 、呼び出し関数、関数パラメータ、転送ロジックなどはすべて安全で信頼できます。
(2) プロジェクトがオンラインになる前に、契約監査を実施する専門の第三者監査チームを見つける必要があります。
About Us
SharkTeam のビジョンは、Web3 の世界を保護することです。このチームは、ブロックチェーンとスマート コントラクトの基礎理論に精通した、世界中から集まった経験豊富なセキュリティ専門家と上級研究者で構成されています。リスクの特定とブロック、スマートコントラクト監査、KYT/AML、オンチェーン分析などのサービスを提供し、高度な持続的脅威(高度な持続的脅威)に効果的に対抗できるオンチェーンのインテリジェントなリスク特定とブロックプラットフォームChainAegisを作成しました。 Web3 の世界における Persistent Threat)、APT)。 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、Collab.Land など、Web3 エコシステムのさまざまな分野の主要企業と長期的な協力関係を確立しています。
公式ウェブサイト:https://www.sharkteam.org
Twitter:https://twitter.com/sharkteamorg
Telegram:https://t.me/sharkteamorg
Discord:https://discord.gg/jGH9xXCjDZ