ブロックチェーンセキュリティ企業Zellicの4月19日のレポートによると、Gains Networkのレバレッジ取引プロトコルのフォークには2つの異なるバグがあり、取引されたトークンの価格に関係なく、トレーダーはすべての取引で900%の利益を得ることができた可能性がある。バグの1つはGainsの以前のバージョンに存在していたが、後に修正された。もう1つはプロトコルのフォークでのみ発見された。

ゼリック氏によると、同社のスタッフはゲインズフォークのGambit Trade、Holdstation Exchange、Krav Tradeの開発者に脆弱性について伝えており、これらの開発チームはプロトコルに2つの欠陥が含まれないようにしたという。しかし、他のゲインズフォークはまだ脆弱である可能性があるとゼリック氏は警告した。

公式ウェブサイトによると、ゲインズ・ネットワークは、ポリゴンとアービトラム上の分散型金融(DeFi)製品のエコシステムです。レバレッジ取引アプリの正式名称は「gTrade」です。ブロックチェーン分析プラットフォームのDefiLlamaによると、2023年5月の設立以来、250億ドルを超えるデリバティブ取引を促進してきました。

Gains Network のレバレッジ取引アプリ gTrade のユーザー インターフェース。出典: Gains Network

ゼリック氏は、前述のギャンビット・トレードやホールドステーション、その他多くのプロトコルを含む、いくつかの人気のDeFi取引アプリがゲインズ・ネットワークの基本コードから派生していると主張した。彼らは特定のフォークを研究しているときにこのエクスプロイトを発見したが、どのフォークで発見したかは明かさなかった。

報告書によると、ゲインズ・ネットワークの契約では、ユーザーはマーケット、リバーサル、モメンタムのいずれかの取引注文を開くことができる。マーケット注文は、価格に関係なく、資産を即座に売買する。

ユーザーがモメンタムまたはリバーサル取引を開始するよう要求すると、スマート コントラクトは、ユーザーが取引を希望する価格に関するデータを含む「注文」を記録します。この価格に達すると、どのユーザーでも executeLimitOrder 関数を呼び出して注文を履行できます。実行を呼び出すユーザーは、注文を出したユーザーと同じである必要はありません。実行を呼び出すユーザーには、この役割を遂行したことに対して少額の「実行手数料」が支払われます。

これにより、ユーザーは、中央集権型取引所と同様に指値(モメンタム)注文とストップリミット(リバーサル)注文を出すことができますが、注文の執行に中央集権型エンティティは必要ありません。

ユーザーが注文を出すとき、利益確定価格、損切り価格、またはその両方を設定できます。この設計の目的は、トレーダーが利益確定ポイントで利益のある取引を、損切りポイントで損失のある取引を自動的に終了できるようにすることです。

Gains フォークのバグにより、買い注文で 900% の利益が出た

ゼリック氏は、調査したゲインズフォークで、注文が開かれると、損益の計算に使用される「currentPrice」変数にストップロス価格が格納されることを発見した。つまり、ユーザーがストップロスを始値より高く設定できれば、どの取引でも自動的に利益を得ることができるということだ。

たとえば、ビットコイン (BTC) の価格が 63,000 ドルで、ユーザーが始値として 62,000 ドル、ストップロスとして 64,000 ドルを入力したシナリオを考えてみましょう。この場合、価格が 62,000 ドルまで下がれば、注文は成立します。しかし、価格はストップロスのすぐ下になり、自動的に決済されます。

さらに、ユーザーが設定したストップロスが現在の価格として記録されます。つまり、正しい利益は約 0 ドルであるはずなのに、ユーザーは 2,000 ドルの利益を得ることになります。これにより、攻撃者はすべての取引から利益を得て、最終的にプロトコルの資金をすべて使い果たす可能性があります。

この悪用を防ぐために、プロトコルには、ユーザーが買い注文の始値よりも高いストップロスを設定しようとした場合に「wrong_sl」エラーをスローするチェックが含まれていました。

間違った利益確定や損切りを防ぐためにネットワークフォークチェックを獲得。出典: Zellic

しかし、調査員は、特定の状況下ではこのチェックを回避できることを発見しました。

