Back to Blog

#3 Balancer V2 Olayı: Yuvarlama Tutarsızlığı Değişmezi Bozuyor ve Zincirler Arasında Yayılıyor

Code Auditing
February 10, 2026
5 min read

#3 Balancer V2 Olayı: Bir Yuvarlama Tutarsızlığı Değişmezi Bozuyor ve Zincirler Arasında Yayılıyor

3 Kasım 2025'te Balancer V2'nin Composable Stable Pool'ları ve birden fazla zincirdeki çeşitli çatallanmış projeler, toplam kayıpların 125 milyon doları aştığı ve yaklaşık 45 milyon doların geri kazanıldığı koordineli bir saldırıya maruz kaldı. Temel neden, değişmez hesaplamadaki hassasiyet kaybından kaynaklanan fiyat manipülasyonuydu; bu durum, yukarı ölçekleme ve aşağı ölçekleme işlemleri arasındaki tutarsız yuvarlama işleminden kaynaklanıyor ve nihayetinde BPT (Balancer Pool Token) fiyatlandırma mantığını bozuyordu.

Bu olay, 2025'in en önemli on güvenlik olayından biri olarak öne çıkmaktadır; yalnızca kayıpların büyüklüğü nedeniyle değil, aynı zamanda altta yatan hatanın inceliği nedeniyle de. Üstelik saldırı, birden fazla zincire hızla yayıldı ve hem Balancer'ı hem de çatallarını etkileyerek paylaşılan kod tabanlarının ve birleştirilebilir DeFi altyapısının sistemik riski önemli ölçüde nasıl artırabileceğini gözler önüne serdi.

"Derinlemesine Analiz: Balancer V2 Saldırısı" [1] başlıklı kapsamlı bir rapor yayınladık; bu rapor ayrıntılı bir teknik çözümleme sunmaktadır. Aşağıda olayın kısa bir özeti sunulmaktadır.

Arka Plan

Balancer V2'nin Composable Stable Pool'u

