Dengeleyici güvenlik açığı analizi

arka plan

22 Ağustos'ta Balancer, birden fazla V2 Boost havuzunu etkileyen ciddi güvenlik açığı raporları aldığını resmi olarak duyurdu. TVL'nin yalnızca %1,4'ü etkilendi. Birden fazla havuz askıya alındı ve kullanıcılara, likidite LP'sini mümkün olan en kısa sürede çekmeleri konusunda bilgi verildi. [1] [2]

27 Ağustos'ta SlowMist MistEye sistemi, Balancer güvenlik açığından yararlanıldığından şüphelenilen bir saldırı işlemi keşfetti. [3]

Havuzun askıya alınamaması ve bazı fonların hala saldırıdan etkilenmesi nedeniyle Balancer yetkilileri, etkilenen havuzdaki LP'leri geri almaları konusunda kullanıcılara bir kez daha hatırlatıyor. [4] Ardından Balancer, Ağustos ayında açıklanan güvenlik açığının ayrıntılarını Medium'da resmi olarak yayınladı. [5] SlowMist güvenlik ekibi inceledi, ayrıntılar şu şekilde:

Giriiş

Balancer yetkilileri, açıklamalarında bu seferki sorunun doğrusal havuzun aşağı yuvarlanması ve birleştirilebilir havuzun sanal arzının bptSupply'nin 0 olmasına neden olması olduğunu belirttiler. Öncelikle bu zafiyetle ilgili Balancer protokolünün içeriğini kısaca anlayalım.

Dengeleyici V2 Kasası

Dengeleyici V2 [6] Protokol, programlanabilir likidite için esnek bir yapı taşını temsil eden, Ethereum'a dayalı, merkezi olmayan bir otomatik piyasa yapıcı (AMM) protokolüdür. Temel bileşeni, tüm havuzların kayıtlarını tutan ve yerel ETH'nin paketlenmesi ve açılması da dahil olmak üzere tokenların muhasebesini ve transferini yöneten Vault sözleşmesidir. Başka bir deyişle Vault, token muhasebesini ve yönetimini havuz mantığından ayırmak için uygulanır.

Vault'ta joinPool, ExitPool, Swap ve BatchSwap olmak üzere dört arayüz bulunmaktadır (katılma, çıkma ve takas etme ayrı çağrılardır ve tek bir çağrıda bunların birleşimi yoktur). Öne çıkan özelliklerden biri, birden fazla havuz arasında birden fazla atomik değişimi gerçekleştirebilen ve bir havuz değişiminin çıktısını başka bir havuzun girişine (GiveIn ve GiveOut) bağlayabilen BatchSwap'tir. Sistem aynı zamanda yıldırım takaslarını da tanıtıyor [7] , dahili flaş krediye benzer.

Doğrusal Havuzlar Doğrusal Havuz

LP'nin sermaye verimliliğini ve yüksek warp ve unwarp ek yükü sorununu iyileştirmek için Balancer, V2'de bir çözüm olarak doğrusal havuzu başlattı ve böylece BPT (ERC20 Balancer Pool Token) tokenini tanıttı.

doğrusal havuz [8] Ana token (temel varlık), sarılmış token (sarılmış token) ve BPT tokeni dahil olmak üzere varlıklar ve bunların getirileri olan sarılmış muadilleri, bilinen döviz kurları üzerinden değiştirilir. Sarılmış tokenlerin oranı ne kadar yüksek olursa, havuzun getirisi ve sermaye verimliliği de o kadar yüksek olur. Çözgü işlemi sırasında, farklı tokenlerin aynı doğrulukla hesaplanmasını sağlamak için genellikle ölçeklendirme faktörleri kullanılır.

Şekillendirilebilir Havuzlar Şekillendirilebilir Havuz

Tüm Dengeleyici havuzları, diğer tokenları içeren şekillendirilebilir havuzlardır ve havuzun kendisinin de kendi tokenları vardır. Bunlar arasında BPT para birimi, tüm havuzların temeli olan ERC20 dengeli havuz tokenini ifade eder. Kullanıcılar, BPT tokenlerini diğer havuzlarda kullanmak üzere serbestçe birleştirebilir. Kullanım her zaman bir havuz ve iki jeton içerir: GiveIn ve GiveOut. In, bileşen belirteçlerinin gönderilmesi ve BPT alınması anlamına gelirken Out, BPT gönderilip bileşen belirteçlerinin alınması anlamına gelir. BPT'nin kendisi bir bileşen tokeni olsaydı, diğer tokenler gibi takas edilebilirdi. Böyle bir uygulama, harici havuzdaki temel varlıklar ve tokenler arasında basit bir toplu Takas yolu oluşturur. Kullanıcılar, doğrusal havuzun temel varlıklarını takas etmek için BPT'yi kullanabilir. Bu aynı zamanda Balancer Boosted Pool'dur. [9] Temel.

