Back to Blog

#4 GMX Olayı: Çapraz Sözleşme Yeniden Giriş Saldırısı Dört Yıllık Güvenlik Önlemini Atlatıyor

Code Auditing
February 10, 2026
7 min read

9 Temmuz 2025'te, merkeziyetsiz sürekli vadeli işlem platformu GMX, Arbitrum ağındaki V1 sözleşmelerini hedef alan bir saldırıya [1, 2] maruz kaldı ve bu saldırı sonucunda yaklaşık 42 milyon dolar kayıp yaşandı. Saldırgan, GLP fiyatını manipüle etmek amacıyla çapraz sözleşme yeniden giriş (cross-contract reentrancy) açığını istismar etti ve ardından çarpıtılmış fiyatı kullanarak GMX V1'in likidite havuzlarından dayanak varlıkları boşalttı.

Arka Plan

GMX V1 [3], Arbitrum üzerinde dağıtılmış merkeziyetsiz bir sürekli vadeli işlem platformudur. Kullanıcıların izinsiz ve gözetim altında olmayan bir şekilde birden fazla kripto varlık üzerinde kaldıraçlı sürekli sözleşme ticareti yapmasına olanak tanır. GMX V1, tek bir çoklu varlık havuzu tasarımını benimser; desteklenen tüm varlıkların likiditesi birleşik bir Vault sistemi içinde toplanır.

GMX'te Pozisyon Yönetimi

GMX'te pozisyon yönetimi iki adımlı bir süreçtir. Özellikle, kullanıcılar OrderBook veya PositionRouter sözleşmeleriyle etkileşime girerek artırma/azaltma emirleri oluşturur. Ardından yetkili bekçi (keeper) hesabı, kullanıcıların emirlerini yürütür; bu işlem ShortTracker sözleşmesindeki küresel açığa satış verilerini ve Vault sözleşmesinin ilgili durumunu günceller. Aşağıdaki iki şekil, GMX'te pozisyon yönetimi için iki yürütme yolunu (emir defteri yürütme ve yönlendirici yürütme yolları) göstermektedir. Bu olayda saldırgan, küresel açığa satış verilerini manipüle etmek ve kâr elde etmek için her iki yolu da kullandı.

Emir Defteri Yürütme Yolu

Yönlendirici Yürütme Yolu

GMX Vault

GMX'teki Vault sözleşmesi, kullanıcıların pozisyonlarını ve varlıklarını (ör. kâr ve zararın kesinleştirilmesi) yönetmekten sorumludur. Kötü niyetli etkileşimleri önlemek amacıyla Vault sözleşmesine yalnızca "kaldıraç penceresi" açık olduğunda erişilebilir (yani Vault sözleşmesindeki isLeverageEnabled değişkeni, Timelock.enableLeverage() fonksiyonu aracılığıyla true olarak ayarlandığında). Bu doğrulama, emir yürütmenin sabit yolları (emir defteri yürütme ve yönlendirici yürütme) izlemesini zorunlu kılar.

GMX Short Tracker

ShortTracker sözleşmesi, emir yürütme sırasında küresel açığa satış verilerini (ör. globalShortAveragePrice değişkeni) takip etmek ve güncellemekten sorumludur. Emir defteri yürütme ve yönlendirici yürütme yollarına göre, kullanıcıların emirleri yürütülmeden önce en güncel küresel açığa satış verilerini senkronize etmek amacıyla ShortTracker sözleşmesinin updateGlobalShortData() fonksiyonu çağrılır. Bu adım, kullanıcıların pozisyonlarında doğru kâr ve zarar gerçekleştirmesini sağlar.

WETH Pozisyonunun Azaltılması

Diğer emirlerden farklı olarak, emir defteri yürütme yolu aracılığıyla WETH pozisyonunun azaltılması, WETH tokenlarını çekmek ve yerel ETH tokenlarını kullanıcılara aktarmak için OrderBook sözleşmesindeki _transferOutETH() fonksiyonunu çağırır. Alıcı _receiver bir sözleşme ise, sendValue() sözleşmenin fallback() fonksiyonunu tetikleyebilir ve bu durum potansiyel bir yeniden giriş açığı oluşturur. Bu olayda saldırgan, önemli kârlar elde etmek için bu yeniden giriş açığını defalarca istismar etti.

GLP Token

GLP (GMX Likidite Sağlayıcısı) token, Vault sözleşmesindeki çeşitli varlıklar için birleşik payları temsil eder. Kullanıcıların GLP basarak ve yakarak varlık sağlamasına ve kullandırmasına izin verilir.

