ゼロタイム テクノロジー|| OKC プロジェクト攻撃イベントの分析

イベントの背景

2023-11-13 18:51:57 (UTC) チェーン上で OKC トークンへの攻撃が発生し、ハッカーは欠陥のある MinerPool を通じて即座に利益を得ました。

トランザクションのハッキング:

0xd85c603f71bb84437bc69b21d785f982f7630355573566fa365dbee4cd236f08

ハッキング契約 1:

0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9

ハッキング契約 2:

0x617432Fc98c1fFaAB62B8cB94Cef6D75ABD95598

ハッキング契約 3:

0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974

攻撃者のアドレス:

0xbbcc139933D1580e7c40442E09263e90E6F1D66D

脆弱な契約:

0x36016C4F0E0177861E6377f73C380c70138E13EE (マイナープール)

攻撃分析

チェーン上の取引データを分析することで、その取引を整理・要約します。

ハッカーはまず複数のフラッシュローンを通じて攻撃資金を調達し、合計2,753,399のUSDTトークンを借り入れました。

その後、130,000 USDT トークンがすぐに最小単位の USDT トークンと 27,264 OKC トークンに変換されました。

PancakeSwapv2 は AMM (定数関数マーケット メーカー) を使用するため、このモデルでは、取引プール内の 2 つのトークンの量の積は定数になります。それは次の式で表すことができます。

で:

• x は、取引プール内の最初のトークンの番号です。

• y は、取引プール内の 2 番目のトークンの数です。

• k は、プール内の 2 つのトークンの量の積を表す定数です。

トレーダーがあるトークンを別のトークンと交換したい場合、不変性を維持するために、トレーディング プール内の 1 つのトークン (dx) の量を増やす一方で、もう 1 つのトークン (dy) の量を減らします。このプロセスにより、トークンの相対価格が変化します。

トレーダーがトークン A をトークン B に交換したいと仮定すると、取引の前後で定数積の公式が成り立つはずです。

k は定数なので、トランザクションの前後で x・y が同じであることを意味します。ただし、トレーダーはトークン A (dx) の量を増やし、トークン B (dy) の量を減らすため、トークン B の価格が上昇します。

トークンの即時価格は、プール内の 2 つのトークンの数の比率を計算することで計算できます。トークン A が x で、トークン B が y の場合、トークン A に対するトークン B の価格は y/x です。取引後、トークン B の量が減少し、トークン A の量が増加するため、新しい価格は (y-dy)/(x+dy) になります。分子が減少し、分母が増加するため、比率が小さくなり、トークン B の価格が上昇することを意味します。

大規模な取引の場合、dx と dy は非常に大きくなり、大きな値動きを引き起こす可能性があります。これは、k を一定に保つために、dx の増加を補うために大量の dy をプールから除去する必要があるためです。この大規模な取引がプール内のトークンの数に与えた多大な影響により、価格が大幅に変動しました。

したがって、攻撃者はOKCを購入するために多額のフラッシュローン資金を使用しました。その結果、OKCの数が減少し、それによってOKCトークンの価格が上昇し、価格が1 OKC = 0.3 USDTから1 OKC = 68.9 USDTに上昇しました。 。

その後、攻撃者は 2 つのコントラクト アドレスを作成し、それぞれ 0.01 OKC と 0.0001 USDT、および OKC の最小単位を 2 つのアドレスに送信しました。

次に、ハッカーはメインの攻撃コントラクトを使用して、PancakePair_USDT_OKC プールに流動性操作を追加し、約 225,705 LP トークンを取得しました。

次に、すべての LP トークンが攻撃者によって作成された 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 攻撃コントラクトに転送され、脆弱なコントラクトの processLPReward 関数がすぐに呼び出され、コントラクトに保存されている lpHolder アドレスに報酬が割り当てられます。ここでの攻撃者の操作は MinerPool コントラクトに送金することだけですが、コントラクトは送金を受け入れるコールバック関数内の processLPReward 関数を呼び出します。

以下の図によると、攻撃コントラクト 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 が報酬コレクションで 77,890 OKC トークンを受け取ったことがわかります。

次に、攻撃者は攻撃コントラクト 0x28e7..E974 の LP トークンを転送し、流動性を除去するためにそれを破壊し、1,884,223 USDT トークンと 27,264 OKC トークンを取得しました。

そして、他の 2 つの攻撃コントラクト内のすべてのトークンをメインの攻撃コントラクトに転送します。

それぞれ 0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9: 272 および 77,890 OKC トークン。

ハッカーはすべての OKC、約 104,610 OKC トークンを約 136,518 USDT トークンと交換し、この時点でハッカーは合計約 2,759,918 USDT トークンを保有していました。

最終的に、ハッカーはフラッシュ ローンの元本と利息をすべて返還し、約 6,268 個の USDT トークンが残り、そのすべてが攻撃者のアドレスに転送されました。

0xbbcc139933D1580e7c40442E09263e90E6F1D66D。

脆弱性分析

攻撃分析により、ハッカーの主な収益資金は MinerPool コントラクトの processLPReward 関数からのものであることがわかっており、この関数のロジックは主に lpHolder を取得し、その LP 量に比例して直接報酬を与えることです。

攻撃者が作成した 3 番目の攻撃コントラクトの実行ロジックを見てみましょう。

ここのロジックから、addHolder 関数は extcodesize() を使用してアドレスの現在のサイズを計算し、アドレスがコントラクト アドレスであるかどうかを判断することがわかりますが、攻撃者が CREATE2 を通じてコン​​トラクトを作成すると、コントラクトは初期化されるため、 、アドレス サイズは 0 のままであるため、攻撃者はコンストラクターでこの関数を呼び出してコントラクト呼び出し制限を回避できます。

転送中に addHolder 関数を呼び出してコントラクトのアドレスを lpHolder リストに追加するため、コントラクトは報酬を受け取ることでタイムリーな OKC 報酬を取得できます。

processLPReward関数のコードロジックを解析した結果、以下の図から、報酬を受け取るためのロック時間は設定されているものの、検証や制限のためのLP保持時間が設定されていないため、ハッカーが大量のLPを取得していることがわかります。フラッシュローンを通じて一時的な資金を獲得し、報酬を受け取った後すぐにLPと交換して破棄します。

要約する

簡単に言うと、ハッカーはフラッシュローンを通じて多額のUSDTを借り、多額のOKCを交換し、それによってOKCの価格をつり上げました。また、OKC プロジェクトでは LP 報酬の発行にロックアップ要件が設定されていないため、ハッカーは報酬を取得した後すぐに流動性を引き出し、プロジェクト当事者が発行した流動性プロバイダーの報酬を取得しました。そしてOKCプロジェクトパーティーから報酬を得たOKCトークンを販売します。最終的な利益は6,268USDTでした。

おすすめ

転載: blog.csdn.net/m0_37598434/article/details/135360288