根據區塊鏈安全公司Zellic 4 月19 日的報告,Gains Network 槓桿交易協議的一個分支中的兩個不同的錯誤可能會讓交易者在每筆交易中獲利900%,無論交易的代幣價格如何。其中一個錯誤存在於先前版本的 Gains 中,但後來得到了修補。另一個僅在協議的一個分支中發現。

據 Zellic 稱,其工作人員向 Gains 分叉 Gambit Trade、Holdstation Exchange 和 Krav Trade 的開發人員通報了該漏洞,這些開發團隊已確保他們的協議不包含這兩個缺陷。然而,澤利克警告說,其他 Gains 分叉可能仍然容易受到攻擊。

根據其官網介紹,Gains Network是Polygon和Arbitrum上的去中心化金融(DeFi)產品生態系統。其槓桿交易應用程式的正式名稱是「gTrade」。根據區塊鏈分析平台 DefiLlama 的數據,自 2023 年 5 月成立以來,它已促成了超過 250 億美元的衍生性商品交易量。

Gains Network 槓桿交易應用程式 gTrade 的使用者介面。來源:增益網絡

Zellic 聲稱,幾個流行的 DeFi 交易應用程式都源自 Gains Network 的基礎代碼,包括前面提到的 Gambit Trade 和 Holdstation,以及許多其他協議。他們在研究某個特定分叉時發現了該漏洞,但拒絕透露是在哪個分叉中發現的。

根據該報告,Gains Network 合約允許用戶打開市場、反轉或動量交易訂單。市價訂單立即購買或出售資產,無論價格如何。

當用戶要求開啟動量或反轉交易時,智能合約會會記錄一個“訂單”,其中包含有關用戶願意以什麼價格進行交易的數據。一旦達到此價格,任何使用者都可以呼叫executeLimitOrder 函數來執行訂單。調用執行的用戶不必與下訂單的用戶相同。呼叫執行的使用者會因執行此角色而獲得少量「執行費」。

這允許用戶以類似於在中心化交易所中的方式下達限價(動量)和止損限價(反轉)訂單,但不需要中心化實體來執行訂單執行。

用戶下單時可設定止盈價、停損價或兩者兼具。這樣設計的目的是讓交易者能夠在止盈點自動退出獲利的交易,或是在停損點自動退出虧損的交易。

Gains 分叉中的錯誤允許買入訂單獲得 900% 的利潤

在它研究的 Gains 分叉中,Zellic 發現,當開立訂單時,停損價格儲存在用於計算損益的「currentPrice」變數中。這意味著,如果用戶能夠將停損設定在開盤價之上,他們就可以自動從任何交易中獲利。

例如,假設比特幣 (BTC) 的價格為 63,000 美元,用戶輸入 62,000 美元作為開倉價,輸入 64,000 美元作為停損。在這種情況下,如果價格跌至 62,000 美元,訂單就會成交。但價格將立即低於停損,觸發自動退出。

此外,使用者設定的止損將被記錄為當前價格。這意味著用戶將獲利 2,000 美元,儘管正確的利潤應該約為 0 美元。這可能會讓攻擊者從每筆交易中獲利,並最終耗盡協議的所有資金。

為了防止這種利用,該協議包含一項檢查,如果用戶試圖將止損設定高於買入訂單的開盤價,則會引發「wrong_sl」錯誤。

Gains Network 分叉檢查,防止錯誤停盈或停損。資料來源:澤利克

然而,調查人員發現,在某些情況下,這項檢查可能會被繞過。

當用戶首次開倉時,他們設定想要開倉的價格,然後將其記錄在變數「openPrice」中。正是在此時進行了檢查。然而,用於執行訂單的函數將此變數變更為「a.Price」的值,即當前價格加上所開訂單的價格影響。

這意味著,如果使用者輸入極高的開盤價,執行者可以透過簡單地執行訂單來繞過檢查。這也允許執行者以低於最初設定價格的開盤價格執行訂單。

舉個例子,Zellic 考慮了這樣一種想法:攻擊者下單以 100000e10(1 兆美元)購買代幣,並將止損設定為比該值少 1 美元,即 999.999999999999 兆美元。下達訂單後,攻擊者就會執行自己的訂單,導致 openPrice 從 100000e10 美元更改為考慮到交易價格影響後的當前價格。

然後交易執行並開放。只要最終的開倉價格低於最初設定的止損,現在就可以透過執行停損來平倉。當攻擊者執行自己的停損時,他們從收盤價與停損價格之間的差額中獲利。

Zellic 聲稱,這筆交易將為攻擊者帶來 900% 的利潤。

獲得分叉漏洞利用範例。資料來源:澤利克

當 Zellic 團隊發現該缺陷時,Gains Network 中並不存在該缺陷。它只存在於它正在調查的分叉版本中。然而,在研究這個問題的過程中,它遇到了 Gains 早期版本中存在的第二個缺陷。

第二個錯誤允許賣單獲得 900% 的利潤

第二個錯誤使交易者無論價格走勢如何都能透過賣單獲利 900%。

當交易在收益叉中平倉時,它將用戶的止損或止盈點轉換為名為“int”的變量,然後用該變量以百分比計算利潤。但如果使用者輸入的停損或停盈值剛好是 2^256-1,計算結果將導致「int」變成負數。

這是因為 2^256-1 是以太坊中正數的最大值,導致任何高於它的值「溢位」或從零開始,並且因為計算將開盤價加到其總數中。在 Solidity 程式語言中,2^256-1 也稱為「type(uint256).max」。

根據 Zellic 的說法,只要攻擊者使用大於 9 倍的槓桿,他們就可以從此漏洞中獲利 900%:

「讓我們考慮一個賣單,目前價格的類型為(uint256).max。 diff 的結果值為 openPrice + 1 (int(type(uint256).max) = -1 ),因此利潤百分比幾乎等於 100 * 槓桿。因此,如果槓桿大於 9,則函數將返回 900% 的利潤。

合約中有一項檢查試圖阻止 2^256-1 作為止盈輸入。但是,此檢查僅在訂單首次開啟時執行。如果用戶在開倉後更改了止盈點,他們可以繞過檢查並輸入2^256-1作為止盈,從而使他們每次交易時自動獲得900%的利潤。

第二個缺陷確實存在於先前版本的 Gains 中,但隨後被修復。目前版本不包含此缺陷,因為它會在更新止盈和停損以及首次設定時執行檢查。

據報道,Zellic 向上述所有分叉告知了這兩個安全缺陷,並聯繫了加密安全聯盟,試圖找到可能受其影響的其他協議。然而,它警告說,一些Gains分叉可能仍然包含這些錯誤,使用戶的資金面臨被耗盡的風險。

Cointelegraph聯繫了Gains Network、Gambit Trade、Holdstation Exchange和Krav Trade徵求意見,但截至發稿時尚未收到回應。

Gains Network 聲稱它提供了上市資產的“真正實現貨價格”,而不是它認為基於永續合約的不太準確的價格。它還聲稱與競爭對手相比提供卓越的外匯交易。

相關:與 Libra 相關的 Sui 區塊鏈修復了導致「數十億」面臨風險的關鍵錯誤