GLP fiyatı aşağıdaki denklemlerle hesaplanabilir:

GLPPrice=AUMGLPTotalSupply\text{GLPPrice}= \frac{\text{AUM}}{\text{GLPTotalSupply}}

AUM=i=asset[0]assets(ΔGlobalShort[i]+AUMOther[i])\text{AUM} = \sum^{assets}_{i = asset[0]}(\Delta_{\text{GlobalShort[i]}} + \text{AUM}_{\text{Other[i]}})

ΔGlobalShort[i]=globalShortSize×(AssetMarketPriceglobalShortAveragePrice)globalShortAveragePrice\Delta_{\text{GlobalShort[i]}} = \frac{ \text{globalShortSize} \times (\text{AssetMarketPrice} - \text{globalShortAveragePrice} ) }{ \text{globalShortAveragePrice} }

Burada:

  • GLPTotalSupply, GLP tokenlarının toplam arzını temsil eder.
  • AUM aşağıdaki iki bileşenden oluşur.
    • ΔGlobalShort\Delta_{\text{GlobalShort}}, tüm açığa satış pozisyonlarının gerçekleşmemiş Kâr ve Zararını (uPnL) temsil eder.
    • AUMOther\text{AUM}_{\text{Other}}, LP'nin sağladığı likiditeyi artı tüm uzun pozisyonların gerçekleşmemiş uPnL'sini temsil eder. Bu terim, kâr gerçekleştirmesinden önce olay boyunca neredeyse değişmeden kaldı.
  • AssetMarketPrice, dayanak varlığın piyasa fiyatıdır (USD cinsinden).
  • globalShortSize, tüm açığa satış pozisyonlarının toplamıdır (USD cinsinden).
  • globalShortAveragePrice, birleşik küresel açığa satış pozisyonunun ortalama giriş fiyatıdır.

Bu olayda saldırgan, GLP fiyatını manipüle etmek ve kâr elde etmek için globalShortAveragePrice değerini çarpıttı.

Açık Analizi

Temel neden, OrderBook sözleşmesindeki çapraz sözleşme yeniden giriş açığıdır. Arka Plan bölümünde açıklandığı üzere, emir defteri yürütme yolu aracılığıyla WETH pozisyonlarının azaltılması, _transferOutETH() üzerinden alıcıya düşük seviyeli bir fallback çağrısı tetikler. Fonksiyon bir nonReentrant niteleyicisi taşır; ancak bu koruma yalnızca OrderBook sözleşmesinin kendisinde yeniden girişi önler, Vault'a yapılan çapraz sözleşme çağrılarını engellemez.

Normal çalışma koşullarında, Vault'un increasePosition() fonksiyonu yalnızca PositionRouter ve PositionManager aracılığıyla çağrılabilir; bu bileşenler her pozisyon değişikliğinden önce globalShortAveragePrice'ı güncellemek için ShortTracker'ı çağırır. Saldırgan, alıcı olarak kötü niyetli bir sözleşme kullanarak emirler oluşturdu ve fallback çağrısı sırasında PositionRouter/PositionManager'ı ve buna bağlı ShortTracker güncellemesini atlayarak doğrudan Vault üzerindeki increasePosition() fonksiyonunu çağırdı. globalShortAveragePrice'ı güncellemeden açığa satış pozisyonlarını defalarca açıp kapatarak saldırgan değişkeni aşamalı olarak çarpıttı. Çarpıtılmış değer GLP fiyatını şişirdi ve saldırganın GLP basıp kullandırarak kâr elde etmesine olanak tanıdı.

Saldırı Analizi

Saldırgan, küresel açığa satış verilerini manipüle eden ve kârı gerçekleştiren bir dizi işlem başlattı. Özellikle bu olay üç aşamaya ayrılabilir: Hazırlık, Fiyat Manipülasyonu ve Kâr Gerçekleştirme. İlgili tüm işlemler aşağıdaki tabloda listelenmiştir.

