Sonne Finance Saldırısının Analizi

Orta SeviyeJun 11, 2024
Bu saldırının özü, saldırganın ilk teminat mintleme işlemini küçük bir miktar dayanak token ile gerçekleştirdiği ve soToken için çok küçük bir "totalSupply" değeri ile sonuçlandığı pazarın (soToken) oluşturulmasında yatmaktadır.
Sonne Finance Saldırısının Analizi

15 Mayıs 2024'te Sonne Finance, Optimism zincirine yönelik bir saldırıya uğradı ve $20 milyona varan kayıplara neden oldu. Saldırının ardından Twitter kullanıcısı @tonyke_bot Sonne Finance'in teminat havuzunda kalan 6,5 milyon doları (Compound'daki cToken'a benzer şekilde piyasa olarak da bilinir) yaklaşık 100 dolar ile koruduklarını tweetledi.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Saldırıyı keşfettikten sonra Sonne Finance ekibi, Optimism'deki tüm piyasaları hızla duraklattı ve Base'deki piyasaların güvenli olduğunu belirtti.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Attack kısa açıklaması

Sonne Finance, Compound V2 on Optimism'i çatallayan, bireylere, kurumlara ve protokollere finansal hizmetlere erişim sağlayan merkezi olmayan bir borç verme protokol. Sonne Finance protokol, kullanıcıların token varlıklarını bir borç verme likidite havuzu oluşturmak için bir araya getirerek kullanıcılara banka benzeri bir borç verme işi sağlar. Compound gibi, protokol katılımcılar tokenlerini Sonne Finance'in borç verme likidite havuzu ipotek edebilir ve soToken sertifikasını (cToken ile aynı) alabilirler. SoToken, blok ilerledikçe belirli bir miktarda gelir elde edecek ve aynı zamanda SONE token teşvikleri alacak olan faiz getiren bir varlık sertifikasıdır. Katılımcılar ayrıca ellerindeki soToken ile Sonne borç verme varlık havuzundan diğer tokenleri ödünç alabilirler. Örneğin, katılımcılar soUSDC sertifikaları almak için belirli bir miktarda USDC ipotek edebilir ve ardından daha fazla dolaşım için WETH ödünç verebilir. Sonne Finance protokol ipotek kredisi, çoktan çoğa varlık ilişkisi olabilir. Mortgage kredisi sürecinde protokol, katılımcının adresinin sağlık faktörünü (Sağlık Faktörü) otomatik olarak hesaplayacaktır. Sağlık faktörü 1'den düşük olduğunda, adres Ürünlerinin ipoteği destek tasfiye - should be "likidasyon" ve tasfiye memurları da belirli tasfiye - should be "likidasyon" ödülleri alabilir.

Kullanıcılar tarafından yatırılan temel token sayısı ile basılan soToken sayısı arasındaki ilişki, esas olarak exchangeRate adı verilen bir değişkenle ilgilidir. Bu değişken, kabaca her bir soToken'ın ne kadar temel token değerinde olduğunu belirtmek için kullanılabilir. exchangeRate için hesaplama formülü aşağıdaki gibidir:

Yukarıdaki formülde, totalCash, soToken tarafından tutulan dayanak token sayısını, totalBorrows belirli bir piyasada ödünç verilen dayanak token sayısını, totalReserves toplam rezerv tutarını (borçlu tarafından ödenen faiz dahil), totalSupply basılan soToken sayısını ifade eder.

Kullanıcılar, paraya çevirirken, yok edilmesi gereken soToken sayısını hesaplamak için kullanmak istedikleri temel token sayısını (redeemAmount) belirtebilir, redeemTokens. Hesaplama yöntemi kabaca "redeemTokens = redeemAmount / exchangeRat" şeklindedir. Burada doğruluk kaybı olmadığını unutmayın. ile anlaşmak.

Bu saldırının özü, piyasa (soToken) oluşturulduğunda, saldırganın ilk ipotek döküm işlemini gerçekleştirmesi ve az miktarda dayanak token ile çok az sayıda soToken basması ve bunun sonucunda soToken'ın "totalSupply" değerinin çok küçük olmasıdır. Saldırgan daha sonra Solidity sözleşme kesinlik kaybının güvenlik açığından yararlandı ve ardından temel tokeni yatırma için stake + döküm yöntemi yerine temel tokeni doğrudan soToken sözleşmesine gönderdi (soToken basılmayacak, bu da "totalSupply" değişmeden kalacak ve "totalCash" daha büyük hale gelecek) anlamına geliyor. Böyle bir işlem, sözleşmedeki "totalCash" değişkeninin daha büyük olmasını sağlar, ancak "totalSupply" değişmeden kalır ve exchangeRate'in daha büyük olmasına neden olur. Sonunda, saldırgan dayanak tokeni kullandığında, yok edilmesi gereken soToken, ipotek sırasında basılan soToken'dan daha azdır. Saldırgan, kazanılan soToken'ı temel token WETH ödünç vermek için kullanır ve diğer soToken'lara (soWETH, soUSDC gibi) USDC ve sonunda 20 milyon ABD Doları kadar yüksek Kar elde eder.

