2024 年 3 月 28 日、Prisma Finance はフラッシュ ローン攻撃を受け、プロジェクトは約 1,221 万米ドルを失いました。
SharkTeam はこのインシデントの技術分析を実施し、セキュリティ上の注意事項をまとめました。今後のプロジェクトがこれから学び、ブロックチェーン業界のセキュリティ ラインを共同で構築できることを期待しています。
攻撃者 1: 0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202 (0x7e39 と省略)
攻撃契約 1: 0xd996073019c74b2fb94ead236e32032405bc027c (0xd996 と省略)
攻撃者 2: 0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
攻撃契約 2: 0x4148310fe4544e82f176570c6c7b649290a90e17
攻撃対象コントラクト: 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
この攻撃には 16 のトランザクションが含まれており、最初の攻撃トランザクションを例に挙げます。
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
攻撃プロセスは次のとおりです。
1. アドレス 0x56a201b872b50bbdee0021ed4d1bb36359d291ed (0x56a2 と省略) にあるターゲット契約のすべての担保と負債を読み取ります。
返された結果は次のとおりです。
返された結果は次のとおりです。
アドレス 0x56a2 には、対象契約の担保として合計 1,745 wstETH があり、負債総額は 1,442,100 mkUSD です。
2. 攻撃者 0x7e39 は、攻撃コントラクト 0xd996 を通じて、mkUSD 債務コントラクトの flashLoan 関数を呼び出します。
パラメーター受信者は MigrateTroveZap に設定され、金額は上記でクエリされたすべての負債です。
次に、受信側 (ここでは MigrateTroveZap) の onFlashLoan 関数が flashLoan 関数内で呼び出されます。
onFlashLoan 関数は、最初にフラッシュ ローンを通じて元の負債をすべて返済し、受け手に担保を引き出し、次に受け手が一定量の担保を再度抵当に入れて一定量の借金を借ります。次の 2 つの主要な関数があります。
(1) closeTrove 関数、借金を返済し、すべての担保 (1745.08 swtETH) を troverManager から受取人に引き出します (これは MigrateTroveZap コントラクトです)。
(2) openTrove 関数、受信者は 463.18 wstETH を troverManager に再抵当し、1,443,598 mkUSD の負債を負います。
上記のデータから、flashLoan 関数が実行された後、troverManager から抽出され、アドレス 0x56a2 に属する担保がまだ受信機に保持されており、その金額は約 1745.08 – 463.18 = 1281.90 wstETH であることがわかります。
3. 攻撃者 0x7e39 は、コントラクト 0xd996 を攻撃することにより、フラッシュ ローンを通じてバランサーから 1 wstETH を借りました。
次に、1 wstETH を住宅ローンにして 2000 mkUSD の借金を借り、手数料を加えた場合、合計借金は 2200 mkUSD になります。
4. ステップ 2 と同様に、mkUSD 債務コントラクトの flashLoan 関数を呼び出します。ここではパラメータ受信者はまだ MigrateTroveZap に設定されており、金額は 1 wstETH を約束した後の債務全体、つまり 2000 mkUSD です。 FlashLoan 関数では、受信側の onFlashLoan 関数が呼び出され、続いて closeTrove 関数と openTrove 関数が呼び出されます。
ただし、ここでの closeTrove 関数と openTrove 関数のパラメーター アカウントは、上記のアドレス 0x56a2 ではなくなり、1 wstETH を約束する攻撃コントラクト 0xd996 になります。
(1) closeTrove 関数、借金を返済し、すべての担保 (1 swtETH) を troverManager から受取人に引き出します (これは依然として MigrateTroveZap 契約です)。この時点で、受信機には 1281.90 +1=1282.90 wstETH が存在します。
(2) openTrove 関数。受信者は 1282.80 wstETH (ほぼ全額) を troverManager に再抵当し、2001.8 mkUSD の負債を負います。
実際、ここで担保にある 1281.80 wstETH は、攻撃コントラクト 0xd996 に属しているのではなく、上記のアドレス 0x56a2 に属しています。
5. 最後に、攻撃者 0x7e39 は、攻撃コントラクト 0xd996 を通じて個別に closeTrove 関数を呼び出し、抵当に設定された 1282.80 wstETH を攻撃コントラクト 0xd996 に抽出しました。
フラッシュローンを返済した後も、攻撃者は 1281.80 wstETH (約 230 万米ドル) の利益を得ました。
このインシデントの根本原因は、プロジェクト契約にロジックと権限の検証があり、攻撃者がこの脆弱性を利用して他のアカウント アドレスから質入された資産を取得できることです。
攻撃者が最終的に取得した wstETH は、troverManager コントラクトの元のアドレス 0x56a2 の担保であり、mkUSD コントラクトの flashLoan 関数を通じて、MigrateTroveZap コントラクトの onFlashLoan 関数のパラメータをカスタマイズし、MigrateTroveZap を使用して担保に変換しました。攻撃コントラクトを抽出し、それを使ってコントラクトを攻撃したので、それを抽出します。
攻撃者は、mkUSD コントラクトの flashLoan 関数および MigrateTroveZap コントラクトの onFlashLoan 関数を通じて、他のアカウント アドレスの住宅ローンと引き出しを操作します。
(1) flashLoan 関数にはパラメータ受信者アドレスの検証がありません。onFlashLoan 関数の受信者は口座のすべての担保を受け取るため、受信者は信頼できると検証される必要があるためです。
(1) flashLoan 関数にはパラメータ受信者アドレスの検証がありません。onFlashLoan 関数の受信者は口座のすべての担保を受け取るため、受信者は信頼できると検証される必要があるからです。
(2) onFlashLoan 関数にはアカウント アドレスの検証がありません。closeTrove 関数と openTrove 関数は両方とも運用されているアカウントの資産であるため、アカウントに権限検証を追加する必要があります。
これら 2 つのアドレス パラメーターの検証に加えて、数量パラメーターと flashLoan 関数の実装ロジックも検証する必要がある場合があります。
この攻撃に対応するには、開発プロセス中に次の予防措置に従う必要があります。
(1) プロジェクトの設計および開発プロセス中、特に資産の譲渡を伴う場合には、ロジックの完全性と厳密性を維持する必要があり、呼び出し元が確実に機能研究許可を取得できるようにするための検証を強化する必要もあります。 、呼び出し関数、関数パラメータ、転送ロジックなどはすべて安全で信頼できます。
(2) プロジェクトがオンラインになる前に、契約監査を実施する専門の第三者監査チームを見つける必要があります。
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
電報: https://t.me/sharkteamorg
ディスコード: https://discord.gg/jGH9xXCjDZ
全てのコメント