İşlem No. Aşama Açıklama İşlem Zaman (UTC)
1 Hazırlık Saldırı sözleşmesinin dağıtımı 0xa4ece5...8cd4c93f 09 Tem 2025 12:16:32
2 WETH-uzun emir artışı oluşturma 0x0b8cd6...e90a4712 09 Tem 2025 12:22:28
3 WETH-uzun emir artışını yürütme 0x28a000...7bf0beef 09 Tem 2025 12:23:23
4 WETH-uzun emir azaltması oluşturma 0x20abfe...decc49af 09 Tem 2025 12:24:56
5 Fiyat Manipülasyonu 1 WETH-uzun emir azaltmasını yürütme 0x1f00da...6a4a7353 09 Tem 2025 12:25:37
6 WBTC-kısa emir azaltmasını yürütme 0x222cda…c994464e 09 Tem 2025 12:25:43
7 Fiyat Manipülasyonu 2 İşlem 5 ile aynı 0xc9a469...221293c2 09 Tem 2025 12:26:25
8 İşlem 6 ile aynı 0x1cbf25...d853943a 09 Tem 2025 12:26:30
9 Fiyat Manipülasyonu 3 İşlem 5 ile aynı 0xb58415...3b4cfb0b 09 Tem 2025 12:27:22
10 İşlem 6 ile aynı 0x5a37ff...cb59c3b7 09 Tem 2025 12:27:28
11 Fiyat Manipülasyonu 4 İşlem 5 ile aynı 0xff6fe6...377bf108 09 Tem 2025 12:28:13
12 İşlem 6 ile aynı 0xbd65d6...e0187be6 09 Tem 2025 12:28:18
13 Fiyat Manipülasyonu 5 İşlem 5 ile aynı 0x105273...19fcdec6 09 Tem 2025 12:29:12
14 İşlem 6 ile aynı 0x0cdbac...84339fcc 09 Tem 2025 12:29:17
15 Kâr Gerçekleştirme Kârların gerçekleştirilmesi 0x03182d....a32626ef 09 Tem 2025 12:30:11
16 Geri Ödeme Saldırgana mesaj gönderme 0x92a39e...89547380 09 Tem 2025 14:04:19
17 GMX protokolüne yanıt 0x1d806c...919feac0 11 Tem 2025 06:29:00
18 Saldırgana yanıt 0x9c4ca9...39fa27fc 11 Tem 2025 07:42:17
19 Geri ödeme 0x62b845...99211841 11 Tem 2025 08:04:34
20 Geri ödeme 0x255d0a...9321b3 11 Tem 2025 08:08:27
21 Geri ödeme 0xceafc3...a6313b22 11 Tem 2025 10:17:23

