Back to Blog

Sinir Köprüsü Güvenlik Olayının Analizi

Code Auditing
November 18, 2021
4 min read

0x.1 Önsöz

15 Kasım 2021'de dahili izleme sistemimiz, BSC üzerinde şüpheli flashloan işlemlerini tespit etti. Yaptığımız araştırmanın ardından, bunun fUSDT ve UST'nin MetaPool'ları dahil olmak üzere Nerve Bridge'i hedef alan bir saldırı olduğunu tespit ettik.

Şekil 1: bir saldırı işlemi örneği
Şekil 1: bir saldırı işlemi örneği

Bu yazının kaleme alındığı sırada saldırgan, Nerve'in staking havuzlarındaki fUSDT ve UST likiditesini tamamen tüketmiş ve 900 BNB kâr elde etmiştir.

Şaşırtıcı biçimde, açık içeren kodun 6 Kasım 2021'de Synapse Bridge'in 800 milyon dolar zarar etmesine neden olan Saddle.Finance'tan çatallandığını tespit ettik. Güvenlik açığının temel nedeni, farklı kütüphanelerde token takas miktarının hesaplanmasına yönelik tutarsız uygulamalardan kaynaklanmaktadır.

Ne var ki bu güvenlik olayını analiz eden kamuya açık herhangi bir rapor MEVCUT DEĞİLDİR. Bu nedenle bu blog yazısında, projenin mekanizmasını, güvenlik açığını ve saldırıyı kapsayan kapsamlı bir analiz sunmayı amaçlıyoruz.

0x2. Arka Plan

0x2.1 MetaPool Nedir?

Temel olarak Curve, iki tür sabit coin takas havuzu sunar: Standart StableSwap Havuzu ve MetaPool. İlki, farklı sabit coinler arasında çapraz piyasalar oluşturmak için tamamen AMM tabanlı bir yapıdır [1]. DAI, USDC ve USDT'den oluşan Curve.3pool gibi en yaygın kullanılan havuz türüdür. Ancak bu havuz, sabit coinler arasındaki riski izole edemez ve bu durum LP sağlayıcıları için büyük kayıplara yol açabilir.

Bu sorunu gidermek amacıyla MetaPool önerilmiştir. Curve'ün açıkladığı üzere [2], "tek bir coin'in, likiditeyi sulandırmadan başka bir (temel) havuzdaki tüm coinlerle havuzlanmasına olanak tanır". MetaPool, özünde bir sabit coin ile bir Standart StableSwap Havuzunun LP token'ı (birkaç farklı sabit coinden oluşan) arasındaki takas havuzudur. Bu bağlamda söz konusu iki sabit coin türünü sırasıyla havuz sabit coini ve altta yatan sabit coin olarak adlandırıyoruz.

