Według raportu firmy Zellic z 19 kwietnia, firmy zajmującej się bezpieczeństwem blockchain, dwa różne błędy w rozwidleniu protokołu handlu lewarowanego Gains Network mogły pozwolić inwestorom na osiągnięcie 900% zysku na każdej transakcji, niezależnie od ceny tokena będącego w obrocie. Jeden z błędów istniał w poprzedniej wersji Gains, ale został później załatany. Drugie znaleziono jedynie w rozwidleniu protokołu.

Według Zellica jego pracownicy poinformowali twórców rozwiązań Gains fork Gambit Trade, Holdstation Exchange i Krav Trade o tej luce, a te zespoły programistów upewniły się, że ich protokoły nie zawierają takich dwóch luk. Jednak inne widelce Gains mogą nadal być podatne na ataki, ostrzegł Zellic.

Według oficjalnej strony internetowej Gains Network to ekosystem zdecentralizowanych produktów finansowych (DeFi) na platformach Polygon i Arbitrum. Oficjalna nazwa aplikacji do handlu lewarowanego to „gTrade”. Według platformy analitycznej DefiLlama od momentu powstania w maju 2023 r. umożliwił obrót instrumentami pochodnymi o wartości ponad 25 miliardów dolarów.

Interfejs użytkownika gTrade, aplikacji do handlu lewarowanego Gains Network. Źródło: Zyski Network

Zellic twierdził, że kilka popularnych aplikacji handlowych DeFi wywodzi się z kodu podstawowego Gains Network, w tym wspomniane Gambit Trade i Holdstation, a także wiele innych protokołów. Odkryli exploit podczas badania konkretnego forka, ale nie chcieli podać, w którym z nich go znaleźli.

Według raportu kontrakty Gains Network umożliwiają użytkownikom otwarcie zlecenia rynkowego, odwrócenia lub momentum. Zlecenie rynkowe pozwala natychmiastowo kupić lub sprzedać składnik aktywów, niezależnie od ceny.

Kiedy użytkownik prosi o otwarcie transakcji impulsowej lub odwróconej, inteligentny kontrakt rejestruje „zlecenie”, które zawiera dane o cenie, po jakiej użytkownik jest skłonny handlować. Po osiągnięciu tej ceny każdy użytkownik może wywołać funkcję generateLimitOrder w celu realizacji zamówienia. Użytkownik wywołujący realizację nie musi być tym samym, który złożył zlecenie. Użytkownicy wzywający wykonanie otrzymują niewielką „opłatę za wykonanie” za pełnienie tej roli.

Umożliwia to użytkownikom składanie zleceń z limitem (momentum) i stop-limit (odwrócenie) w podobny sposób, jak na scentralizowanej giełdzie, ale bez konieczności realizacji zleceń przez scentralizowaną jednostkę.

Kiedy użytkownik składa zlecenie, może ustawić cenę take-profit, cenę stop-loss lub obie te opcje. Celem tego projektu jest umożliwienie inwestorom automatycznego wyjścia z zyskownej transakcji w punkcie take-profit lub straty w punkcie stop-loss.

Błąd w forku Gains pozwolił na zysk w wysokości 900% na zamówieniach kupna

W analizowanym forku Gains Zellic odkrył, że po otwarciu zlecenia cena stop-loss jest zapisywana w zmiennej „currentPrice” używanej do obliczania zysków i strat. Oznaczało to, że jeśli użytkownik był w stanie ustawić stop-loss powyżej ceny otwartej, mógł automatycznie zyskać na dowolnej transakcji.

Rozważmy na przykład scenariusz, w którym cena Bitcoina (BTC) wyniosła 63 000 USD, a użytkownik wprowadził 62 000 USD jako cenę otwarcia i 64 000 USD jako stop-loss. W takim przypadku, jeśli cena spadnie do 62 000 USD, zamówienie zostanie zrealizowane. Jednak cena byłaby bezpośrednio poniżej poziomu stop-loss, co spowodowałoby automatyczne wyjście.

Ponadto ustawiony przez użytkownika stop-loss będzie rejestrowany jako cena bieżąca. Oznaczało to, że użytkownik zarobiłby 2000 dolarów, mimo że prawidłowy zysk powinien wynosić około 0 dolarów. Mogłoby to pozwolić atakującemu na czerpanie zysków z każdej transakcji i ostatecznie wyczerpanie protokołu ze wszystkich jego środków.

Aby zapobiec temu exploitowi, protokół zawierał kontrolę, która powodowała błąd „wrong_sl”, jeśli użytkownik próbował ustawić stop-loss powyżej ceny otwarcia w zleceniu kupna.

Zyskuje kontrolę rozwidlenia sieci, aby zapobiec błędnemu take-profit lub stop-loss. źródło: Zellic

Jednakże śledczy odkryli, że w pewnych okolicznościach kontrolę tę można ominąć.

Kiedy użytkownik po raz pierwszy otworzył zlecenie, ustalał cenę, po której chciał otworzyć transakcję, która następnie była rejestrowana w zmiennej „openPrice”. Na tym etapie przeprowadzono kontrolę. Jednakże funkcja służąca do realizacji zlecenia zmieniła tę zmienną na wartość „a.Price”, która była ceną bieżącą powiększoną o wpływ ceny z otwarcia zlecenia.

