DeFiTuna'ya yuvarlamayı öğrettiler: bir mantık hatası $570K USDC'ye mal oldu

DeFiTuna'ya yuvarlamayı öğrettiler: bir mantık hatası $570K USDC'ye mal oldu

DeFi protokolü, saldırganların ödeme gücü kontrolü mekanizmasındaki bir yuvarlama hatasından yararlanmasının ardından yarım milyon doların üzerinde kayba uğradı. Değerli bir pozisyonun sistem için nasıl «sıfır» hâline getirildiğini inceliyoruz.

20 Tem 2026

Saldırı, protokolün teknik özelliklerinin alışılmadık bir kombinasyonu üzerine kuruldu. Saldırganlar neredeyse boş bir TUNA/USDC likidite havuzu oluşturdu ve ardından ödünç alınan USDC fonlarını Jupiter takas toplayıcısı aracılığıyla bu havuza yönlendirdi.

Takas sonucunda çok az miktarda TUNA token'ı elde edildiğinden, DeFiTuna'nın varlık değerleme sistemi, yuvarlama özelliği nedeniyle pozisyonun değerini sıfıra eşit saydı. Bunun ardından protokol, bu pozisyonu yanlışlıkla finansal açıdan sağlam kabul ederek saldırganların ödeme gücü kontrolünü aşmasına ve ödünç alınan fonları kendi kontrollerindeki likidite pozisyonları aracılığıyla çekmesine izin verdi.

Saldırganların adresleri:

  • 9ytGWP8tCRF1keREJ5VHqBpSuM9MZYwm3oFQQa1SvESb
  • 917DKTphW3rhBG5gsJpwKsNGisNV2dx74uUFd8HBEjtg
  • 7hiHL8AgDuLNVDQLfN3GHdLAEeCN1F7uz6nSANRvFJst
  • BK9aTnKfPNnnj45Me5ACrky2vexzUrZHRzr4BjmQpH3c
  • 8P3H7Hy98LWhw5QhuXdoigVdAzPCYRTYjdtQQKhGwvqD
  • GrXBhM6Ty6YxubFp8zubtJF12WXmKj1dhMyakRPeaDpo
  • F4xUroPaHro4gb2JAqa3e93E7DdZytRQJ4L2cHT5E53p
  • ETGhosPrFApbiiKXDpxrhBz7J2MdTA3dxnL2Nkio9vEX
  • 4ZKkGZuoXqgSHbmsJXUib3dgn5WNhzbPEXrxuMYJ5oQ3
  • 917DKTphW3rhBG5gsJpwKsNGisNV2dx74uUFd8HBEjtg

Ele geçirilen adres:

  • D76dDcSU5HnAGqVEZCDLyGgLpTp4xZuqeZyVDtUdDv55

Saldırı nasıl gerçekleşti: boş havuzdan fonların çekilmesine

Token'ın başlangıç fiyatı, resmî fiyat oracle'ının gösterdiği değere olabildiğince yakın belirlendi. Bu sayede DeFiTuna protokolü, yerleşik fiyat sapması kontrolünü başarıyla geçti ve şüpheli hiçbir şey tespit etmedi.

Ardından saldırganlar, bu havuza anormal derecede yüksek bir fiyat seviyesinde, tick 208,640'ta, yalnızca 0.001052 TUNA (her biri 0.000526 TUNA olmak üzere iki eşit parça hâlinde) ekleyerek kendilerine ait iki limit pozisyonu yerleştirdi.

Bunun ardından DeFiTuna protokolünün Open_and_increase_tuna_spot_position_jupiter fonksiyonu çağrıldı. Talimat verilerinin analizi, saldırganın herhangi bir kendi teminatı olmadan bir işlem pozisyonu açtığını gösterdi.

Likidite havuzundan kredi olarak alınan yaklaşık 570 bin USDC (komisyon düşüldükten sonra), Jupiter'in yerleşik yönlendiricisi aracılığıyla otomatik olarak yönlendirildi. 47 baytlık takas talimatında, fonların izlemesi gereken rota önceden belirtilmişti.

Fiilen tutarın tamamı, 569,601 USDC, önceden hazırlanmış düşük likiditeli havuz aracılığıyla TUNA token'larına takas edildi. Bu havuzdaki tek mevcut emirler saldırganların tick 208640 seviyesinde oluşturduğu pozisyonlar olduğundan, takas tam da bunların üzerinden gerçekleşti.

%0.1 komisyon dikkate alındığında, takasın nihai sonucu şöyle oldu:

Yuvarlamadan sonra protokol yalnızca 0.000494 TUNA aldı.

Hata nerede oluştu

Bu kadar önemsiz miktarda token alan DeFiTuna, pozisyonun değerini, fiyat oracle'ının verilerine göre takastan önce mevcut olan fiyatı kullanarak hesaplamaya başladı. is_healthy() → compute_total_and_debt() fonksiyonunda değer şöyle hesaplanıyordu:

Bir sonraki aşamada to_num() fonksiyonu bu sayıyı tam sayı değerine dönüştürüyordu. Ancak böyle bir dönüşümde ondalık kısım tamamen atılıyor. Sonuç olarak:

İşte kritik hata tam burada ortaya çıktı. Yuvarlamadan sonra sistem, pozisyonun toplam değerinin sıfır olduğuna karar verdi. Ardından protokol yerleşik bir kural uyguladı:

Bu mantıktan hareketle sistem, pozisyonun tamamen güvenli olduğu ve ödeme gücü gerekliliklerini karşıladığı yönünde hatalı bir sonuca vardı. Gerçekte tüm USDC fonları ekonomik olarak zaten saldırganların önceden oluşturduğu iki limit emrine aitti. Kontrolü başarıyla aştıktan sonra her iki adres de DecreaseLimitOrder fonksiyonunu çağırdı ve her biri 284,280.483231 USDC çekti.

DeFiTuna'nın koruması neden işe yaramadı

Sorun, ödeme gücü kontrolü mekanizması TunaPosition.is_healthy() içindeydi. compute_total_and_debt() fonksiyonu, varlıkların değerini bir referans fiyat kullanarak hesaplıyor ve ardından sonucu to_num() fonksiyonuyla aşağı yuvarlıyordu. Saldırganlar kasıtlı olarak son derece dengesiz bir likidite havuzu oluşturdu.

Ödünç alınan USDC keyfi bir takas rotası aracılığıyla bu havuza yönlendirildikten sonra, o kadar az TUNA geri döndü ki pozisyonun değeri, yuvarlamadan sonra sıfıra eşit hâle geldi. Ödeme gücü kontrolünü tamamen aşmayı ve ödünç alınan fonları çekmeyi mümkün kılan tam da buydu.

Çalınan $570K nereye gitti

Saldırının ardından çalınan varlıklar birkaç ara cüzdan arasında dağıtıldı ve ardından iki ana adreste toplandı.

Bunun ardından fonlar, Mayan cross-chain köprüsü aracılığıyla Solana ağından Ethereum'a aktarıldı. Ethereum ağında ise 140 ETH, şu adresten Railgun gizli transfer hizmetine gönderildi: 0x6a2e244af2c17CFc64e8ca0EA4335318EdF20B0B.

Aynı zamanda, bu materyalin hazırlandığı sırada yaklaşık 300K DAI şu cüzdanda kalmaya devam ediyordu: 0x509B9D094A6C26D716aaC131E8aDee5B16B86d3e.

#USDC#Hackleme#Solana#Ethereum
DeFiTuna'da yuvarlama hatası: hackerlar $570K USDC çekti