背景の紹介

最近、BnbSmartChain のプロジェクトDCFTokenに対するオンチェーン攻撃を監視しました。

https://bscscan.com/tx/0xa88b907960c3c5a9dfcfd28aff12136359034653e34fa6d7bb9a6ef9c7a0532f

攻撃されたプロジェクトは DCFToken であり、攻撃者はこの攻撃により約 8,800 米ドルの利益を得ました。

攻撃とインシデントの分析

まず、攻撃者は新しいコントラクトを作成し、そのコントラクトを呼び出します。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

次に、フラッシュを使用して PancakeSwapV3Pool から 2,750,000 BUSDT を借りた契約です。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

その後、攻撃者はフラッシュから借りた初期資金を使用して DCFToken への攻撃を開始しました。最初のステップでは、攻撃者はプロジェクトの未開封のコントラクトの交換関数 (BUSDT から DUSD) を使用して、コントラクトのすべての DUSD を BUSDT と交換します。この関数の署名は 0xabb81c12 です。

逆コンパイルすると、次のようにこの関数の具体的な実装が得られます。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

最初のステップ:

コードから、BUSDT と DUSD の交換比率は stor_5 によって制御されていることがわかります。攻撃中は stor_5 が 1000 であるため、BUSDT と DUSD の交換比率は 1:1 になります。したがって、攻撃者は 10,927 BUSDT を使用して、コントラクト内のすべての DUSD を交換しました。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

ステップ 2:

DUSD を使用して DCFToken を購入します。この関数の署名は 0x62ee2f14 です。逆コンパイルすると、次のように具体的な実装を確認できます。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

簡単に言えば、この関数は DUSD を使用して DCFToken を購入する機能を実装します。購入価格は PancakeSwapV2 の BUSDT と DCFToken の価格によって決まります。これは、この関数のロジックでは、DUSD と BUSDT の価格が 1:1 であることを意味します。

その後、購入した DCFToken の 1% がシステム アドレスに転送されます。

次に、攻撃者は最初のステップで購入したすべての DUSD を使用して DCFToken を購入しました。

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

その後、攻撃者は、プロジェクト側が DUSD と DCFToken の交換に使用されるコントラクト内の DCF をショートさせるまで、上記の手順を繰り返します。その後、攻撃者は PancakeSwapV2 の交換機能を使用して、手持ちの DCFToken を BUSDT に交換し、DCFToken の価格を操作しました。この交換の後、DCFToken の価格は 1 BUSDT = 126 DCFToken から 1BUSDT = 3 DCFToken に上昇しました。

償還前:

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

償還後:

ゼロアワー テクノロジー DCFToken 攻撃イベント分析

ステップ 3:

攻撃者はプロジェクト コントラクトの DCFToken を空にした後、コントラクトの DCFToken を使用して DUSD と交換します。この関数の署名は 0xd5088d27 であり、2 番目のステップで DUSD を使用して DCFToken を購入するのと似ています。同様に、購入価格は PancakeSwapV2 の BUSDT と DCFToken の価格によって決まります。これは、この関数のロジックでは、DUSD と BUSDT の価格が 1:1 であることを意味します。その後、購入した DUSD の 1% がシステム アドレスに転送されます。

ゼロアワー テクノロジー DCFToken 攻撃インシデント分析

ステップ 4:

次に、攻撃者は、プロジェクト当事者のコントラクトで DUSD を BUSDT に交換する関数を使用します。この関数の署名は 0xfea1cdc9 で、交換比率は 1:1 ですが、BUSDT の 1% がプロジェクト当事者のアドレスに転送されます。

ゼロアワー テクノロジー DCFToken 攻撃インシデント分析

攻撃者は、プロジェクト契約の BUSDT が空になるまで、ステップ 3 と 4 を繰り返します。

最後に、攻撃者は残りの DCFToken を使用し、PancakeSwapV2 を使用してすべてを BUSDT に交換し、フラッシュ ローンと利息を返した後、8,763 BUSDT の利益を得ました。

端的に言えば、このプロジェクトの抜け穴は為替の価格計算に現れている。 DCFToken の価格は PancakeSwap に依存しますが、プロジェクト契約交換の使用は DCFToken の価格に影響しません。したがって、攻撃者はまず BUSDT を使用して DUSD に交換し、次に DCF (99%) に交換して DCFToken を空にし、次に PancakeSwap のスワップを使用して DCFToken の価格を上げ、最後に DCFToken を使用して DUSD (99%) に交換します。 BUSDT (99%) と交換して利益を確定します。

要約する

この脆弱性の主な原因は、DCFToken プロジェクト パーティのコントラクトが DCFToken の価格を取得するときに、単一のソースである PancakeSwapV2 を通じて計算するため、価格が攻撃者によって操作され、最終的には価格の差が裁定取引に使用されることです。プロジェクト当事者は、経済モデル、価格計算メカニズム、およびコード操作ロジックを設計するときに複数の当事者による検証を実施し、契約がオンラインになる前に相互監査のために複数の監査会社を選択するよう努めることをお勧めします。