Yukarıdaki kombinasyon sayesinde Balancer'ın birleştirilebilir havuzu oluşturulur. Bir bb-a-USD şekillendirilebilir stabil havuz, harici protokole (Aave) atıl likidite gönderirken üç doğrusal havuzdan oluşur. Örneğin, bb-a-DAI, DAI ve waDAI (sarılmış aDAI) içeren doğrusal bir havuzdur. Kullanıcının toplu olarak Swap yapması gerektiğinde (USDT'yi DAI'ye değiştirmek gibi), değişim yolu örneği aşağıdaki gibidir:

  1. USDT doğrusal havuzunda, USDT'yi bb-a-USDT ile değiştirin (USDT doğrusal havuzuna girin);

  2. bb-a-USD'de bb-a-USDT, bb-a-DAI ile değiştirilir (doğrusal BPT arasındaki değişim);

  3. DAI doğrusal havuzunda bb-a-DAI, DAI ile değiştirilir (DAI doğrusal havuzundan çıkar).

Yukarıdaki önkoşul bilgileri kısaca anladıktan sonra zafiyet analizi bağlantısına giriyoruz.

analiz et

27 Ağustos'ta SlowMist güvenlik ekibi, MistEye sisteminden, Balancer'daki şüpheli bir güvenlik açığının vahşi ortamda istismar edildiğine dair bir kimlik aldı. ticaret [3] aşağıdaki gibi:

Saldırgan ilk olarak AAVE'den flaş kredi yoluyla 300.000 USDC borç aldı. Daha sonra, birleştirilebilir stabil havuz bb-a-USD havuzu üzerinden BPT tokenlarının değişim hesaplamasını gerçekleştirmek için Vault'un BatchSwap işlemi çağrılır.Son olarak 94.508 USDC, 59.964 bb-a-USDC, 68.201 bb-a-DAI ve 74.280 ile değiştirilir. bb-a-USDT. Son olarak, elde edilen BPT tokenleri, temel varlıklar karşılığında Vault sözleşmesinin çıkış havuzu aracılığıyla havuzdan çıkacak, flaş krediyi geri ödeyecek ve piyasadan yaklaşık 108.843,7 ABD doları karla ayrılacak.

Bu saldırının anahtarının BatchSwap'te olduğu görülüyor ve BatchSwap'te tam olarak ne oldu? Hadi daha yakından bakalım.

BatchSwap sürecinin tamamı boyunca, saldırgan önce bb-a-USDC havuzunda USDC'yi kullandı ve ardından BPT tokenlarını değiştirerek bb-a-USDC'yi bb-a-DAI, bb-a-USDT ve USDC ile değiştirdi. Son olarak, temeldeki ana token USDC, bb-a-USDT ile değiştirilir. Başka bir deyişle, bb-a-USDC, BPT token'ının anahtarı olarak GiveOut ve GiveIn'in bileşen token'ı olarak hizmet ediyor.

İlk adımda, saldırgan BPT tokenlerini sabit bir ölçeklendirme faktörü ile bb-a-USDC doğrusal havuzundaki USDC ana tokenleri ile değiştirir ve artan miktar havuzdaki bptBalance'a kaydedilir. Ancak ikinci onSwap değişiminden sonra, aynı değişim sürecinde takas edilen USDC'nin miktar Out değerinin 0 olduğunu gördük. Bu neden?

onSwap işlevinin derinliklerine indiğimizde, bu süreçte doğruluğun nominal olarak işleneceğini ve karşılık gelen tokenın ölçeklendirme faktörünün hesaplanacağını görüyoruz. Daha sonra _downscaleDown işlevi çağrıldığında miktarOut aşağı yuvarlanır. If miktarOut ve scalingFactors [indexOut] Değerler arasındaki fark büyüktür ve hesaplanan _downscaleDown değeri sıfırdır.

Yani ana tokenları kullanmak için BPT tokenlarını kullandığımızda, miktarOut çok küçükse, dönüş değeri sıfıra yuvarlanır ve bu değer, scalingFactors tarafından hesaplanan 1e12'den küçüktür. Ancak miktarIn'den gelen bb-a-USDC tutarı yine de bptBalance sanal tutarına eklenecek ve bu işlem bb-a-USDC havuzundaki bakiyeyi artıracak ki bu da tek taraflı bb eklenmesi olarak değerlendirilebilir. -a-USDC likiditesi.