ユーザーが最初に注文を開いたとき、取引を開始したい価格を設定し、それが変数「openPrice」に記録されました。チェックが実行されたのはこの時点でした。しかし、注文を実行するために使用された関数は、この変数を「a.Price」の値に変更しました。これは、現在の価格に開かれる注文による価格への影響を加えた値でした。

つまり、ユーザーが非常に高い始値を入力すると、執行者は注文を実行するだけでチェックを回避できることになります。また、これにより執行者は、当初設定された始値よりも低い始値で注文を約定することも可能になりました。

例として、ゼリック氏は、攻撃者がトークンを 100000e10 ドル (1 京ドル) で購入する注文を出し、ストップロスをこれより 1 ドル少ない 999.99999999999 兆ドルに設定するというアイデアを検討しました。注文が出されると、攻撃者は独自の注文を実行し、openPrice を 100000e10 ドルから、取引の価格への影響を考慮した後の現在の価格に変更します。

その後、取引が実行され、オープンになります。結果として生じるオープン価格が、最初に設定されたストップロスを下回っている限り、ストップロスを実行して取引を終了できます。攻撃者が独自のストップロスを実行すると、クローズ価格とストップロス価格の差から利益を得ます。

ゼリック氏は、この取引により攻撃者は900%の利益を得たはずだと主張した。

Gains フォークのエクスプロイトの例。出典: Zellic

この欠陥は、Zellic チームが発見した時点では Gains Network には存在していませんでした。調査していたフォーク バージョンにのみ存在していました。しかし、この問題を調査する過程で、Gains 自体の以前のバージョンに存在していた 2 番目の欠陥に遭遇しました。

2番目のバグにより売り注文で900%の利益が出た

2 番目のバグにより、トレーダーは価格変動に関係なく売り注文で 900% の利益を得ることができました。

Gains フォークで取引が終了すると、ユーザーのストップロスまたはテイクプロフィット ポイントが「int」という変数に変換され、それを使用してパーセンテージで利益を計算します。ただし、ユーザーが 2^256-1 のストップロスまたはテイクプロフィット値を入力した場合、計算結果によって「int」が負の値になります。

これは、2^256-1 が Ethereum の正の数の最大値であるため、それを超える値は「オーバーフロー」するかゼロからやり直しになり、計算によって始値が合計に加算されるためです。Solidity プログラミング言語では、2^256-1 は「type(uint256).max」とも呼ばれます。

Zellic 氏によると、攻撃者が 9 倍以上のレバレッジを使用すれば、このエクスプロイトから 900% の利益を得ることができるとのことです。

「currentPrice が type(uint256).max である売り注文を考えてみましょう。 diff の結果値は openPrice + 1 (int(type(uint256).max) = -1 ) となり、したがって利益率は 100 * レバレッジにほぼ等しくなります。 したがって、レバレッジが 9 より大きい場合、関数は 900% の利益を返します。」

契約には、2^256-1 が利益確定価格として入力されるのを防ぐためのチェックがありました。ただし、このチェックは注文が最初に開かれた瞬間にのみ実行されました。注文が開かれた後にユーザーが利益確定価格ポイントを変更した場合、チェックを回避して利益確定価格として 2^256-1 を入力し、取引するたびに自動的に 900% の利益を得ることができます。

この 2 番目の欠陥は Gains の以前のバージョンに存在していましたが、その後修正されました。現在のバージョンでは、利益確定と損切りが更新されるときだけでなく、最初に設定されるときにもチェックが実行されるため、この欠陥は含まれていません。

伝えられるところによると、ゼリック氏は上記のフォークすべてにこれら2つのセキュリティ上の欠陥について通知し、Crypto Security Allianceに連絡して、それらの影響を受ける可能性のある他のプロトコルを見つけようとした。しかし、一部のGainsフォークにはまだこれらのバグが残っている可能性があり、ユーザーの資金が流出するリスクがあると警告した。

CointelegraphはGains Network、Gambit Trade、Holdstation Exchange、Krav Tradeにコメントを求めたが、記事公開時点で返答はなかった。

ゲインズ・ネットワークは、永久契約に基づく価格の精度が低いと同社が考える価格とは対照的に、上場資産の「実際のスポット価格」を提供していると主張している。また、競合他社に比べて優れた外国為替取引を提供していると主張している。

関連:リブラ関連のSuiブロックチェーンが「数十億ドル」を危険にさらしていた重大なバグを修正