Bu saldırıda etkilenen bileşen, Balancer V2 protokolünün Composable Stable Pool'u [2] idi. Bu havuzlar, yaklaşık 1:1 paritesini koruması beklenen (veya bilinen bir döviz kuruyla işlem gören) varlıklar için tasarlanmıştır ve minimal fiyat etkisiyle büyük takaslar yapılmasına olanak tanıyarak benzer veya ilişkili varlıklar arasındaki sermaye verimliliğini önemli ölçüde artırır. Her havuzun, likidite sağlayıcısının havuzdaki payını temsil eden kendi Balancer Pool Token'ı (BPT) ve karşılık gelen temel varlıkları bulunmaktadır.

  • Bu havuz, değişmez D'nin havuzun sanal toplam değerini temsil ettiği Stable Math'ı (Curve'ün StableSwap modeline dayalı) benimser.

  • BPT fiyatı şu şekilde yaklaşık olarak ifade edilebilir:

Price(BPT)DtotalSupplyPrice(BPT) \approx \frac{D}{totalSupply}

Yukarıdaki formülden hareketle, D kâğıt üzerinde daha küçük gösterilebilirse (gerçek bir fon kaybı olmaksızın bile), BPT fiyatı daha ucuz görünecektir.

batchSwap() ve onSwap()

Balancer V2, Vault [3] içinde çok adımlı takaslar gerçekleştirmeyi sağlayan batchSwap() fonksiyonunu sunar. Bu fonksiyona iletilen bir parametre ile belirlenen iki takas türü vardır:

  • GIVEN_IN ("Verilen Giriş"): çağıran, girdi token'ının tam miktarını belirtir ve havuz buna karşılık gelen çıktı miktarını hesaplar.
  • GIVEN_OUT ("Verilen Çıkış"): çağıran, istenen çıktı miktarını belirtir ve havuz gerekli girdi miktarını hesaplar.

Tipik olarak bir batchSwap(), onSwap() fonksiyonu aracılığıyla gerçekleştirilen birden fazla token-to-token takasından oluşur. Bu süreç, kaçınılmaz olarak değişmez D [1] ile bağlantılı miktar hesaplamalarını içerir.

Ölçekleme ve Yuvarlama

Farklı token bakiyeleri arasındaki hesaplamaları normalleştirmek için Balancer şu iki işlemi gerçekleştirir:

  • Yukarı ölçekleme: Hesaplamalar yapılmadan önce bakiyeleri ve miktarları birleşik bir dahili hassasiyete yükseltir.
  • Aşağı ölçekleme: Sonuçları yönlü yuvarlama uygulayarak kendi yerel hassasiyetlerine geri dönüştürür (örneğin, girdi miktarları genellikle havuzun eksik ücret almamasını sağlamak için yukarı yuvarlanırken, çıktı miktarları genellikle aşağı yuvarlanır).

Yukarı ölçekleme ve aşağı ölçekleme teorik olarak eşlenmiş işlemlerdir: sırasıyla çarpma ve bölme. Ancak bu iki işlemin uygulanmasında bir tutarsızlık mevcuttur. Özellikle, aşağı ölçekleme işleminin iki varyantı veya yönü vardır: divUp ve divDown. Buna karşın, yukarı ölçekleme işleminin yalnızca bir yönü vardır: mulDown.

Güvenlik Açığı Analizi

Temel sorun, BaseGeneralPool._swapGivenOut() fonksiyonundaki yukarı ölçekleme sırasında gerçekleştirilen aşağı yuvarlama işleminden kaynaklanmaktadır. Özellikle, _swapGivenOut(), _upscale() fonksiyonu aracılığıyla swapRequest.amount değerini yanlış biçimde aşağı yuvarlar. Elde edilen yuvarlanan değer, _onSwapGivenOut() aracılığıyla amountIn hesaplanırken amountOut olarak kullanılır. Bu davranış, yuvarlamanın protokolün yararına olacak şekilde uygulanması gerektiği standart uygulamayla çelişmektedir.

Bu nedenle, belirli bir havuz (wstETH/rETH/cbETH) için hesaplanan amountIn, gerçekte gereken girdiyi olduğundan düşük tahmin eder. Bu durum, bir kullanıcının daha az miktarda bir temel varlığı (örn. wstETH) başka bir varlıkla (örn. cbETH) değiştirmesine olanak tanır; böylece azalan efektif likidite sonucunda değişmez D düşer. Sonuç olarak, karşılık gelen BPT'nin (wstETH/rETH/cbETH) fiyatı yapay olarak düşer; çünkü BPT fiyatı = D / totalSupply.

Saldırı Analizi

Saldırgan, muhtemelen tespit riskini en aza indirmek amacıyla iki aşamalı bir saldırı gerçekleştirdi:

  • Birinci aşamada, tek bir işlem içinde temel saldırı gerçekleştirildi ve anlık bir kâr elde edilmedi.
  • İkinci aşamada, saldırgan ayrı bir işlemde varlıkları çekerek kâr elde etti.

Birinci aşama, parametre hesaplama ve toplu takas olmak üzere iki alt aşamaya ayrılabilir. Aşağıda bu aşamaları Arbitrum üzerindeki örnek bir saldırı işlemi (TX) kullanarak açıklıyoruz.

Parametre Hesaplama Aşaması

Bu aşamada saldırgan, Composable Stable Pool'un mevcut durumuna (ölçekleme faktörleri, amplifikasyon katsayısı, BPT oranı, takas ücretleri ve diğer parametreler dahil) dayanarak bir sonraki (toplu takas) aşamasındaki her adımın parametrelerini hassas biçimde ayarlamak için zincir dışı hesaplamaları zincir üstü simülasyonlarla birleştirdi. Saldırgan ayrıca bu hesaplamalarla yardımcı olması için bir yardımcı sözleşme devreye aldı; bu durum, ön işlem riskini azaltmaya yönelik bir girişim olmuş olabilir. Daha fazla ayrıntı için lütfen [1]'e bakınız.

Toplu Takas Aşaması

Ardından batchSwap() işlemi üç adıma ayrılabilir:

Adım 1: Saldırgan, bir token'ın (cbETH) bakiyesini yuvarlama sınırının kenarına (miktar = 9) hassas biçimde ayarlamak için BPT'yi (wstETH/rETH/cbETH) temel varlıklarla takas eder. Bu, bir sonraki adımda hassasiyet kaybı için gerekli koşulları hazırlar.

Adım 2: Saldırgan, özel olarak hazırlanmış bir miktar (= 8) kullanarak başka bir temel varlık (wstETH) ile cbETH arasında takas yapar. Token miktarlarını ölçeklerken aşağı yuvarlama nedeniyle hesaplanan Δx biraz daha küçük olur (8,918'den 8'e), bu da küçük tahmin edilen Δy'ye ve dolayısıyla daha küçük bir değişmeze (Curve'ün StableSwap modelinden D) yol açar. BPT fiyatı = D / totalSupply olduğundan, BPT fiyatı yapay olarak düşer.

