Balancer V2 saldırı olayı ön analiz

3 Kasım'da, Balancer V2 protokolü ve onun fork projeleri birden fazla zincirde saldırıya uğradı ve $120M'dan fazla ciddi kayba yol açtı. BlockSec, [1]'i ilk anda uyardı ve başlangıç analiz sonuçlarını verdi [2]. Bu, son derece karmaşık bir saldırı olayıdır. İlk analizimiz, temel nedenin saldırganların değişmezlikleri (invariant) manipüle etmesi olduğunu gösteriyor, bu da BPT'nin (Balancer Pool Token ) – yani pool'ün LP token'ı – fiyat hesaplamasını çarpıtmasına neden oldu ve bir batchSwap işlemi ile belirli bir stabil havuzda (stable pool) kar elde edebilmesine olanak tanıdı.

Arka Plan Bilgisi

1. Ölçekleme (scaling) ve yuvarlama (rounding)

Farklı tokenlerin ondalık basamaklarını birleştirmek için, Balancer sözleşmesi şunları yapar:

  • upscale:Bakiyeyi ve tutarı birleştirip içsel hassasiyeti artırarak hesaplama yapmak;
  • ölçek küçültmek: Sonuçları yerel kesinliğe geri döndürmek ve yönlü bir yuvarlama yapmak (örneğin, giriş tarafı genellikle yukarı yuvarlama yapar, havuzun yeterli geliri olmasını sağlamak için; çıkış yolu genellikle aşağı kesme içerir).

Sonuç: Aynı işlem içinde, farklı aşamalarda kullanılan yuvarlama yönü asimetrik olduğunda, çok küçük adımlarla tekrar tekrar gerçekleştirildiğinde sistematik küçük sapmalar ortaya çıkacaktır.

2. D ve BPT fiyatı

Bu saldırıdan etkilenen, Balancer V2 protokolünün Composable Stable Pool [3] ve fork edilmiş protokoldür. Stable Pool, 1:1 dönüşüm oranını koruması (veya bilinen bir döviz kuru üzerinden dönüşüm yapılması) beklenen varlıklar için kullanılır ve önemli fiyat dalgalanmaları yaratmadan büyük miktarda dönüşüme izin vererek benzer varlıklar veya ilgili varlıklar arasında sermaye kullanım verimliliğini önemli ölçüde artırır.

  • Bu havuz Stable Math (Curve tabanlı StableSwap modeli) kullanmaktadır, değişmez D havuzun “sanali toplam değerini” temsil eder.
  • BPT (Pool'un LP Token'ı ) fiyatı yaklaşık olarak:

Yukarıdaki formülden görülebileceği gibi, D'yi defterde küçültmek (fonların gerçekte kaybolmamış olsa bile) BPT fiyatını daha ucuz hale getirebilir. BTP, Havuzun payını temsil eder ve likiditeyi çektiğinizde Havuzdaki Rezervden ne kadar alabileceğinizi hesaplamak için kullanılır, bu nedenle eğer saldırgan daha fazla BPT elde edebilirse, sonrasında likiditeyi çekerken kar elde edebilir.

Saldırı Analizi

Arbitrum üzerindeki bir saldırı işlemi örneği olarak, batchSwap işlemi üç aşamaya ayrılabilir:

Birinci aşama: Saldırgan, BPT'yi temel varlığa dönüştürerek, belirli bir tokenin (cbETH) bakiyesini yuvarlama sınırının kritik noktasına (miktar = 9) hassas bir şekilde ayarlamaktadır. Bu adım, bir sonraki aşamanın hassasiyet kaybı (precision loss) için koşulları oluşturur.

İkinci aşama: Saldırgan, dikkatlice yapılandırılmış bir miktar (= 8) kullanarak, başka bir temel varlık (wstETH) ile cbETH arasında takas yapar. Token miktarını ölçeklendirme sırasında aşağı yuvarlama (rounding down) yapıldığı için, hesaplanan Δx biraz daha küçük (8.918'den 8'e) olur, bu da Δy'nin düşük tahmin edilmesine ve D'nin (Curve'ün StableSwap modelinden kaynaklanır) küçülmesine neden olur. BPT fiyatı = D / totalSupply olduğundan, BPT fiyatı yapay olarak düşürülmüştür.

Üçüncü aşama: Saldırgan, temel varlıkları geri BPT'ye değiştirirken, havuz içindeki dengeyi geri kazanır ve düşürülmüş BPT fiyatından yararlanarak kâr elde eder – daha fazla BPT Token kazanır.

Son olarak, saldırgan başka bir kâr işlemi kullanarak likidite çekiminde bulunuyor ve bu sayede kazandığı ek BPT ile Pool'daki diğer temel varlıklar olan (cbETH ve wstETH) üzerinden kâr elde ediyor.

Saldırı işlemi:

Kar elde etme işlemi:

Referans:

[1]

[2]

[3]

BPT-0.9%
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • Comment
  • Repost
  • Share
Comment
0/400
No comments
  • Pin
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate App
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)