パラルニ攻撃イベントの分析

创宇区块链安全实验室
本文约1855字,阅读全文需要约7分钟
ハッカーは再入の脆弱性を悪用して Paraluni を攻撃し、170 万ドル以上の利益を得ました。そのうちの約 1/3 は Tornado に寄付されました。

1 はじめに

1 はじめに

北京時間の2022年3月13日、KNOW Chuangyu Blockchain Security LabはBSCのParaluniプロジェクトが攻撃され、ハッカーが約170万米ドルの利益を得たことを監視した。 Chuangyu Blockchain Security Lab がこの事件を徹底的にフォローアップし、分析することを知ってください。

2. 分析

2.1 基本情報

攻撃者のアドレス: 0x94bc1d555e63eea23fe7fdbf937ef3f9ac5fcf8f

攻撃者の契約: 0x4770b5cb9d51ecb7ad5b14f0d4f2cee8e5563645

攻撃トランザクション ハッシュ: 0x70f367b9420ac2654a5223cc311c7f9c361736a39fd4e7dff9ed1b85bab7ad54

マスターシェフ契約: 0xa386f30853a7eb7e6a25ec8389337a5c6973421d

UBT トークン コントラクト (攻撃者によって作成): 0xca2ca459ec6e4f58ad88aeb7285d2e41747b9134

UGT トークン コントラクト (攻撃者によって作成): 0xbc5db89ce5ab8035a71c6cd1cd0f0721ad28b508

2.2 プロジェクトの背景

Paraluni プロジェクトは、シンガポールの Parallel Universe Foundation によってリリースされた Binance Smart Chain に基づく匿名プロジェクトであり、ユーザーは、masterChef コントラクトと対話することで、トークンを誓約して流動性のメリットを得ることができます。

攻撃プロセスを明確にするために、この攻撃を 2 つの段階に分けて分析します。

  • 文章

攻撃前フェーズ

  • 1. 攻撃者は 2 つのトークン コントラクト UBT と UGT を作成して展開します。 UBT: TransferFrom 関数を書き換えて、MasterChef の Deposit() 関数とdrawAsset() 関数の呼び出しを実現します。 UGT: ERC20 トークン標準のトークン契約 2. 攻撃者はフラッシュ ローンを使用して、pancakeSwap から 156,984 BSC-USD と 157,210 BUSD を融資しました。 3. 融資されたUSDTとBUSDで対応するParaPairに流動性を追加し、UBT契約に155,935のParaluni LPトークンを取得します。このときに取得した Lp トークンは、その後の攻撃に対する重要なサポートとなります。

コアアタックステージ

1. MasterChef コントラクトで、depositByAddLiquidity 関数を呼び出します。受信パラメータは、_pid: 18、_token: [UGT, UBT]、_amounts: [1, 1] です。これは、18 の性別のプールに 1 つの UGT と 1 つの UBT を追加することを意味します。

2. 次に、内部的にdepositByAddLiquidityInternal関数を呼び出します。この関数の主な機能は、addLiquidityInternal関数を呼び出してLPトークンを生成し、その後、_deposit関数を呼び出してLPトークンをユーザーアドレスにデポジットすることです。ただし、この関数は、ユーザーによって渡された _tokens がプール番号 _pid のトークンと一致するかどうかを検証しません。これにより、攻撃者が作成および展開した悪意のあるトークンを使用して、後続の重要な操作を実行することが可能になります。

3.depositByAddLiquidityInternal は内部で addLiquidityInternal 関数を呼び出します。この関数は、コントラクト内の LP トークン残高の変更に必要なデポジットの金額を計算します。

4. addLiquidityInternal 関数が paraRouter.addLiquidity に対して呼び出されるとき、攻撃前フェーズで攻撃者によって展開された UBT トークン コントラクト内の transferFrom 関数が呼び出され、流動性追加操作が完了します。

しかし、悪意のあるコントラクトはtransferFromを書き換えた後、MasterChefのdeposit()関数を呼び出して、攻撃前段階の第3ステップで取得したLPトークンをmasterChefに転送しますが、このときmasterChef内のLP残高が変化しており、次に、_deposit 関数を呼び出して LP トークンをユーザーのアドレスにデポジットします。この時点で最初の LP トークンが取得されます。

次に、悪意のあるコントラクトの transferFrom が deposit() を呼び出すと、_deposit 関数も呼び出して LP トークンをユーザー アドレスにデポジットします。これは 2 つの LP トークンを取得するのと同等です。

5. 攻撃者は、UBT コントラクトのdrawAsset関数を呼び出し、その攻撃コントラクトを使用してMastechefコントラクトのwithdraw関数を呼び出し、2つの同一のLPを攻撃コントラクトに抽出します。

6. 最後に、流動性を除去して 310,000 BSC-USD と 310,000 BUSD を取得し、フラッシュ ローンを返済して攻撃は完了します。

3. 脆弱性の核心

この攻撃は主に、MasterCheif コントラクトの DepositByAddLiquidity 関数が、ユーザーによって渡された _token がプール番号 _pid のトークンと一致するかどうかを検証しなかったこと、および外部呼び出しで再エントリの問題が考慮されていなかったことに起因します。その結果、攻撃者は外部の悪意のあるトークン コントラクトを渡して再入攻撃を行うことができます。

4. まとめ