2024 年 1 月 30 日、MIM_SPELL はフラッシュ ローン攻撃を受け、精度計算の脆弱性により、プロジェクトは 650 万ドルを失いました。
SharkTeam はこのインシデントの技術分析を直ちに実施し、セキュリティ上の注意事項をまとめましたので、今後のプロジェクトがこれを教訓にして、ブロックチェーン業界のセキュリティ防御ラインを共同で構築できることを期待しています。
攻撃者のアドレス:
0x87F585809Ce79aE39A5fa0C7C96d0d159eb678C9
攻撃契約:
0xe1091d17473b049cccd65c54f71677da85b77a45
0x13AF445F81B0DEcA5dCb2Be6A4C691F545c95912
0xe59b54a9e37ab69f6e9312a9b3f72539ee184e5a
攻撃された契約:
0x7259e152103756e1616A77Ae982353c3751A6a90
攻撃トランザクション:
0x26a83db7e28838dd9fee6fb7314ae58dcc6aee9a20bf224c386ff5e80f7e4cf2
0xdb4616b89ad82062787a4e924d520639791302476484b9a6eca5126f79b6d877
攻撃プロセス:
1. 攻撃者 (0x87F58580) は、フラッシュ ローンを通じて 300,000 MIM トークンを借りました。
2. その後、ユーザーのローン返済の次のステップのために、240,000 MIM トークンが攻撃されたコントラクト (0x7259e1520) に送信されました。
2. その後、ユーザーのローン返済の次のステップのために、240,000 MIM トークンが攻撃されたコントラクト (0x7259e1520) に送信されました。
3. 次に、攻撃者 (0x87F58580) は、repayForAll 関数を呼び出して他のユーザーのローンを返済し、その後、repay 関数を呼び出して他のユーザーのローンを返済して、弾性変数を 0 に削減します。
4. elastic 変数が 0 に減らされた後、攻撃者 (0x87F58580) は新しい攻撃コントラクト (0xe59b54a9) を作成し、elastic = 0 およびbase = 120080183810681886665215049728 になるまで借用関数と返済関数を継続的に呼び出します。
5. 次に、攻撃者 (0x87F58580) は、DegenBox コントラクトの借用関数と引き出し関数を呼び出して、5,000,047 個の MIM トークンを貸し出しました。
5. 次に、攻撃者 (0x87F58580) は、DegenBox コントラクトの借用関数と引き出し関数を呼び出して、5,000,047 個の MIM トークンを貸し出しました。
6. 攻撃者 (0x87F58580) はフラッシュ ローン機能を返し、4,400,000 MIM トークンを 1,807 ETH に交換し、この取引から得た利益は約 450 W でした。
攻撃の本質は、融資変数の計算時に精度の問題があり、これにより主要な変数の弾性値と基準値が操作され、比率のバランスが崩れ、その結果、担保額と融資額の計算時に問題が発生することです。最終的には MIM トークンの過剰な貸し出しにつながります。
攻撃されたコントラクト (0x7259e1520) の借用関数と返済関数はどちらも、弾性変数と基本変数を計算するときに上方丸め方法を使用します。
攻撃者 (0x87F58580) は、最初に他のユーザーのローンを返済することで、エラスティック変数とベース変数をそれぞれ 0 と 97 に設定しました。
その後、borrow 関数と repay 関数が連続して呼び出され、パラメータの amount は両方とも 1 になります。borrow 関数が初めて呼び出されたときは、elastic=0 であるため、上記の if ロジックが実行され、add 関数に返されます。これにより、elastic = 1、base = 98 となります。
次に、攻撃者 (0x87F58580) は、borrow 関数を呼び出して 1 を渡します。 elastic=1 であるため、else ロジックが実行され、計算された戻り値は 98 になります。このようにして、add 関数に戻ると、elastic=2 となり、基本変数は 196 です。
しかし、このとき、攻撃者 (0x87F58580) は、repay 関数を呼び出し、1 を渡します。 elastic=2 なので、else ロジックが実行されます。計算された elastic 変数は、もともと 1*2/98 =0 でしたが、次の手順により計算されます。を切り上げた結果、計算された戻り値は 1 になります。そのため、サブ関数に戻ると、エラスティック変数は 1 に戻り、ベース変数は 195 になります。
借入-返済ループの後、エラスティック変数は変化せず、ベース変数はほぼ 2 倍になることがわかります。この脆弱性を利用して、ハッカーは借入-返済関数を頻繁にループし、最後にもう一度 repay を呼び出し、最終的に elastic=0 にします。ベース = 120080183810681886665215049728。
elastic 変数と Base 変数の比率が著しく不均衡な場合、攻撃者 (0x87F58580) は、溶媒修飾子の制限を通過するために少量の担保を追加することで、大量の MIM トークンを貸与することができます。
この攻撃に対応するには、開発プロセス中に次の予防措置に従う必要があります。
1. 精度計算に関連するロジックを開発する場合は、精度と丸めを慎重に考慮してください。
2. プロジェクトがオンラインになる前に、専門のサードパーティ監査チームがスマート コントラクト監査を実施する必要があります。
SharkTeam のビジョンは、Web3 の世界を保護することです。このチームは、ブロックチェーンとスマート コントラクトの基礎理論に精通した、世界中から集まった経験豊富なセキュリティ専門家と上級研究者で構成されています。オンチェーンビッグデータ分析、オンチェーンリスク警告、KYT/AML、スマートコントラクト監査、暗号化資産回復などのサービスを提供し、オンチェーンインテリジェントリスク識別プラットフォームChainAegisを構築しました。詳細なグラフ分析を提供し、Web3 の世界での高度持続的脅威 (APT) と効果的に戦うことができます。 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、Collab.Land など、Web3 エコシステムのさまざまな分野の主要企業と長期的な協力関係を確立しています。
公式ウェブサイト:https://www.sharkteam.org
Twitter: https://twitter.com/sharkteamorg
ディスコード: https://discord.gg/jGH9xXCjDZ
電報: https://t.me/sharkteamorg
全てのコメント