Ошибки в форке Gains Network позволяют получать прибыль в 900% от сделки
Одна из ошибок существовала в предыдущей версии Gains, но позже была исправлена. Другая была найден только в форке протокола.
Сообщается, что сотрудники Zellic проинформировали об уязвимости разработчиков форков Gains Gambit Trade, Holdstation Exchange и Krav Trade, и эти команды разработчиков позаботились о том, чтобы их протоколы не содержали таких двух недостатков. Однако другие форки Gains все еще могут быть уязвимы, предупреждает Zellic.
Согласно официальному сайту, Gains Network представляет собой экосистему продуктов децентрализованного финансирования (DeFi) на Polygon и Arbitrum. Официальное название приложения для торговли с кредитным плечом — «gTrade». По данным аналитической платформы блокчейна DefiLlama, с момента создания Gains Network в мае 2023 года ее объем деривативов составил более 25 миллиардов долларов.
Пользовательский интерфейс gTrade, торгового приложения Gains Network. Источник: Gains Network.
Zellic заявляет, что на основе базового кода Gains Network созданы несколько популярных торговых приложений DeFi, включая вышеупомянутые Gambit Trade и Holdstation, а также многие другие протоколы. Специалисты Zellic обнаружили эксплойт при изучении конкретного форка, но отказались сообщить, в каком именно.
Согласно отчету, контракты Gains Network позволяют пользователям открывать рыночные, разворотные или импульсные торговые ордера. Рыночный ордер покупает или продает актив немедленно, независимо от цены.
Когда пользователь просит открыть импульсную или разворотную сделку, смарт-контракт записывает «ордер», который содержит данные о том, по какой цене пользователь готов торговать. Как только эта цена будет достигнута, любой пользователь может вызвать функцию executLimitOrder, чтобы исполнить ордер. Пользователь, вызывающий исполнение, не обязательно должен быть тем же пользователем, который разместил заказ. Пользователям, вызывающим исполнение, получают небольшую «плату за исполнение этой роли.
Это позволяет пользователям размещать лимитные (импульсные) и стоп-лимитные (разворотные) ордера аналогично тому, как они это делают на централизованной бирже, но без необходимости использования централизованного объекта для выполнения исполнения ордеров.
Когда пользователь размещает заказ, он может установить цену тейк-профита, цену стоп-лосса или и то, и другое. Цель этой конструкции — позволить трейдерам автоматически выходить из прибыльной сделки в точке тейк-профита или из убыточной сделки в точке стоп-лосса.
Ошибка в форке Gains позволила получить 900% прибыли по ордерам на покупку
В изученном им форке Gains специалисты Zellic обнаружили, что при открытии ордера цена стоп-лосса сохраняется в переменной currentPrice, используемой для расчета прибыли и убытка. Это означало, что если пользователь мог установить стоп-лосс выше цены открытия, он мог автоматически получать прибыль от любой сделки.
Например, рассмотрим сценарий, в котором цена Биткоина составляла 63 000 долларов США, и пользователь ввел 62 000 долларов США в качестве цены открытия и 64 000 долларов США в качестве стоп-лосса. В этом случае, если цена упадет до $62 000, ордер будет исполнен. Но цена окажется сразу ниже стоп-лосса, что вызовет автоматический выход.
Кроме того, стоп-лосс, установленный пользователем, будет записан как текущая цена. Это означало, что пользователь получит прибыль в размере 2000 долларов США, хотя правильная прибыль должна была составлять примерно 0 долларов США. Это могло позволить злоумышленнику получить прибыль от каждой сделки и в конечном итоге истощить все средства протокола.
Чтобы предотвратить этот эксплойт, протокол содержал проверку, которая выдавала ошибку «wrong_sl», если пользователь пытался установить стоп-лосс выше цены открытия в ордере на покупку.
Обеспечивает проверку разветвления сети для предотвращения неправильного тейк-профита или стоп-лосса. Источник: Zellic.
Однако следователи обнаружили, что при определенных обстоятельствах эту проверку можно было обойти.
Когда пользователь впервые открывает ордер, он устанавливает цену, по которой он хочет открыть сделку, которая затем записывается в переменную «openPrice». На этом этапе и была произведена проверка. Однако функция, используемая для исполнения ордера, изменила эту переменную на значение «a.Price», которое представляло собой текущую цену плюс влияние на цену открываемого ордера.
Это означало, что если пользователь ввел чрезвычайно высокую цену открытия, исполнитель мог обойти проверку, просто исполнив ордер. Это также позволило исполнителю исполнить ордер по цене открытия ниже первоначально установленной.
В качестве примера специалисты Zellic рассмотрели случай злоумышленника, который размещает заказ на покупку токена по цене $100000e10 ($1 квадриллион) и устанавливает стоп-лосс на $1 меньше этой суммы или $999,999999999999 триллионов долларов. После размещения ордера злоумышленник выполняет свой собственный ордер, в результате чего openPrice изменяется с $100000e10 до любой текущей цены после того, как будет учтено влияние сделки на цену.
Затем сделка исполняется и становится открытой. Пока результирующая цена открытия ниже первоначально установленного стоп-лосса, ее теперь можно закрыть, выполнив стоп-лосс. Когда злоумышленник выполняет свой собственный стоп-лосс, он получает прибыль от разницы между ценой закрытия и ценой стоп-лосса.
По словам Zellic, сделка принесла бы злоумышленнику 900% прибыли.
Пример эксплойта форка Gains. Источник: Zellic.
Этого недостатка не было в Gains Network на момент его выявления командой Zellic. Он существовал только в форке, который исследовался. Однако в процессе изучения этого вопроса специалисты наткнулись на второй недостаток, который присутствовал в самой ранней версии Gains.
Вторая ошибка позволяла получить 900% прибыли по ордерам на продажу
Вторая ошибка позволяла трейдерам получать 900% прибыли от ордеров на продажу независимо от ценового движения.
Когда сделка закрывалась в форке Gains, она преобразовывала точку стоп-лосса или тейк-профита пользователя в переменную под названием «int», которую затем использовала для расчета прибыли в процентном выражении. Но если бы пользователь ввел значение стоп-лосса или тейк-профита, равное точно 2^256-1, в результате вычислений значение «int» стало бы отрицательным.
Это произошло бы потому, что 2^256-1 — это максимальное значение для положительных чисел в Ethereum, что приводит к «переполнению» любого значения выше него или началу с нуля, а также потому, что при расчете к общей сумме добавляется цена открытия. В языке программирования Solidity 2^256-1 также известен как «type(uint256).max».
По словам команды Zellic, если злоумышленник использует кредитное плечо более 9x, он может получить 900% прибыли от этого эксплойта:
«Давайте рассмотрим ордер на продажу с текущей ценой типа (uint256).max. Результирующее значение diff будет openPrice + 1 (int(type(uint256).max) = -1 ), и, следовательно, процент прибыли будет почти равен 100 * кредитное плечо. Следовательно, если кредитное плечо больше 9, функция вернет прибыль в размере 900%».
В контракте была проверка, которая пыталась предотвратить ввод 2^256-1 в качестве тейк-профита. Однако эта проверка была произведена только в момент первого открытия ордера. Если пользователь изменил точку тейк-профита после открытия ордера, он мог обойти проверку и ввести 2^256-1 в качестве тейк-профита, что позволило ему автоматически получать 900% прибыли при каждой торговле.
Этот второй недостаток существовал в предыдущей версии Gains, но впоследствии был исправлен. Текущая версия не содержит этого недостатка, так как выполняет проверку при обновлении тейк-профита и стоп-лосса, а также при их первой установке.
Сообщается, что Zellic проинформировал все вышеупомянутые форки об этих двух недостатках безопасности и связался с Crypto Security Alliance, пытаясь найти другие протоколы, на которые они могут повлиять. Однако он предупредил, что некоторые форки Gains все еще могут содержать эти ошибки, что подвергает средства пользователей риску истощения.
Комментарии
Комментарии для сайта Cackle
Интересно? Поделись с друзьями!