Oznaczało to, że jeśli użytkownik wprowadził wyjątkowo wysoką cenę otwarcia, wykonawca mógł ominąć weryfikację, po prostu wykonując zlecenie. Umożliwiło to również wykonawcy realizację zlecenia po cenie otwartej niższej od pierwotnie ustalonej.

Jako przykład Zellic rozważył pomysł atakującego, który składa zlecenie zakupu tokena za 100 000 e10 (1 biliard dolarów) i ustawia stop-loss na kwotę o 1 dolara mniejszą niż ta, czyli 999,999999999999 bilionów dolarów. Po złożeniu zamówienia osoba atakująca wykonuje własne zlecenie, powodując zmianę ceny openPrice z 100 000 e10 USD na obecną cenę po uwzględnieniu wpływu transakcji na cenę.

Następnie transakcja zostaje zrealizowana i staje się otwarta. Dopóki wynikająca z tego cena otwarcia jest niższa od pierwotnie ustawionego stop-loss, można ją teraz zamknąć, wykonując stop-loss. Kiedy atakujący wykona własny stop-loss, czerpie zyski z różnicy między ceną zamknięcia a ceną stop-loss.

Zellic twierdził, że transakcja przyniosłaby atakującemu 900% zysku.

Zyskuje przykład wykorzystania forka. źródło: Zellic

Ta luka nie występowała w Gains Network w momencie jej odkrycia przez zespół Zellic. Istniał tylko w rozwidlonej wersji, którą badał. Jednak w trakcie badania tego problemu natrafiono na drugą wadę, która występowała we wcześniejszej wersji samego Gains.

Drugi błąd pozwalał na osiągnięcie 900% zysku ze zleceń sprzedaży

Drugi błąd pozwolił traderom zarobić 900% na zleceniach sprzedaży, niezależnie od akcji cenowej.

Kiedy transakcja została zamknięta w widelcu Gains, konwertowała ona punkt stop-loss lub take-profit użytkownika na zmienną zwaną „int”, której następnie używano do obliczenia zysku w ujęciu procentowym. Jeśli jednak użytkownik wprowadziłby wartość stop-loss lub take-profit wynoszącą dokładnie 2^256-1, w wyniku obliczeń wartość „int” stałaby się ujemna.

Stało się tak, ponieważ 2^256-1 to maksymalna wartość liczb dodatnich w Ethereum, powodując, że każda wartość powyżej niej „przepełnia się” lub zaczyna od nowa od zera, a także dlatego, że w obliczeniach dodano cenę otwarcia do całkowitej kwoty. W języku programowania Solidity liczba 2^256-1 jest również znana jako „typ(uint256).max”.

Według Zellica, jeśli atakujący wykorzysta dźwignię większą niż 9x, może zyskać 900% na tym exploitie:

„Rozważmy zlecenie sprzedaży z bieżącą ceną jako typem (uint256).max. Wynikowa wartość diff będzie wynosić openPrice + 1 (int(type(uint256).max) = -1 ), a zatem procent zysku będzie prawie równy 100 * dźwigni. Dlatego jeśli dźwignia jest większa niż 9, funkcja zwróci zysk w wysokości 900%.

W umowie znajdował się czek, który miał uniemożliwić zapisanie kwoty 2^256-1 jako zysku. Jednakże sprawdzenie to zostało przeprowadzone dopiero w momencie pierwszego otwarcia zamówienia. Jeśli użytkownik zmienił swój punkt take-profit po otwarciu zlecenia, mógłby ominąć czek i wprowadzić 2^256-1 jako take-profit, co pozwoliło mu uzyskać automatyczny zysk w wysokości 900% przy każdej transakcji.

Ta druga usterka istniała w poprzedniej wersji Gains, ale została później załatana. Obecna wersja nie zawiera tej wady, ponieważ sprawdza, kiedy take-profit i stop-loss są aktualizowane, a także kiedy są ustawiane po raz pierwszy.

Zellic podobno poinformował wszystkie powyższe forki o tych dwóch lukach w zabezpieczeniach i skontaktował się z Crypto Security Alliance, próbując znaleźć inne protokoły, na które mogą one mieć wpływ. Ostrzegł jednak, że niektóre forki Gains mogą nadal zawierać te błędy, narażając fundusze użytkowników na ryzyko wyczerpania.

Cointelegraph skontaktował się z Gains Network, Gambit Trade, Holdstation Exchange i Krav Trade w celu uzyskania komentarza, ale nie otrzymał odpowiedzi do czasu publikacji.

Gains Network twierdzi, że podaje „rzeczywistą cenę spot” notowanych aktywów, w przeciwieństwie do tego, co uważa za mniej dokładne ceny oparte na kontraktach bezterminowych. Twierdzi również, że oferuje lepszy handel na rynku Forex w porównaniu do konkurentów.

Powiązane: Blockchain Sui powiązany z Libra naprawia krytyczny błąd, który naraża „miliardy” na ryzyko