Hazırlık Aşaması

  1. (İşlem 1) Saldırgan, emir yürütme sırasında varlık alıcısı olarak kullanılacak saldırı sözleşmesini dağıttı. Saldırı sözleşmesi kötü niyetli bir fallback() fonksiyonu içeriyordu.

  2. (İşlem 2) Saldırgan, OrderBook sözleşmesinde saldırı sözleşmesi için bir WETH-uzun emir artışı oluşturdu.

  3. (İşlem 3) Bir Keeper, saldırganın artırma emrini (adım 2'de oluşturulan) yürüterek saldırı sözleşmesi için bir WETH-uzun pozisyon açtı. (İşlem 3).

  4. (İşlem 4) Saldırgan, OrderBook sözleşmesinde saldırı sözleşmesi için bir WETH-uzun emir azaltması oluşturdu.

Manipülasyon Aşaması

  1. (İşlem 5) Bir Keeper, emir defteri yürütme yolu aracılığıyla saldırı sözleşmesinin WETH-uzun emir azaltmasını (adım 4'te oluşturulan) yürüttü. Yürütme yolu _transferOutETH() fonksiyonunu çağırdı ve saldırı sözleşmesindeki kötü niyetli fallback() fonksiyonunu tetikledi.

    fallback() "kaldıraç penceresi" açık durumdayken çağrıldığından, saldırı sözleşmesi globalShortAveragePrice'ı güncellemeden doğrudan Vault sözleşmesiyle etkileşime girerek (increasePosition() aracılığıyla) bir WBTC-kısa pozisyon açtı ve ardından bir WBTC-kısa emir azaltması/kapatma emri oluşturdu.

  2. (İşlem 6) Bir Keeper, yönlendirici yürütme yolu aracılığıyla WBTC-kısa emir azaltmasını (adım 5'te oluşturulan) yürüttü. Yürütme ayrıca PositionRouter sözleşmesindeki fallback mekanizması aracılığıyla bir WETH-uzun emir azaltması oluşturdu.

    WBTC-kısa pozisyonu globalShortAveragePrice güncellenmeden açıldığından, pozisyonu kapatırken değişkeni güncellemek globalShortAveragePrice'da beklenmedik bir düşüşe neden oldu.

  3. (İşlem 7-14) Saldırgan, adım 5-6'yı dört kez tekrarladı. Sonuç olarak globalShortAveragePrice, 1.08e35'ten 1.9e33'e çarpıtıldı.

Kâr Gerçekleştirme Aşaması

  1. (İşlem 15) Bir Keeper, emir defteri yürütme yolu aracılığıyla WETH-uzun emir azaltmasını (İşlem 14'te oluşturulan) yürüttü. Bu yürütme, OrderBook sözleşmesindeki yeniden giriş açığı nedeniyle saldırı sözleşmesindeki kâr gerçekleştirme mantığını tetikledi.

    1. Fallback çağrısında saldırı sözleşmesi önce 7.538.567e18 USDC tutarında bir flaş kredi aldı.

    2. Saldırı sözleşmesi, 6.000.000e18 USDC kullanarak 4.129.578e18 GLP basmak için mintAndStakeGlp() fonksiyonunu çağırdı.

    3. Saldırı sözleşmesi, kalan 1.538.567e18 USDC ile bir WBTC-kısa pozisyon açmak için Vault.increasePosition() fonksiyonunu çağırdı. WBTC'nin küresel açığa satış verileri son derece çarpıtılmış olduğundan, emir yürütme AUM'u önemli ölçüde artırdı ve GLP fiyatını keskin biçimde yükseltti.

    4. Saldırı sözleşmesi, Vault sözleşmesindeki birden fazla varlık için yükseltilmiş fiyat üzerinden GLP kullandırmak amacıyla unstakeAndRedeemGlp() fonksiyonunu çağırdı.

    5. Saldırı sözleşmesi, WBTC-kısa pozisyonu kapatmak için Vault.decreasePosition() fonksiyonunu çağırdı.

    6. Saldırı sözleşmesi, Vault sözleşmesindeki tüm varlıkları tüketmek için 8.b-8.e adımlarını dört kez tekrarladı.

    7. Saldırı sözleşmesi, yaklaşık 42 milyon dolar kârla flaş krediyi geri ödedi.

Geri Ödeme

Saldırganla yürütülen müzakereler (İşlem 16-18) sonucunda saldırgan %10 ödül kabul etti ve çalınan varlıkların geri kalanını iade etti (İşlem 19-21).

Özet

Bu olay, Arbitrum üzerindeki GMX V1'e karşı çok aşamalı bir istismarı kapsadı ve tahminen 42 milyon dolarlık bir kayıpla sonuçlandı. Saldırgan, globalShortAveragePrice değişkenini çarpıtmak ve GLP fiyatını şişirmek için OrderBook sözleşmesindeki yeniden giriş açığını istismar etti. Saldırgan, manipüle edilmiş fiyattan yararlanarak önemli miktarda varlık sifon etti.

Temel dersler:

  • Çapraz sözleşme yeniden girişi: Tek bir sözleşmedeki nonReentrant niteleyicisi, aynı sistem içindeki diğer sözleşmelere yeniden girişi engellemez. Geçici bir bayrana dayanan erişim kontrol mekanizmaları (ör. "kaldıraç penceresi"), bayrak sıfırlanmadan önce harici bir çağrı gerçekleştiğinde atlatılabilir.
  • Operasyonel Güvenlik: Bu saldırgan, protokolü üç ayrı aşamada istismar ederek toplam 15 işlem gerçekleştirdi. Bu olay, gerçek zamanlı izleme, hızlı uyarılar ve etkili müdahale planlarının kritik önemini vurgulamaktadır.

Referans

  1. https://x.com/GMX_IO/status/1942955807756165574
  2. https://x.com/GMX_IO/status/1943336664102756471
  3. GMX V1

BlockSec Hakkında

BlockSec, tam kapsamlı bir blok zinciri güvenliği ve kripto uyumluluk sağlayıcısıdır. Müşterilerin kod denetimi (akıllı sözleşmeler, blok zinciri ve cüzdanlar dahil) yapmasına, saldırıları gerçek zamanlı olarak engellemesine, olayları analiz etmesine, yasadışı fonları takip etmesine ve protokollerin ve platformların tam yaşam döngüsü boyunca AML/CFT yükümlülüklerini yerine getirmesine yardımcı olan ürünler ve hizmetler geliştiriyoruz.

BlockSec, saygın konferanslarda birden fazla blok zinciri güvenlik makalesi yayımlamış, DeFi uygulamalarının çeşitli sıfırıncı gün saldırılarını raporlamış, 20 milyon dolardan fazlasını kurtarmak için birden fazla saldırıyı engellemiş ve milyarlarca dolar değerinde kripto para güvence altına almıştır.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit