根据区块链安全公司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 区块链修复了导致「数十亿」面临风险的关键错误