Örneğin, bu olayın mağdurlarından biri, fUSDT ile Nerve.3pool LP token'ının (BUSD, USD ve USDC içeren) MetaPool'udur; bu havuzun yapısı özünde [fUSDT, LP token'ı (BUSD, USD, USDC)] şeklindedir. Dolayısıyla fUSDT havuz sabit coini, BUSD, USD ve USDC ise altta yatan sabit coinlerdir.

Şekil 2: Nerve.3pool
Şekil 2: Nerve.3pool

0x2.2 Açık İçeren Kodun Kaynağı

Curve'ün MetaPool'u Vyper ile geliştirilmiştir. Solidity geliştirmesini desteklemek amacıyla Saddle.Finance'ın geliştirici ekibi kodu Solidity ile yeniden yazmıştır. Bu güvenlik açığının başlangıç noktası olarak söz konusu kod, sırasıyla Synapse ve Nerve tarafından çatallanarak benimsenmiştir. 6 Kasım'da Synapse saldırıya uğradı.

Şekil 3: Synapse'i hedef alan saldırı işlemleri
Şekil 3: Synapse'i hedef alan saldırı işlemleri

Yaklaşık 8,2 milyon dolar MetaPool'dan boşaltıldı; ancak saldırganın yaptığı "saçma" bir hata nedeniyle aslında hiçbir fon kaybolmadı [3].

Bunun ardından Saddle.Finance, tüm MetaPool sözleşmelerini duraklatarak fonlarının güvenliğini sağlamak için acil bir önlem aldı. Ancak Nerve Bridge herhangi bir tedbir almadı ve bu durum kaçınılmaz olarak bu güvenlik olayına yol açtı.

İlgili sözleşme adresleri aşağıda listelenmiştir:

  • MetaSwap: 0xd0fBF0A224563D5fFc8A57e4fdA6Ae080EbCf3D3
  • SwapUtils: 0x02338Ee742ddCDe44488640F4edf1Aa947E670E7

0x3. Güvenlik Açığı Analizi

MetaPool'da iki önemli fonksiyon bulunmaktadır: swap ve swapUnderlying. Bunlardan ilki LP token'ı ile havuz sabit coinini takas etmek için, ikincisi ise havuz sabit coini ile altta yatan sabit coinleri takas etmek için kullanılır.

swap: _calculateSwap fonksiyonu
swap: _calculateSwap fonksiyonu
swapUnderlying: _calculateSwapUnderlying fonksiyonu
swapUnderlying: _calculateSwapUnderlying fonksiyonu

Ancak bu iki fonksiyon tutarsız biçimde uygulanmıştır. Yukarıdaki iki şekilde de görüldüğü üzere, kırmızı dikdörtgen içindeki kod parçacığı, LP token'ının değerini bir LP token'ının "sanal fiyatını" ölçerek ayarlamak için kullanılır (bu fiyat, daha fazla ücret geldikçe 1'lik temel değerden itibaren artar). Bu arada swap fonksiyonu sanal fiyatın etkisini göz ardı eder; bu da LP token'ının değerinin olduğundan düşük tahmin edilmesi anlamına gelir. Başka bir deyişle, daha fazla LP token'ı takas yoluyla elde edilebilir.

Sonuç olarak, önce ilgili LP token'ı ile altta yatan sabit coinlerin likiditesini geri çekip ardından swapUnderlying fonksiyonunu çağırarak havuz sabit coinlerini takas etmek suretiyle daha fazla havuz sabit coini elde etmek mümkündür.

0x4. Saldırı Analizi

Saldırıyı açıklamak için örnek işlemi örnek olarak ele alacağız.

Şekil 6: beş saldırı adımı
Şekil 6: beş saldırı adımı

Şekil 6, saldırganın saldırıyı gerçekleştirmek için aşağıdaki beş adımı izlediğini göstermektedir:

  • Adım 1: Fortube'dan Flashloan kullanarak 50.000 BUSD ödünç alma.
  • Adım 2: 50.000 BUSD'yi Ellipsis üzerinden 50.351 fUSDT ile takas etme.
  • Adım 3: MetaSwap'ın swap fonksiyonunu çağırarak 50.351 fUSDT'yi nispeten yüksek bir kayma ile 36.959 Nerve 3-LP ile takas etme.
  • Adım 4: BUSD likiditesini, yani 37.071 BUSD'yi çekmek amacıyla önceki adımda alınan LP token'larıyla Nerve.3pool'un removeLiquidityOneCoin fonksiyonunu çağırma.
  • Adım 5: MetaSwap'ın swapUnderlying fonksiyonunu çağırarak BUSD'yi fUSDT ile takas etme ve 51.494 fUSDT elde etme.

Saldırgan, MetaPool'un likiditesini tüketmek için yukarıdaki beş adımı tekrar tekrar uyguladı (200'den fazla işlem) ve sonunda 900 BNB elde etti.

İlginç olan şu ki saldırgan, amaca ulaşmanın optimize edilmiş bir yolu olmayan, Synapse olayında kullanılan yöntemin aynısını benimsedi. Alternatif olarak, örneğin optimize edilmiş parametreler uygulayarak likiditesini tek bir işlemde boşaltmak gibi saldırıları daha verimli biçimde gerçekleştirmek mümkündür. Bu durum, saldırganın bu güvenlik açığının temel nedenini tam olarak ANLAMADIĞINA işaret etmektedir.

Referanslar

[1] https://curve.fi/files/stableswap-paper.pdf

[2] https://resources.curve.fi/lp/depositing/depositing-into-a-metapool/

[3] https://synapseprotocol.medium.com/11-06-2021-post-mortem-of-synapse-metapool-exploit-3003b4df4ef4

Katkıda Bulunanlar: Hailin Wang, Lei Wu, Yajin Zhou @BlockSec

Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

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

BlockSec Audit