Două erori diferite dintr-o furcă a protocolului de tranzacționare cu efect de pârghie Gains Network ar fi putut permite comercianților să profite de 900% din fiecare tranzacție, indiferent de prețul jetonului tranzacționat, conform unui raport din 19 aprilie al firmei de securitate blockchain Zellic. Unul dintre erori a existat într-o versiune anterioară de Gains, dar a fost corectat ulterior. Celălalt a fost găsit doar într-o furcă a protocolului.

Potrivit Zellic, personalul său a informat dezvoltatorii Gains forks Gambit Trade, Holdstation Exchange și Krav Trade despre vulnerabilitate, iar aceste echipe de dezvoltare s-au asigurat că protocoalele lor nu conțin astfel de două defecte. Cu toate acestea, alte furci Gains pot fi încă vulnerabile, a avertizat Zellic.

Potrivit site-ului său oficial, Gains Network este un ecosistem de produse financiare descentralizate (DeFi) pe Polygon și Arbitrum. Numele oficial al aplicației sale de tranzacționare cu efect de levier este „gTrade”. Acesta a facilitat peste 25 de miliarde de dolari în volum de derivate de la înființarea sa în mai 2023, conform platformei de analiză blockchain DefiLlama.

Interfață cu utilizatorul pentru gTrade, aplicația de tranzacționare cu efect de pârghie Gains Network. Sursa: Gains Network

Zellic a susținut că mai multe aplicații populare de tranzacționare DeFi sunt derivate din codul de bază al Gains Network, inclusiv Gambit Trade și Holdstation menționate mai sus, precum și multe alte protocoale. Ei au descoperit exploit în timp ce studiau o anumită furcă, dar au refuzat să numească în care au descoperit-o.

Potrivit raportului, contractele Gains Network permit utilizatorilor să deschidă fie o piață, fie o comandă de tranzacționare inversă sau impuls. Un ordin de piață cumpără sau vinde un activ imediat, indiferent de preț.

Când un utilizator cere să deschidă o tranzacție de impuls sau inversare, contractul inteligent înregistrează o „comandă” care conține date despre prețul la care utilizatorul este dispus să tranzacționeze. Odată atins acest preț, orice utilizator poate apela funcția executeLimitOrder pentru a completa comanda. Utilizatorul care apelează la execuție nu trebuie să fie același care a plasat comanda. Utilizatorii care apelează la execuție primesc o mică „taxă de execuție” pentru îndeplinirea acestui rol. 

Acest lucru permite utilizatorilor să plaseze ordine limită (momentum) și stop-limit (inversare) similar modului în care o pot face într-un schimb centralizat, dar fără a avea nevoie de o entitate centralizată pentru a efectua umplerea comenzilor.

Când un utilizator plasează o comandă, poate seta un preț de profit, un preț stop-loss sau ambele. Intenția acestui design este de a permite comercianților să părăsească automat o tranzacție profitabilă la punctul de profit sau o tranzacție cu pierdere la punctul stop-loss. 

Bug in Gains fork a permis un profit de 900% la comenzile de cumpărare

În bifurcația Gains pe care a studiat-o, Zellic a descoperit că atunci când o comandă a fost deschisă, prețul stop-loss a fost stocat în variabila „currentPrice” folosită pentru a calcula profitul și pierderea. Acest lucru însemna că, dacă un utilizator a putut seta stop-loss-ul peste prețul deschis, ar putea profita automat din orice tranzacție. 

De exemplu, luați în considerare un scenariu în care prețul Bitcoin (BTC) a fost de 63.000 USD și utilizatorul a introdus 62.000 USD ca preț deschis și 64.000 USD ca stop-loss. În acest caz, dacă prețul scade la 62.000 USD, comanda ar fi completată. Dar prețul ar fi imediat sub stop-loss-ul, declanșând o ieșire automată.

În plus, stop-loss-ul stabilit de utilizator ar fi înregistrat ca preț curent. Acest lucru însemna că utilizatorul ar fi profitat de 2.000 USD, chiar dacă profitul corect ar fi trebuit să fie de aproximativ 0 USD. Acest lucru ar fi putut permite unui atacator să profite de fiecare tranzacție și, în cele din urmă, să epuizeze protocolul tuturor fondurilor sale.

Pentru a preveni acest exploit, protocolul conținea o verificare care a generat o eroare „wrong_sl” dacă utilizatorul a încercat să își stabilească stop-loss-ul peste prețul deschis la un ordin de cumpărare.

Gains Network fork check pentru a preveni take-profit greșit sau stop-loss. Sursa: Zellic

Totuși, anchetatorii au descoperit că acest control ar putea fi ocolit în anumite circumstanțe.

Când un utilizator a deschis prima dată o comandă, a stabilit prețul la care dorea să deschidă tranzacția, care a fost apoi înregistrat în variabila „openPrice”. În acest moment a fost efectuată verificarea. Cu toate acestea, funcția folosită pentru a executa un ordin a schimbat această variabilă la valoarea „a.Price”, care era prețul curent plus impactul prețului de la ordinul deschis. 