Saldırıya dahil olan anahtar adresleri

Saldırıya Hazırlık İşlemleri:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Karlı İşlemlere Saldırın:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Saldırı EOA ile ilgili adresler:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Saldırgan (sözleşme) ile ilgili adres:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

temel belirteç(VELO Token V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Güvenlik açığı sözleşmesi (soVELO, Compound'un cToken'ına benzer):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot X'te Kullanıcı Kurtarma İşlemi:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Attack process analysis

Recap

Sonne Finance proje ekibi kısa süre önce VELO piyasasını Sonne Finance'e (https://twitter.com/SonneFinance/status/1786871066075206044) eklemek için bir teklif sundu ve iki gün sonra gerçekleştirilecek çoklu imza cüzdanı aracılığıyla beş işlem düzenledi ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), bu beş işlem, VELO piyasasını (soVELO sözleşmesi) oluşturmak ve faiz oranı modelini belirlemek, fiyat kahinini belirlemek ve ipotek faktörlerini belirlemek gibi piyasanın bazı temel yapılandırmalarını belirlemek için kullanılır. VELO piyasası oluşturulduktan sonra, kullanıcılar soVELO token'leri mint etmek için tokenleri yatırma VELO edebilir ve bu da diğer soToken'ları ödünç almak için kullanılabilir.

saldırı hazırlığı

Saldırıya hazırlık aşaması, esas olarak saldırganın, teklifin iki günlük kilitlenme süresi sona erdikten sonra Sonne Finance proje teklifindeki bilgilere dayalı olarak bir VELO piyasası (soVELO sözleşmesi) oluşturması, anahtar yapılandırmaları kurması ve tokenleri ipotek ederek soVELO sözleşmesine mint VELO etmesidir. soVELO tokenleri ve ayrıca sahip olduğu VELO tokenleri doğrudan soVELO sözleşmesine göndererek döviz kurunu artırmak ve hazırlamak sonraki saldırılardan kar elde etmek için.

Belirli adımlar aşağıdaki gibidir:

  1. İki günlük kilitlenme süresi sona erdikten sonra, saldırgan ilk olarak teklifte düzenlenen ilk dört işlemin işlemlerini, VELO piyasasını (soVELO sözleşmesi) oluşturmak ve anahtar yapılandırmasını ayarlamak için kullanılan tek bir işlemde (işlem 0x45c0cc) paketler. VELO piyasa başlatıldığında, exchangeRate "200.000.000.000.000.000.000.000.000" olarak ayarlanır.

  2. Saldırgan, token'leri yatırma VELO ve soVELO token'leri mint için soVELO sözleşmesinin "mint" işlevini çağırır. Saldırgan "mintAmount" değerini "400.000.001" (VELO token sayısı) olarak belirtir. "exchangeRateStoredInternal" fonksiyonundan da görülebileceği gibi, soVELO tokeninin "_totalSuppl" değeri şu anda 0 olduğundan, exchangeRate 1. adımda ayarlanan değerdir. " mintTokens = actualMintAmount / exchangeRate " formülüne göre, şu anda basılması gereken hesaplanan soVELO token sayısı 2'dir. short bu adımda saldırgan soVELO sözleşmesine "400.000.001" değerinde VELO token yatırır ve saldırgan 2 değerinde soVELO token elde eder.

soVELO.mint:

  1. Saldırgan VELO "2,552,964,259,704,265,837,526" değerinde tokenleri doğrudan soVELO sözleşmesine göndererek soVELO sözleşmesine VELO token gönderdi. Şu anda, soVELO sözleşmesi tarafından tutulan VELO tokenlerinin sayısı arttı, ancak yeni soVELO tokenleri olmadığı için coin basıldı, bu nedenle totalSupply değişmeden kaldı, bu da exchangeRate hesaplama formülüne göre hesaplanan exchangeRate'in şu anda daha büyük olacağı anlamına geliyor.

  2. Saldırgan, birden çok kez tutulan soVELO tokenlerini aktardı ve sonunda bunları başka bir saldırı EOA 0xae4a aktardı.

Kâr için saldırı

Saldırı kârı aşaması, esas olarak saldırganın teklifin beşinci işlemini gerçekleştirmesini ve döviz kurunu daha da artırmak için flaş krediler yoluyla doğrudan soVELO sözleşmesine VELO token ödünç vermesini içerir. Daha sonra saldırgan, diğer soToken (soWETH, soUSDC vb.) sözleşmelerinden WETH ve USDC gibi temel tokenleri ödünç almak için elindeki 2 değerli soVELO tokenini kullanır ve bu kısımlar saldırganın karı olur. Ardından saldırgan, soVELO sözleşmesinde temel tokenini kullanmaya gitti. ExchangeRate'deki artış ve itfa için imha edilmesi gereken soVELO tokenlerinin hesaplanmasındaki doğruluk kaybı nedeniyle, saldırgan nihayetinde yalnızca 1 değerli soVELO tokenini kullandı. Daha önce yatırılan VELO tokenlerin neredeyse tamamı itfa edildi, bu da saldırganın diğer soToken'lardan borç alarak WETH ve USDC gibi temel tokenleri kazanmak için 1 değerli ekstra soVELO tokenlerini kullanması olarak anlaşılabilir. Saldırgan, saldırıyı birçok kez tekrarlamak için aynı tekniği kullandı ve sonuçta büyük karlar elde etti.

Belirli adımlar aşağıdaki gibidir:

  1. Saldırgan, teklifteki beşinci işlemi gerçekleştirir ve teklifte belirtilen borç verme faktörünü ayarlar.

  2. Saldırgan, VolatileV2 AMM - USDC/VELO havuzundan "35,469,150,965,253,049,864,450,449" değerinde VELO token'ı flaş olarak ödünç verir ve bu da saldırganın kanca işlevini tetikler. Kanca işlevinde, saldırgan saldırı işlemini gerçekleştirmeye devam eder.

  3. Saldırgan, exchangeRate'i daha da artırmak için elinde tuttuğu VELO tokenleri soVELO sözleşmesine gönderir. Şu anda, soVELO sözleşmesinde "35.471.703.929.512.754.530.287.976" değerinde toplam VELO token bulunmaktadır (saldırgan tarafından üç kez transfer edilen VELO tokenin toplamı).

  4. Saldırgan 0xa16388a6210545b27f669d5189648c1722300b8b yeni bir sözleşme oluşturur. Yapıcıda, elinde tuttuğu 2 soVELO tokenini yeni oluşturulan sözleşme 0xa163 (bundan böyle saldırgan 0xa163 olarak anılacaktır) aktarır.

  5. Saldırgan 0xa163 elinde tuttuğu soVELO tokenlerini soWETH'den "265.842.857.910.985.546.929" değerinde WETH ödünç almak için kullandı.

  6. Saldırgan 0xa163, soVELO'nun "redeemUnderlying" fonksiyonunu çağırır ve kullanılan VELO tokenlerinin değerini "35.471.603.929.512.754.530.287.976" (saldırganın daha önce soVELO sözleşmesine aktardığı veya ipotek ettiği VELO token sayısı) olarak belirtir. Şu anda, itfa için imha edilmesi gereken soVELO jetonlarının sayısını hesaplamak için "redeemTokens = redeemAmountIn / exchangeRate" formülü kullanılır.

"exchangeRateStoredInternal" fonksiyonundan da görüleceği üzere _totalSupply 0 yerine 2 olduğu için exchangeRate değerinin hesaplanması gerekiyor. "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply" formülüne göre, geçerli döviz kuru "17.735.851.964.756.377.265.143.988.000,000,0 00.000.000.000" şeklindedir, bu değer "200.000.000.000.000.000.000.000.000.000" başlangıç döviz kuru kümesinden çok daha büyüktür.

Yeni exchangeRate'e göre hesaplanan " redeemTokens " değeri " 1.99 " dur. Solidity'nin aşağı yuvarlama özellikleri nedeniyle, " redeemTokens " değeri 1 olur. Bu 0xa163 saldırganın daha önce yatırılan VELO tokenlerin neredeyse tamamını kullanmak için 1 değerli soVELO tokenlerini kullandığı anlamına gelir. Aynı zamanda, saldırgan 0xa163 soWETH'den ödünç alınan "265.842.857.910.985.546.929" değerinde WETH kazandı.

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredInternal:

  1. Saldırgan 0xa163 ödünç alınan tüm WETH aktardı ve VELO tokenleri üst düzey saldırgana kullandı ve ardından kendi kendini imha etti.

  2. Saldırgan, yeni oluşturulan sözleşmeden ödünç alınan varlıkların bir kısmını tasfiye etmek 0xa163 emir 1 değerindeki kilitli soVELO tokenini geri almak için soWETH'in "liquidateBorrow" işlevini çağırır. Şu anda saldırgan yalnızca 1 değerine sahip soVELO tokenlerini elinde tutuyor.

  3. Saldırgan, soVELO'nun "mint" işlevini çağırır ve bir kez daha 2 değerinde yeterli soVELO token toplamak amacıyla soVELO tokenlerini ipotek eder ve basar ve ardından diğer rahatsız edici tokenlerden kar elde etmek için yukarıdaki 3-8 arasındaki adımları tekrar gerçekleştirir.

  4. Saldırgan 9. adımdaki işlemi birkaç kez gerçekleştirir, flaş krediyi geri öder ve piyasadan kârla ayrılır.

100 dolar 6,5 milyon dolardan nasıl yararlanıyor?

Saldırıdan sonra, X'teki @tonyke_bot kullanıcısı, 0x0a284cd. işlemde soVELO sözleşmesine 1144 VELO token stake ederek 0,00000011 soVELO bastı.

Bu işlemin saldırganı daha fazla saldırıdan koruyabilmesinin nedeni, bu işlemin soVELO'daki totalSupply'ın boyutunu ve totalCash'in sahip olduğu VELO token sayısını değiştirmesi ve totalSupply büyümesinin exchangeRate hesaplaması üzerindeki etkisinin totalCash büyümesinin etkisinden daha büyük olmasıdır. Bu nedenle, exchangeRate küçülür long'cu saldırganın bir saldırı gerçekleştirirken soVELO kazanmak için doğruluk kaybını kullanamamasına neden olur long'cu saldırıyı mümkün kılmaz.

Para takibi

Saldırgan, yasa dışı gelirleri ele geçirdikten kısa bir süre sonra fonları transfer etti. Fonların çoğu aşağıdaki dört adrese aktarıldı. Bazıları saldırıya devam etmek için adres değiştirecek, bazıları ise kara para aklama içindi:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Saldırgan bu adrese 198 WETH aktardı ve ardından adres aynı saldırı yöntemini kullanarak aşağıdaki işlemlerde yasa dışı kazançlar elde etti:

Saldırının ardından adres, yukarıda belirtilen yasa dışı kazançları 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb'e aktardı.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Saldırgan, 724277 USDC ve 2353 VELO bu adrese aktardı ve USDC Eter ile değiştirdi. Sonra bazı fonlar hemen Yıldız Geçidi cross-chain köprü'na aktarıldı. Yasadışı fonların çoğu bu adreste kalır:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Saldırgan bu adrese 33 WETH aktardı ve kara para aklamak için peel zincirini kullandı. Kara para aklama bağlantısı aşağıdaki gibidir:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Saldırgan 563 WETH önce bu adrese ve ardından 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68'e aktardı, ancak şu ana kadar başka bir işlem yapılmadı.

Saldırganın bu sefer kara para aklama yöntemi nispeten profesyoneldir ve yöntemler bir çeşitlilik eğilimi göstermektedir. Bu nedenle, biz Web3 katılımcıları için, güvenlik açısından kara para aklamayı önleme yeteneklerimizi geliştirmeye devam etmeli ve KYT, AML ve diğer ilgili blok zinciri işlem güvenliği ürünleri aracılığıyla Defi projelerinin güvenliğini artırmalıyız.

Güvenlik tavsiyesi

1、Sözleşme denetimi ve testi ile güncel kalın. Akıllı sözleşme dağıtımından önce kapsamlı bir denetim gerçekleştirin ve finansal hesaplamaları içeren tüm bölümlere özellikle dikkat edin. İlk olarak, verimli sözleşme güvenlik taramaları yapmak için otomatik testleri kullanın ve güvenlik açığı kitaplıklarının gerçek zamanlı güncellemelerinden yararlanın (endüstri ayrıca ZAN AI SCAN dahil olmak üzere bazı olgun güvenlik denetim araçlarını kademeli olarak açık kaynaklı hale getirmiştir), aynı zamanda derinlemesine endüstri bilgisi gerektiren sorunları gidermek için manuel denetimi birleştirir.

2 、 Doğruluk kaybının ciddiye alınması gerekir. Doğruluk kaybının neden olduğu güvenlik sorunları, özellikle doğruluk kaybının genellikle ciddi mali kayıplara yol açtığı Defi projelerinde sonsuzdur. Proje taraflarının ve güvenlik denetçilerinin projede doğruluk kaybı olan kodları dikkatlice gözden geçirmeleri ve bu zafiyetten mümkün olduğunca kaçınmak için testler yapmaları önerilir.

  1. Compound'da cToken'a benzer bir piyasanın oluşturulması ve ilk ipotek döküm işleminin saldırganlar tarafından manipüle edilmemesi ve böylece borsa oranının manipüle edilmesi için ayrıcalıklı kullanıcılar tarafından gerçekleştirilmesi önerilmektedir.

  2. Sözleşmede " this.balance " veya " token.balanceOf() " değerine bağlı anahtar değişkenler olduğunda, yerel para biriminin veya tokenlerin sözleşmeye doğrudan aktarılmasına izin verilip verilmediği gibi anahtar değişkenin değişmesi için koşulları dikkatlice düşünmeniz gerekir. değişkenin değerini değiştirme yöntemi veya değişkenin değeri yalnızca belirli bir işlev çağrılarak değiştirilebilir mi?

Yasal Uyarı:

  1. Bu makale [ZAN] adresinden yeniden basılmıştır. Tüm telif hakları orijinal yazara aittir [ZAN]. Bu yeniden baskıya itirazlar varsa, lütfen Gate Learn ekibiyle iletişime geçin, derhal ilgileneceklerdir.
  2. Sorumluluk Reddi: Bu makalede ifade edilen görüş ve görüşler yalnızca yazara aittir ve herhangi bir yatırım tavsiyesi teşkil etmez.
  3. Makalenin diğer dillere çevirileri Gate Learn ekibi tarafından yapılır. Bahsedilmediği sürece, tercüme edilen makalelerin kopyalanması, dağıtılması veya intihal edilmesi yasaktır.

Sonne Finance Saldırısının Analizi

Orta SeviyeJun 11, 2024
Bu saldırının özü, saldırganın ilk teminat mintleme işlemini küçük bir miktar dayanak token ile gerçekleştirdiği ve soToken için çok küçük bir "totalSupply" değeri ile sonuçlandığı pazarın (soToken) oluşturulmasında yatmaktadır.
Sonne Finance Saldırısının Analizi

15 Mayıs 2024'te Sonne Finance, Optimism zincirine yönelik bir saldırıya uğradı ve $20 milyona varan kayıplara neden oldu. Saldırının ardından Twitter kullanıcısı @tonyke_bot Sonne Finance'in teminat havuzunda kalan 6,5 milyon doları (Compound'daki cToken'a benzer şekilde piyasa olarak da bilinir) yaklaşık 100 dolar ile koruduklarını tweetledi.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Saldırıyı keşfettikten sonra Sonne Finance ekibi, Optimism'deki tüm piyasaları hızla duraklattı ve Base'deki piyasaların güvenli olduğunu belirtti.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Attack kısa açıklaması

Sonne Finance, Compound V2 on Optimism'i çatallayan, bireylere, kurumlara ve protokollere finansal hizmetlere erişim sağlayan merkezi olmayan bir borç verme protokol. Sonne Finance protokol, kullanıcıların token varlıklarını bir borç verme likidite havuzu oluşturmak için bir araya getirerek kullanıcılara banka benzeri bir borç verme işi sağlar. Compound gibi, protokol katılımcılar tokenlerini Sonne Finance'in borç verme likidite havuzu ipotek edebilir ve soToken sertifikasını (cToken ile aynı) alabilirler. SoToken, blok ilerledikçe belirli bir miktarda gelir elde edecek ve aynı zamanda SONE token teşvikleri alacak olan faiz getiren bir varlık sertifikasıdır. Katılımcılar ayrıca ellerindeki soToken ile Sonne borç verme varlık havuzundan diğer tokenleri ödünç alabilirler. Örneğin, katılımcılar soUSDC sertifikaları almak için belirli bir miktarda USDC ipotek edebilir ve ardından daha fazla dolaşım için WETH ödünç verebilir. Sonne Finance protokol ipotek kredisi, çoktan çoğa varlık ilişkisi olabilir. Mortgage kredisi sürecinde protokol, katılımcının adresinin sağlık faktörünü (Sağlık Faktörü) otomatik olarak hesaplayacaktır. Sağlık faktörü 1'den düşük olduğunda, adres Ürünlerinin ipoteği destek tasfiye - should be "likidasyon" ve tasfiye memurları da belirli tasfiye - should be "likidasyon" ödülleri alabilir.

Kullanıcılar tarafından yatırılan temel token sayısı ile basılan soToken sayısı arasındaki ilişki, esas olarak exchangeRate adı verilen bir değişkenle ilgilidir. Bu değişken, kabaca her bir soToken'ın ne kadar temel token değerinde olduğunu belirtmek için kullanılabilir. exchangeRate için hesaplama formülü aşağıdaki gibidir:

Yukarıdaki formülde, totalCash, soToken tarafından tutulan dayanak token sayısını, totalBorrows belirli bir piyasada ödünç verilen dayanak token sayısını, totalReserves toplam rezerv tutarını (borçlu tarafından ödenen faiz dahil), totalSupply basılan soToken sayısını ifade eder.

Kullanıcılar, paraya çevirirken, yok edilmesi gereken soToken sayısını hesaplamak için kullanmak istedikleri temel token sayısını (redeemAmount) belirtebilir, redeemTokens. Hesaplama yöntemi kabaca "redeemTokens = redeemAmount / exchangeRat" şeklindedir. Burada doğruluk kaybı olmadığını unutmayın. ile anlaşmak.

Bu saldırının özü, piyasa (soToken) oluşturulduğunda, saldırganın ilk ipotek döküm işlemini gerçekleştirmesi ve az miktarda dayanak token ile çok az sayıda soToken basması ve bunun sonucunda soToken'ın "totalSupply" değerinin çok küçük olmasıdır. Saldırgan daha sonra Solidity sözleşme kesinlik kaybının güvenlik açığından yararlandı ve ardından temel tokeni yatırma için stake + döküm yöntemi yerine temel tokeni doğrudan soToken sözleşmesine gönderdi (soToken basılmayacak, bu da "totalSupply" değişmeden kalacak ve "totalCash" daha büyük hale gelecek) anlamına geliyor. Böyle bir işlem, sözleşmedeki "totalCash" değişkeninin daha büyük olmasını sağlar, ancak "totalSupply" değişmeden kalır ve exchangeRate'in daha büyük olmasına neden olur. Sonunda, saldırgan dayanak tokeni kullandığında, yok edilmesi gereken soToken, ipotek sırasında basılan soToken'dan daha azdır. Saldırgan, kazanılan soToken'ı temel token WETH ödünç vermek için kullanır ve diğer soToken'lara (soWETH, soUSDC gibi) USDC ve sonunda 20 milyon ABD Doları kadar yüksek Kar elde eder.

Saldırıya dahil olan anahtar adresleri

Saldırıya Hazırlık İşlemleri:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Karlı İşlemlere Saldırın:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Saldırı EOA ile ilgili adresler:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Saldırgan (sözleşme) ile ilgili adres:

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

temel belirteç(VELO Token V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Güvenlik açığı sözleşmesi (soVELO, Compound'un cToken'ına benzer):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot X'te Kullanıcı Kurtarma İşlemi:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Attack process analysis

Recap

Sonne Finance proje ekibi kısa süre önce VELO piyasasını Sonne Finance'e (https://twitter.com/SonneFinance/status/1786871066075206044) eklemek için bir teklif sundu ve iki gün sonra gerçekleştirilecek çoklu imza cüzdanı aracılığıyla beş işlem düzenledi ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), bu beş işlem, VELO piyasasını (soVELO sözleşmesi) oluşturmak ve faiz oranı modelini belirlemek, fiyat kahinini belirlemek ve ipotek faktörlerini belirlemek gibi piyasanın bazı temel yapılandırmalarını belirlemek için kullanılır. VELO piyasası oluşturulduktan sonra, kullanıcılar soVELO token'leri mint etmek için tokenleri yatırma VELO edebilir ve bu da diğer soToken'ları ödünç almak için kullanılabilir.

saldırı hazırlığı

Saldırıya hazırlık aşaması, esas olarak saldırganın, teklifin iki günlük kilitlenme süresi sona erdikten sonra Sonne Finance proje teklifindeki bilgilere dayalı olarak bir VELO piyasası (soVELO sözleşmesi) oluşturması, anahtar yapılandırmaları kurması ve tokenleri ipotek ederek soVELO sözleşmesine mint VELO etmesidir. soVELO tokenleri ve ayrıca sahip olduğu VELO tokenleri doğrudan soVELO sözleşmesine göndererek döviz kurunu artırmak ve hazırlamak sonraki saldırılardan kar elde etmek için.

Belirli adımlar aşağıdaki gibidir:

  1. İki günlük kilitlenme süresi sona erdikten sonra, saldırgan ilk olarak teklifte düzenlenen ilk dört işlemin işlemlerini, VELO piyasasını (soVELO sözleşmesi) oluşturmak ve anahtar yapılandırmasını ayarlamak için kullanılan tek bir işlemde (işlem 0x45c0cc) paketler. VELO piyasa başlatıldığında, exchangeRate "200.000.000.000.000.000.000.000.000" olarak ayarlanır.

  2. Saldırgan, token'leri yatırma VELO ve soVELO token'leri mint için soVELO sözleşmesinin "mint" işlevini çağırır. Saldırgan "mintAmount" değerini "400.000.001" (VELO token sayısı) olarak belirtir. "exchangeRateStoredInternal" fonksiyonundan da görülebileceği gibi, soVELO tokeninin "_totalSuppl" değeri şu anda 0 olduğundan, exchangeRate 1. adımda ayarlanan değerdir. " mintTokens = actualMintAmount / exchangeRate " formülüne göre, şu anda basılması gereken hesaplanan soVELO token sayısı 2'dir. short bu adımda saldırgan soVELO sözleşmesine "400.000.001" değerinde VELO token yatırır ve saldırgan 2 değerinde soVELO token elde eder.

soVELO.mint:

  1. Saldırgan VELO "2,552,964,259,704,265,837,526" değerinde tokenleri doğrudan soVELO sözleşmesine göndererek soVELO sözleşmesine VELO token gönderdi. Şu anda, soVELO sözleşmesi tarafından tutulan VELO tokenlerinin sayısı arttı, ancak yeni soVELO tokenleri olmadığı için coin basıldı, bu nedenle totalSupply değişmeden kaldı, bu da exchangeRate hesaplama formülüne göre hesaplanan exchangeRate'in şu anda daha büyük olacağı anlamına geliyor.

  2. Saldırgan, birden çok kez tutulan soVELO tokenlerini aktardı ve sonunda bunları başka bir saldırı EOA 0xae4a aktardı.

Kâr için saldırı

Saldırı kârı aşaması, esas olarak saldırganın teklifin beşinci işlemini gerçekleştirmesini ve döviz kurunu daha da artırmak için flaş krediler yoluyla doğrudan soVELO sözleşmesine VELO token ödünç vermesini içerir. Daha sonra saldırgan, diğer soToken (soWETH, soUSDC vb.) sözleşmelerinden WETH ve USDC gibi temel tokenleri ödünç almak için elindeki 2 değerli soVELO tokenini kullanır ve bu kısımlar saldırganın karı olur. Ardından saldırgan, soVELO sözleşmesinde temel tokenini kullanmaya gitti. ExchangeRate'deki artış ve itfa için imha edilmesi gereken soVELO tokenlerinin hesaplanmasındaki doğruluk kaybı nedeniyle, saldırgan nihayetinde yalnızca 1 değerli soVELO tokenini kullandı. Daha önce yatırılan VELO tokenlerin neredeyse tamamı itfa edildi, bu da saldırganın diğer soToken'lardan borç alarak WETH ve USDC gibi temel tokenleri kazanmak için 1 değerli ekstra soVELO tokenlerini kullanması olarak anlaşılabilir. Saldırgan, saldırıyı birçok kez tekrarlamak için aynı tekniği kullandı ve sonuçta büyük karlar elde etti.

Belirli adımlar aşağıdaki gibidir:

  1. Saldırgan, teklifteki beşinci işlemi gerçekleştirir ve teklifte belirtilen borç verme faktörünü ayarlar.

  2. Saldırgan, VolatileV2 AMM - USDC/VELO havuzundan "35,469,150,965,253,049,864,450,449" değerinde VELO token'ı flaş olarak ödünç verir ve bu da saldırganın kanca işlevini tetikler. Kanca işlevinde, saldırgan saldırı işlemini gerçekleştirmeye devam eder.

  3. Saldırgan, exchangeRate'i daha da artırmak için elinde tuttuğu VELO tokenleri soVELO sözleşmesine gönderir. Şu anda, soVELO sözleşmesinde "35.471.703.929.512.754.530.287.976" değerinde toplam VELO token bulunmaktadır (saldırgan tarafından üç kez transfer edilen VELO tokenin toplamı).

  4. Saldırgan 0xa16388a6210545b27f669d5189648c1722300b8b yeni bir sözleşme oluşturur. Yapıcıda, elinde tuttuğu 2 soVELO tokenini yeni oluşturulan sözleşme 0xa163 (bundan böyle saldırgan 0xa163 olarak anılacaktır) aktarır.

  5. Saldırgan 0xa163 elinde tuttuğu soVELO tokenlerini soWETH'den "265.842.857.910.985.546.929" değerinde WETH ödünç almak için kullandı.

  6. Saldırgan 0xa163, soVELO'nun "redeemUnderlying" fonksiyonunu çağırır ve kullanılan VELO tokenlerinin değerini "35.471.603.929.512.754.530.287.976" (saldırganın daha önce soVELO sözleşmesine aktardığı veya ipotek ettiği VELO token sayısı) olarak belirtir. Şu anda, itfa için imha edilmesi gereken soVELO jetonlarının sayısını hesaplamak için "redeemTokens = redeemAmountIn / exchangeRate" formülü kullanılır.

"exchangeRateStoredInternal" fonksiyonundan da görüleceği üzere _totalSupply 0 yerine 2 olduğu için exchangeRate değerinin hesaplanması gerekiyor. "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply" formülüne göre, geçerli döviz kuru "17.735.851.964.756.377.265.143.988.000,000,0 00.000.000.000" şeklindedir, bu değer "200.000.000.000.000.000.000.000.000.000" başlangıç döviz kuru kümesinden çok daha büyüktür.

Yeni exchangeRate'e göre hesaplanan " redeemTokens " değeri " 1.99 " dur. Solidity'nin aşağı yuvarlama özellikleri nedeniyle, " redeemTokens " değeri 1 olur. Bu 0xa163 saldırganın daha önce yatırılan VELO tokenlerin neredeyse tamamını kullanmak için 1 değerli soVELO tokenlerini kullandığı anlamına gelir. Aynı zamanda, saldırgan 0xa163 soWETH'den ödünç alınan "265.842.857.910.985.546.929" değerinde WETH kazandı.

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredInternal:

  1. Saldırgan 0xa163 ödünç alınan tüm WETH aktardı ve VELO tokenleri üst düzey saldırgana kullandı ve ardından kendi kendini imha etti.

  2. Saldırgan, yeni oluşturulan sözleşmeden ödünç alınan varlıkların bir kısmını tasfiye etmek 0xa163 emir 1 değerindeki kilitli soVELO tokenini geri almak için soWETH'in "liquidateBorrow" işlevini çağırır. Şu anda saldırgan yalnızca 1 değerine sahip soVELO tokenlerini elinde tutuyor.

  3. Saldırgan, soVELO'nun "mint" işlevini çağırır ve bir kez daha 2 değerinde yeterli soVELO token toplamak amacıyla soVELO tokenlerini ipotek eder ve basar ve ardından diğer rahatsız edici tokenlerden kar elde etmek için yukarıdaki 3-8 arasındaki adımları tekrar gerçekleştirir.

  4. Saldırgan 9. adımdaki işlemi birkaç kez gerçekleştirir, flaş krediyi geri öder ve piyasadan kârla ayrılır.

100 dolar 6,5 milyon dolardan nasıl yararlanıyor?

Saldırıdan sonra, X'teki @tonyke_bot kullanıcısı, 0x0a284cd. işlemde soVELO sözleşmesine 1144 VELO token stake ederek 0,00000011 soVELO bastı.

Bu işlemin saldırganı daha fazla saldırıdan koruyabilmesinin nedeni, bu işlemin soVELO'daki totalSupply'ın boyutunu ve totalCash'in sahip olduğu VELO token sayısını değiştirmesi ve totalSupply büyümesinin exchangeRate hesaplaması üzerindeki etkisinin totalCash büyümesinin etkisinden daha büyük olmasıdır. Bu nedenle, exchangeRate küçülür long'cu saldırganın bir saldırı gerçekleştirirken soVELO kazanmak için doğruluk kaybını kullanamamasına neden olur long'cu saldırıyı mümkün kılmaz.

Para takibi

Saldırgan, yasa dışı gelirleri ele geçirdikten kısa bir süre sonra fonları transfer etti. Fonların çoğu aşağıdaki dört adrese aktarıldı. Bazıları saldırıya devam etmek için adres değiştirecek, bazıları ise kara para aklama içindi:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Saldırgan bu adrese 198 WETH aktardı ve ardından adres aynı saldırı yöntemini kullanarak aşağıdaki işlemlerde yasa dışı kazançlar elde etti:

Saldırının ardından adres, yukarıda belirtilen yasa dışı kazançları 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb'e aktardı.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Saldırgan, 724277 USDC ve 2353 VELO bu adrese aktardı ve USDC Eter ile değiştirdi. Sonra bazı fonlar hemen Yıldız Geçidi cross-chain köprü'na aktarıldı. Yasadışı fonların çoğu bu adreste kalır:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Saldırgan bu adrese 33 WETH aktardı ve kara para aklamak için peel zincirini kullandı. Kara para aklama bağlantısı aşağıdaki gibidir:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Saldırgan 563 WETH önce bu adrese ve ardından 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68'e aktardı, ancak şu ana kadar başka bir işlem yapılmadı.

Saldırganın bu sefer kara para aklama yöntemi nispeten profesyoneldir ve yöntemler bir çeşitlilik eğilimi göstermektedir. Bu nedenle, biz Web3 katılımcıları için, güvenlik açısından kara para aklamayı önleme yeteneklerimizi geliştirmeye devam etmeli ve KYT, AML ve diğer ilgili blok zinciri işlem güvenliği ürünleri aracılığıyla Defi projelerinin güvenliğini artırmalıyız.

Güvenlik tavsiyesi

1、Sözleşme denetimi ve testi ile güncel kalın. Akıllı sözleşme dağıtımından önce kapsamlı bir denetim gerçekleştirin ve finansal hesaplamaları içeren tüm bölümlere özellikle dikkat edin. İlk olarak, verimli sözleşme güvenlik taramaları yapmak için otomatik testleri kullanın ve güvenlik açığı kitaplıklarının gerçek zamanlı güncellemelerinden yararlanın (endüstri ayrıca ZAN AI SCAN dahil olmak üzere bazı olgun güvenlik denetim araçlarını kademeli olarak açık kaynaklı hale getirmiştir), aynı zamanda derinlemesine endüstri bilgisi gerektiren sorunları gidermek için manuel denetimi birleştirir.

2 、 Doğruluk kaybının ciddiye alınması gerekir. Doğruluk kaybının neden olduğu güvenlik sorunları, özellikle doğruluk kaybının genellikle ciddi mali kayıplara yol açtığı Defi projelerinde sonsuzdur. Proje taraflarının ve güvenlik denetçilerinin projede doğruluk kaybı olan kodları dikkatlice gözden geçirmeleri ve bu zafiyetten mümkün olduğunca kaçınmak için testler yapmaları önerilir.

  1. Compound'da cToken'a benzer bir piyasanın oluşturulması ve ilk ipotek döküm işleminin saldırganlar tarafından manipüle edilmemesi ve böylece borsa oranının manipüle edilmesi için ayrıcalıklı kullanıcılar tarafından gerçekleştirilmesi önerilmektedir.

  2. Sözleşmede " this.balance " veya " token.balanceOf() " değerine bağlı anahtar değişkenler olduğunda, yerel para biriminin veya tokenlerin sözleşmeye doğrudan aktarılmasına izin verilip verilmediği gibi anahtar değişkenin değişmesi için koşulları dikkatlice düşünmeniz gerekir. değişkenin değerini değiştirme yöntemi veya değişkenin değeri yalnızca belirli bir işlev çağrılarak değiştirilebilir mi?

Yasal Uyarı:

  1. Bu makale [ZAN] adresinden yeniden basılmıştır. Tüm telif hakları orijinal yazara aittir [ZAN]. Bu yeniden baskıya itirazlar varsa, lütfen Gate Learn ekibiyle iletişime geçin, derhal ilgileneceklerdir.
  2. Sorumluluk Reddi: Bu makalede ifade edilen görüş ve görüşler yalnızca yazara aittir ve herhangi bir yatırım tavsiyesi teşkil etmez.
  3. Makalenin diğer dillere çevirileri Gate Learn ekibi tarafından yapılır. Bahsedilmediği sürece, tercüme edilen makalelerin kopyalanması, dağıtılması veya intihal edilmesi yasaktır.
Şimdi Başlayın
Kaydolun ve
100 USD
değerinde Kupon kazanın!