Dua bug berbeda di cabang protokol perdagangan leverage Gains Network dapat memungkinkan pedagang mendapat untung 900% pada setiap perdagangan, berapa pun harga token yang diperdagangkan, menurut laporan 19 April dari perusahaan keamanan blockchain Zellic. Salah satu bug ada di versi Gains sebelumnya tetapi kemudian ditambal. Yang lainnya hanya ditemukan di cabang protokol.

Menurut Zellic, stafnya memberi tahu pengembang Gains fork Gambit Trade, Holdstation Exchange, dan Krav Trade tentang kerentanan tersebut, dan tim pengembangan ini telah memastikan protokol mereka tidak mengandung dua kelemahan tersebut. Namun, cabang Gains lainnya mungkin masih rentan, Zellic memperingatkan.

Menurut situs resminya, Gains Network adalah ekosistem produk keuangan terdesentralisasi (DeFi) di Polygon dan Arbitrum. Nama resmi untuk aplikasi perdagangan leverage adalah “gTrade.” Ini telah memfasilitasi lebih dari $25 miliar volume derivatif sejak didirikan pada Mei 2023, menurut platform analitik blockchain DefiLlama.

Antarmuka pengguna untuk gTrade, aplikasi perdagangan leverage Jaringan Keuntungan. Sumber: Jaringan Keuntungan

Zellic mengklaim bahwa beberapa aplikasi perdagangan DeFi populer berasal dari kode dasar Gains Network, termasuk Gambit Trade dan Holdstation yang disebutkan di atas, serta banyak protokol lainnya. Mereka menemukan eksploitasi tersebut saat mempelajari fork tertentu tetapi menolak menyebutkan di fork mana mereka menemukannya.

Menurut laporan tersebut, kontrak Gains Network memungkinkan pengguna untuk membuka perintah perdagangan pasar, pembalikan, atau momentum. Perintah pasar membeli atau menjual aset dengan segera, berapapun harganya.

Saat pengguna meminta untuk membuka perdagangan momentum atau pembalikan, kontrak pintar mencatat “pesanan” yang berisi data tentang harga berapa pengguna ingin berdagang. Setelah harga ini tercapai, pengguna mana pun dapat memanggil fungsi mengeksekusiLimitOrder untuk mengisi pesanan. Pengguna yang memanggil eksekusi tidak harus sama dengan yang memberikan perintah. Pengguna yang memanggil eksekusi akan dibayar sedikit “biaya eksekusi” untuk melakukan peran ini. 

Hal ini memungkinkan pengguna untuk menempatkan order limit (momentum) dan stop-limit (pembalikan) serupa dengan cara yang mereka bisa lakukan di bursa terpusat, namun tanpa memerlukan entitas terpusat untuk melakukan pengisian order.

Saat pengguna melakukan pemesanan, mereka dapat menetapkan harga take-profit, harga stop-loss, atau keduanya. Tujuan dari desain ini adalah untuk memungkinkan pedagang secara otomatis keluar dari perdagangan yang menguntungkan pada titik take-profit atau perdagangan yang merugi pada titik stop-loss. 

Bug in Gains fork memungkinkan keuntungan 900% pada pesanan beli

Dalam Gains fork yang dipelajarinya, Zellic menemukan bahwa ketika order dibuka, harga stop-loss disimpan dalam variabel “currentPrice” yang digunakan untuk menghitung keuntungan dan kerugian. Ini berarti bahwa jika pengguna dapat menetapkan stop-loss di atas harga terbuka, mereka secara otomatis dapat memperoleh keuntungan dari perdagangan apa pun. 

Misalnya, pertimbangkan skenario di mana harga Bitcoin (BTC) adalah $63.000 dan pengguna memasukkan $62.000 sebagai harga pembukaan dan $64.000 sebagai stop-loss. Dalam hal ini, jika harga turun menjadi $62.000, pesanan akan terisi. Namun harga akan berada tepat di bawah stop-loss, sehingga memicu exit otomatis.

Selain itu, stop-loss yang ditetapkan oleh pengguna akan dicatat sebagai harga saat ini. Ini berarti bahwa pengguna akan mendapat untung $2.000, meskipun keuntungan yang sebenarnya seharusnya sekitar $0. Hal ini bisa memungkinkan penyerang mendapatkan keuntungan dari setiap perdagangan dan pada akhirnya menghabiskan seluruh dana protokol.

Untuk mencegah eksploitasi ini, protokol berisi pemeriksaan yang memunculkan kesalahan “wrong_sl” jika pengguna mencoba menetapkan stop-loss di atas harga terbuka pada pesanan beli.

Dapatkan pemeriksaan fork Jaringan untuk mencegah kesalahan ambil untung atau hentikan kerugian. Sumber: Zellic

Namun, penyelidik menemukan bahwa pemeriksaan ini dapat dilewati dalam keadaan tertentu.

Ketika pengguna pertama kali membuka order, mereka menetapkan harga yang mereka inginkan untuk membuka perdagangan, yang kemudian dicatat dalam variabel “openPrice.” Saat itulah pemeriksaan dilakukan. Namun, fungsi yang digunakan untuk mengeksekusi order mengubah variabel ini menjadi nilai “a.Price”, yang merupakan harga saat ini ditambah dampak harga dari order yang dibuka. 