Adım 3: Saldırgan, temel varlıkları BPT'ye geri takas ederek dengeyi yeniden sağlar ve düşürülmüş BPT fiyatından kâr elde eder.

Özet

Bu olay, Balancer V2'nin Composable Stable Pool'larını ve farklı zincirlerdeki birden fazla çatallanmış dağıtımı hedef alan koordineli bir dizi saldırı işlemini kapsadı ve önemli kayıplara neden oldu. İlk saldırının ardından taklitçi işlemler hızla ortaya çıktı; bu durum, bir saldırı modelinin bir kez açığa çıktıktan sonra ne kadar hızlı yayılabileceğini gösterdi.

Temel dersler:

  • Yuvarlama ve Hassasiyet İşleme: Token miktarları üzerindeki her ölçekleme ve hassasiyet işlemi, protokolün yararına olacak yönde yuvarlanmalıdır. _upscale() (yalnızca aşağı yuvarlama) ile aşağı ölçekleme işlemleri (yönlü yuvarlama) arasındaki tek bir tutarsızlık, istismar edilebilir bir fiyatlandırma bozukluğu yaratmaya yeterliydi.
  • Güvenlikteki Silahlanma Yarışı: Saldırgan, manipülasyonu ve kâr çıkarmayı tespiti atlatmak için ayrı işlemlere böldü. Tespit sistemleri, yalnızca bireysel işlemleri işaretlemek yerine ilgili işlemleri ilişkilendirmelidir.
  • Operasyonel Güvenlik: Saldırı modeli kamuya açık hale geldiğinde, taklitçiler dakikalar içinde bunu zincirler arasında kopyaladı. Ortak bir kod tabanını paylaşan protokollerin koordineli izlemeye ve hızlı zincirler arası duraklatma yeteneklerine ihtiyacı vardır.

Referans

  1. https://blocksec.com/blog/in-depth-analysis-the-balancer-v2-exploit

  2. https://docs-v2.balancer.fi/concepts/pools/composable-stable.html

  3. https://docs-v2.balancer.fi/reference/swaps/batch-swaps.html


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 gerçekleştirmesine (akıllı sözleşmeler, blok zinciri ve cüzdanlar dahil), saldırıları gerçek zamanlı olarak önlemesine, olayları analiz etmesine, yasadışı fonları takip etmesine ve protokollerin ve platformların tüm yaşam döngüsü boyunca AML/CFT yükümlülüklerini karşılamasına yardımcı olan ürün ve hizmetler geliştiriyoruz.

BlockSec, saygın konferanslarda birden fazla blok zinciri güvenlik makalesi yayımlamış, DeFi uygulamalarına yönelik çeşitli sıfır gün saldırılarını raporlamış, birden fazla saldırıyı engelleyerek 20 milyonun üzerinde doları kurtarmış ve milyarlarca dolarlık kripto para birimini 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