Aceasta însemna că, dacă utilizatorul introduce un preț deschis extrem de mare, un executor putea ocoli verificarea prin simpla executare a ordinului. Acest lucru a permis, de asemenea, executantului să completeze ordinul la un preț deschis sub ceea ce a fost stabilit inițial. 

Ca exemplu, Zellic a luat în considerare ideea unui atacator care plasează o comandă de cumpărare a unui token la 100000e10 USD (1 cvadrilion USD) și stabilește un stop-loss la 1 USD mai puțin decât aceasta sau 999,999999999999 trilion USD. Odată plasată ordinul, atacatorul își execută propria comandă, determinând ca openPrice să se schimbe de la 100000e10 USD la oricare este prețul curent după ce impactul prețului tranzacției este luat în considerare. 

Apoi tranzacția se execută și devine deschisă. Atâta timp cât prețul de deschidere rezultat este sub stop-loss-ul care a fost stabilit inițial, acesta poate fi acum închis prin executarea stop-loss-ului. Când atacatorul își execută propriul stop-loss, acesta profită din diferența dintre prețul de închidere și prețul stop-loss-ului.

Comerțul ar fi avut ca rezultat un profit de 900% pentru atacator, a susținut Zellic.

Exemplu de exploatare de furcă de câștiguri. Sursa: Zellic

Acest defect nu era prezent în Gains Network în momentul în care echipa Zellic l-a descoperit. A existat doar în versiunea cu furcă pe care o investiga. Cu toate acestea, în procesul de studiu a acestei probleme, s-a întâlnit cu un al doilea defect care era prezent într-o versiune anterioară a Gains în sine.

Al doilea bug a permis un profit de 900% la comenzile de vânzare

Al doilea bug a permis comercianților să profite de 900% din ordinele de vânzare, indiferent de acțiunea prețului.

Când o tranzacție a fost închisă în furca Gains, aceasta a convertit punctul stop-loss sau take-profit al utilizatorului într-o variabilă numită „int”, pe care apoi o folosea pentru a calcula profitul în termeni procentuali. Dar dacă un utilizator a introdus o valoare stop-loss sau take-profit care era exact 2^256-1, calculele rezultate ar fi făcut ca „int” să devină negativ.

Acest lucru se datorează faptului că 2^256-1 este valoarea maximă pentru numerele pozitive din Ethereum, ceea ce face ca orice valoare de deasupra acesteia să „debordeze” sau să înceapă de la zero și pentru că calculul a adăugat prețul deschis la totalul său. În limbajul de programare Solidity, 2^256-1 este cunoscut și ca „type(uint256).max”. 

Potrivit Zellic, atâta timp cât un atacator folosea un pârghie mai mare de 9x, ar putea profita în proporție de 900% din acest exploit:

„Să luăm în considerare o comandă de vânzare, cu currentPrice ca tip (uint256).max. Valoarea rezultată a dif ar fi openPrice + 1 (int(type(uint256).max) = -1 ) și, prin urmare, procentul de profit ar fi aproape egal cu 100 * levier. Prin urmare, dacă efectul de levier este mai mare de 9, funcția va returna profitul ca 900%.

A existat o verificare în contract care a încercat să împiedice 2^256-1 să fie introdus ca profit. Cu toate acestea, această verificare a fost efectuată doar în momentul deschiderii comenzii pentru prima dată. Dacă utilizatorul și-a schimbat punctul de profit după deschiderea comenzii, ar putea ocoli cecul și ar putea introduce 2^256-1 ca profit, permițându-i să obțină un profit automat de 900% de fiecare dată când tranzacționează.

Acest al doilea defect a existat într-o versiune anterioară a Gains, dar a fost corectat ulterior. Versiunea actuală nu conține acest defect, deoarece efectuează verificarea atunci când take-profit și stop-loss sunt actualizate, precum și atunci când sunt setate pentru prima dată.

Zellic a informat toate furcile de mai sus despre aceste două defecte de securitate și a contactat Crypto Security Alliance în încercarea de a găsi alte protocoale care ar putea fi afectate de acestea. Cu toate acestea, a avertizat că unele furci Gains pot conține în continuare aceste erori, punând fondurile utilizatorilor în pericol de a fi epuizate.

Cointelegraph a contactat Gains Network, Gambit Trade, Holdstation Exchange și Krav Trade pentru comentarii, dar nu a primit un răspuns până la data publicării.

Gains Network susține că furnizează „prețul real spot” al activelor listate, spre deosebire de ceea ce consideră că sunt prețuri mai puțin precise bazate pe contracte perpetue. De asemenea, pretinde că oferă tranzacții valutare superioare în comparație cu concurenții.

Înrudit: Blockchain-ul Sui legat de Balanță remediază erori critice care pun „miliarde” în pericol