Artinya, jika pengguna memasukkan harga terbuka yang sangat tinggi, pelaksana dapat melewati pemeriksaan hanya dengan mengeksekusi order. Hal ini juga memungkinkan eksekutor untuk memenuhi pesanan pada harga terbuka di bawah harga yang ditetapkan semula. 

Sebagai contoh, Zellic mempertimbangkan gagasan seorang penyerang yang memesan untuk membeli token seharga $100000e10 ($1 kuadriliun) dan menetapkan stop-loss pada $1 kurang dari ini atau $999,999999999999 triliun. Setelah pesanan dipasang, penyerang kemudian mengeksekusi pesanannya sendiri, menyebabkan openPrice berubah dari $100000e10 menjadi berapa pun harga saat ini setelah dampak harga perdagangan diperhitungkan. 

Perdagangan kemudian dieksekusi dan menjadi terbuka. Selama harga pembukaan yang dihasilkan berada di bawah stop-loss yang ditetapkan semula, maka kini dapat ditutup dengan mengeksekusi stop-loss tersebut. Ketika penyerang mengeksekusi stop-loss mereka sendiri, mereka mendapat keuntungan dari selisih antara harga penutupan dan harga stop-loss.

Perdagangan tersebut akan menghasilkan keuntungan 900% bagi penyerang, klaim Zellic.

Dapatkan contoh eksploitasi fork. Sumber: Zellic

Cacat ini tidak ada di Gains Network pada saat tim Zellic menemukannya. Itu hanya ada dalam versi bercabang yang sedang diselidiki. Namun, dalam proses mempelajari masalah ini, ia menemukan kelemahan kedua yang ada di versi Gains itu sendiri sebelumnya.

Bug kedua memungkinkan keuntungan 900% pada pesanan jual

Bug kedua memungkinkan pedagang mendapat untung 900% dari pesanan jual terlepas dari pergerakan harga.

Ketika perdagangan ditutup di fork Keuntungan, titik stop-loss atau take-profit pengguna diubah menjadi variabel yang disebut “int”, yang kemudian digunakan untuk menghitung keuntungan dalam persentase. Namun jika pengguna memasukkan nilai stop-loss atau take-profit tepat 2^256-1, perhitungan yang dihasilkan akan menyebabkan “int” menjadi negatif.

Hal ini karena 2^256-1 adalah nilai maksimum untuk angka positif di Ethereum, menyebabkan nilai apa pun di atasnya “meluap” atau dimulai dari nol dan karena penghitungan menambahkan harga terbuka ke totalnya. Dalam bahasa pemrograman Solidity, 2^256-1 juga dikenal sebagai “type(uint256).max.” 

Menurut Zellic, selama penyerang menggunakan leverage lebih besar dari 9x, mereka dapat memperoleh keuntungan 900% dari eksploitasi ini:

“Mari kita pertimbangkan pesanan jual, dengan CurrentPrice sebagai tipe (uint256).max. Nilai diff yang dihasilkan adalah openPrice + 1 (int(type(uint256).max) = -1 ), sehingga persentase keuntungannya akan hampir sama dengan 100 * leverage. Oleh karena itu, jika leverage lebih besar dari 9, fungsi tersebut akan mengembalikan keuntungan sebesar 900%.”

Ada pemeriksaan dalam kontrak yang berusaha mencegah 2^256-1 dimasukkan sebagai take-profit. Namun pemeriksaan ini baru dilakukan pada saat order pertama kali dibuka. Jika pengguna mengubah titik take-profit setelah order dibuka, mereka dapat melewati cek dan memasukkan 2^256-1 sebagai take-profit, sehingga memungkinkan mereka memperoleh keuntungan otomatis 900% setiap kali mereka berdagang.

Cacat kedua ini memang ada di versi Gains sebelumnya tetapi kemudian ditambal. Versi saat ini tidak mengandung kelemahan ini, karena ia melakukan pemeriksaan ketika take-profit dan stop-loss diperbarui serta saat pertama kali ditetapkan.

Zellic dilaporkan memberi tahu semua cabang di atas tentang dua kelemahan keamanan ini dan menghubungi Crypto Security Alliance dalam upaya untuk menemukan protokol lain yang mungkin terpengaruh olehnya. Namun, mereka memperingatkan bahwa beberapa cabang Gains mungkin masih mengandung bug ini, sehingga dana pengguna berisiko terkuras habis.

Cointelegraph menghubungi Gains Network, Gambit Trade, Holdstation Exchange, dan Krav Trade untuk memberikan komentar tetapi tidak menerima tanggapan pada saat publikasi.

Gains Network mengklaim bahwa mereka memberikan “harga spot sebenarnya” dari aset-aset yang terdaftar, dibandingkan dengan apa yang dianggap sebagai harga yang kurang akurat berdasarkan kontrak abadi. Ia juga mengklaim menawarkan perdagangan valas yang unggul dibandingkan pesaing.

Terkait: Blockchain Sui terkait Libra memperbaiki bug kritis yang membahayakan 'miliaran orang'