Daha sonra, birleştirilebilir sabit havuzun özelliklerini kullanarak, BPT tokenleri arasındaki karşılıklı dönüşüm yoluyla, önce bb-a-USDC'yi diğer BPT tokenleri ile değiştirin. Bu değişim sürecini takip etmek için sabit havuzun aşağıdaki çağrı yolunu birleştirebilirsiniz: bb-a-DAI onSwap -> _swapGivenIn -> _onSwapGivenIn. İlk olarak bb-a-USDC'yi bb-a-DAI ve bb- ile değiştirin. a-USDT sırayla. Çevrimiçi doğrusal havuzların aksine, oluşturulabilir kararlı havuzlar, onSwap işlemlerinden önce döviz kurunun önbellek güncellemelerini gerektirir. Koddan, kombinasyon havuzunda onSwap'in ilk önce önbelleğe alınan token döviz kurunun güncellenmesi gerekip gerekmediğini belirleyeceğini görebiliriz.

Önceki değişimin ardından bb-a-USDC miktarı değişti ve _toNominal aracılığıyla nominalleştirme sonrasındaki gerçek toplam tutar totalBalance 994.010.000.000, BPT tokenlarının sanal arzı ise 20.000.000.000 oldu. Güncellenen döviz kurunun önceki doğrusal havuz orijinal önbellek döviz kuru olan 1.100.443.876.587.504.549'un neredeyse 45 katı olduğu, yani 49.700.500.000.000.000.000 olduğu hesaplanabilir.

Daha sonra doğrusal havuzda bb-a-USDC, USDC ile değiştirilir. Ancak bu değişim ikinci değişimle aynıdır, bu da yine miktarOut'un 0'a yuvarlanmasına neden olur ve değişim yolu öncekiyle aynıdır.

Bir sonraki değişim USDC'yi bb-a-USDC'ye çevirmektir ve değişim yolu onSwap -> onSwapGivenIn -> _swapGivenMainIn'dir. Bu süreçte, kullanılması gereken miktar Out'u hesaplarken, sanal arz hesaplamasının, kullanılan BPT tokeninin toplam arzı ile havuzda kalan 0 miktarı arasındaki farka dayandığını gördük.

Bunun nedeni bptSupply'ın 0 olması ve BPT Out hesaplanırken doğrudan _toNominal fonksiyonunun çağrılması ve bu yolun çağrılmasının USDC'nin bb-a-USDC'ye değişim oranını 1:1'e yakın hale getirmesidir.

Özetle

BatchSwap, birden fazla havuz arasında birden fazla atomik takas yoluyla bir havuzun değişiminin çıktısını başka bir havuzun girişine (tokenIn ve tokenOut) bağlar ve USDC'yi BPT tokenlarına dönüştürür. Bu BatchSwap'te gerçek bir token transferi gerçekleşmez ancak nihai değişim tutarı, giren ve çıkan aktarılan miktar kaydedilerek onaylanır. Doğrusal havuz, temel varlık tokenı aracılığıyla değiştirildiği için, değişim yöntemi, Oranı sanal bir arz ve sabit bir algoritma yoluyla hesaplamaktır. Bu nedenle, BatchSwap'te iki güvenlik açığı vardır:

Birincisi, doğrusal havuzların aşağı yuvarlama problemidir. Saldırgan, önbelleğe alınan jetonların oranını artırmak için yuvarlama yoluyla ana jetonları tek taraflı olarak havuza ekler, böylece karşılık gelen şekillendirilebilir havuzdaki jeton döviz kurunu manipüle eder;

İkincisi, birleştirilebilir havuzun sanal arz özellikleri nedeniyle, sanal arz, havuzdaki bakiyenin BPT tokenından çıkarılmasıyla hesaplanır. Eğer GiveIn, itfa anında bir BPT tokeni ise, bu kısım sonraki bakiyeden düşülecektir. Supply. , saldırganın yalnızca BPT'yi GiveIn olarak değiştirmesi ve önce arzını 0'a manipüle etmesi, ardından ters takas yapması gerekir, yani daha sonra BPT GiveOut tarafı olarak kullanılır. Şu anda arz 0 olduğundan, algoritma 1'e yakın olacaktır: 1 oranı, gerçek ödeme için doğrusal havuzun ödeme oranından düşüktür, bu da GiveOut'un BPT tokenlarının sayısının dolaylı olarak manipüle edilmesine neden olur.

Birinci güvenlik açığının döviz kurunu arttırdığını, ikinci güvenlik açığının ise döviz kurunu ters yönde düşürdüğünü görebiliriz.Saldırgan çifte buff'tan yararlanarak kar elde edip ayrıldı.

Referans bağlantısı:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[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
  • Share
Comment
0/400
No comments
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)