23 Kasım 2023'te KyberSwap'i hedef alan bir dizi saldırı gerçekleşti. Bu saldırılar, toplamda 48 milyon doların üzerinde bir kayba yol açtı. Temel sorun, KyberSwap'in yeniden yatırım sürecinde hatalı yuvarlama yönünden kaynaklandı. Bu durum, ardından yanlış tick hesaplamalarına ve nihayetinde likiditenin çift sayılmasına yol açtı.
"Yet Another Tragedy of Precision Loss: An In-Depth Analysis of the KyberSwap Incident" başlıklı kapsamlı raporumuzu yayımladık; bu rapor olayın ayrıntılarını derinlemesine ele almaktadır. Daha iyi bir anlayış için tam analizi incelemeniz önerilir. Aşağıda, 2023 yılının en önemli on güvenlik olayından biri olarak öne çıkan bu olaya kısa bir giriş sunuyoruz.
Arka Plan
KyberSwap, merkeziyetsiz bir otomatik piyasa yapıcı (CLAMM) platformudur. Yoğunlaştırılmış likidite piyasa talebini karşılamak amacıyla KyberSwap Elastic, Uniswap V3 temel alınarak geliştirilmiş olup likidite sağlama getirilerinin otomatik bileşimine olanak tanıyan yeniden yatırım eğrisi de dahil olmak üzere çeşitli iyileştirmeler içermektedir.
1. Tick ve Karekök Fiyat
Uniswap V3 benzeri CLAMM'larda Tick, fiyatı ayrık bir şekilde işaretlemek için kullanılır; böylece LP'ler likiditeyi tüm aralık yerine belirli bir aralıkta sağlayabilir (dolayısıyla "yoğunlaştırılmış" terimi kullanılır).
Likidite, herhangi iki tick arasındaki bir aralığa (bunların bitişik olması gerekmez), yani bir çift tick indeksine (alt tick ve üst tick) yerleştirilebilir. Özellikle, her tick'in fiyatı (tam sayı indeksi i'de) aşağıdaki gibi tanımlanır:
Pratikte karekök fiyat (sqrtP veya sqrtPrice olarak gösterilir) kullanılır:
Mevcut karekök fiyata göre mevcut tick'i hesaplamak da mümkündür:
Açıkça görüldüğü üzere, belirli bir tick için yalnızca tek bir karekök fiyat hesaplanırken, birden fazla karekök fiyat aynı tick'e işaret edebilir. Daha ayrıntılı bir açıklama için lütfen Uniswap V3 ve KyberSwap belgelerine başvurun.
2. Yeniden Yatırım Eğrisi
Uniswap V3 tabanlı CLAMM, LP ücretlerinin havuz kullanımı ve yeniden yatırım için gereken yüksek gas ücretleri sorunuyla karşılaşmaktadır. Bu nedenle KyberSwap, sorunu çözmek için yeniden yatırım eğrisini benimsemiştir.
Yeniden yatırım eğrisinin özü, her takastan toplanan ücretlerin sonsuz bir aralıkta yeniden yatırım likiditesi olarak havuza ek likidite şeklinde birikmesidir. Yeniden yatırım token'ları LP'lere basılır ve biriken yeniden yatırım likiditesi buna göre LP'lere dağıtılır. Bunun yanı sıra yeniden yatırım likiditesi de takas ve fiyat hesaplama sürecine katılır.
Yukarıda tanıtılan hesaplamalara ilişkin kod, ilgili havuzun aşağıdaki kod parçacığındaki computeSwapStep fonksiyonunda gösterilmektedir.

Bu fonksiyondaki liquidity değerinin, yeniden yatırım likiditesi nedeniyle iki bileşenin toplamı olduğuna dikkat edilmelidir: temel likidite için baseL ve yeniden yatırım için biriken likidite için reinvestL.
3. KyberSwap'te Takas
Daha önce ele alınan KyberSwap havuzunun swap fonksiyonunun uygulaması aşağıdaki diyagram olarak özetlenebilir:

Tick hesaplamasına ilişkin kritik mantık, mavi dikdörtgenle vurgulanan takas while döngüsünün içinde yer almaktadır. Özellikle, temel mantık computeSwapStep fonksiyonunu ve _updateLiquidityAndCrossTick fonksiyonunu kapsamaktadır. Birincisi, verilen takas için giriş ve çıkış miktarları ile nextSqrtP gibi anahtar durumları hesaplarken, ikincisi tick geçişi gerçekleştiğinde durumları yönetir.
Geleneksel olarak, fiyat arttığında buna tick'in sağa/yukarı kayması denir; aksi takdirde tick'in sola/aşağı hareket ettiği söylenir.
Daha sonra ele alınacak güvenlik açığını daha iyi anlamak için aşağıdaki şekilde gösterildiği gibi computeSwapStep fonksiyonunun ilgili kod mantığını incelememiz gerekmektedir:

Özellikle, calcReachAmount fonksiyonu hedef fiyat targetSqrtP için gereken giriş token miktarını hesaplar (50-57. satırlar). usedAmount, specifiedAmount'tan büyükse tick geçilmez ve nextSqrtP, deltaL'den (yani delta likidite, 59-62. satırlar) hesaplanır. deltaL, estimateIncrementalLiquidity fonksiyonu kullanılarak belirlenir ve nihai fiyat nextSqrtP, calcFinalPrice fonksiyonuyla hesaplanır (70-79. satırlar). Daha az giriş gerekiyorsa nextSqrtP, bir sonraki tick'in fiyatına ayarlanır; ancak bu durum saldırıda kullanılmaz.
Yukarıda özetlenen adımlar açıkça ortaya koymaktadır ki tick geçilmezse, computeSwapStep tarafından döndürülen nextSqrtP, bir sonraki tick'in sqrtP'sinden büyük olmamalıdır. Ancak fiyatın likiditeye (temel likidite ve delta likidite) ve hassasiyet kaybına olan bağımlılığı nedeniyle saldırganlar, tick geçilmemesine rağmen nextSqrtP'yi daha büyük olacak şekilde manipüle edebilmektedir.
Güvenlik Açığı Analizi
Temel neden, SwapMath sözleşmesinin (computeSwapStep fonksiyonu tarafından çağrılan) delta likidite hesaplamasındaki (yani estimateIncrementalLiquidity fonksiyonu) yanlış yuvarlama yönünün neden olduğu hatalı tick hesaplamasında yatmaktadır. Bu durum da ardından tick hesaplamasını hatalı biçimde etkilemektedir.

İlginç bir şekilde, 188. satırdaki yorumu (mavi dikdörtgenle vurgulanan) incelediğimizde, deltaL'nin nextSqrtP'yi aşağı yuvarlayabilmek için yukarı yuvarlanmasının amaçlandığını görüyoruz. Ancak deltaL, 189. satırda mulDivFloor fonksiyonunun kullanılması nedeniyle yanlışlıkla aşağı yuvarlanmaktadır. Sonuç olarak nextSqrtP hatalı biçimde yukarı yuvarlanmaktadır.
Saldırı Analizi
Saldırganlar, her işlemin birden fazla havuzu boşalttığı çoklu saldırı işlemleri başlattı. Basitlik adına aşağıdaki tartışma, saldırı işlemindeki ilk saldırıya dayanmaktadır.
Temel saldırı mantığı aşağıdaki altı adımdan oluşmaktadır:
-
AAVE'den flash loan aracılığıyla 2.000 WETH borç almak.
-
Kurban havuz 0xfd7b'de 6,850 WETH'i 6,371 frxETH ile takas etmek. Bu adım, mevcut tick ve
currentSqrtP'yi şu anda likiditenin bulunmadığı bir konuma itmek için kullanılır.
currentSqrtP, görünüşe göre saldırgan tarafından rastgele seçilmiştir ve takas tam olarak bu fiyatta durur.- Bu adımdan sonra temel likidite (
baseL) sıfırdır, ancak yeniden yatırım likiditesi (reinvestL) sıfır değildir.
- Havuza likidite eklemek ve ardından likiditenin bir kısmını çıkarmak. Bu adım, aralığı ve toplam likiditeyi istenen miktara ayarlamak için kullanılır.
- Tick aralığı,
currentSqrtP'ye göre seçilir. - Saldırı için istenen likidite tick aralığından türetilebilir; ancak ilgili hesaplama mantığının daha fazla araştırılması gerekmektedir.
- Havuzda 387,170 WETH'i 0,06 frxETH ile takas etmek. Bu adım,
nextTick==currentTickolacak şekilde mevcut tick'i manipüle etmek için kullanılır. Özellikle, 4. adımdaki takas havuzu akıllıca kandırarak tick 111.310'un geçilmediğine inandırır. Ancak gerçektecurrentSqrtP, tick 111.310'unsqrtP'sinden gerçekten büyüktür.
- Havuzda 0,06 frxETH'i 396,244 WETH ile takas etmek. Takas yönünün bir önceki adıma kıyasla ters olduğuna dikkat edin. Bu adımda, takası kârlı kılmak ve havuzu boşaltmak amacıyla likidite çift sayılır.
- Flash loan'ı geri ödemek ve 6,364 WETH ile 1,117 frxETH elde etmek.
Derinlemesine bir inceleme için hesaplamalar ve şekiller içeren daha fazla ayrıntıya sahip kapsamlı analizimize başvurun.
Özet
Bu olayın temel sorunu, KyberSwap'in yeniden yatırım sürecindeki yanlış yuvarlamadan kaynaklanmakta olup hatalı tick hesaplamalarına ve nihayetinde likiditenin çift sayılmasına yol açmaktadır. Bu olay, DeFi protokollerindeki hassasiyet kaybı sorunlarının karmaşık ve zor fark edilir niteliğini ortaya koymakta; tüm topluluk için ciddi bir zorluk oluşturmaktadır.
Bu 2023 saldırısı, son derece nüanslı hesaplamalarıyla karmaşıklığı nedeniyle öne çıkmakta ve topluluğu ciddi ölçüde sınayan pek çok hassasiyetle ilgili güvenlik olayına güzel bir örnek teşkil etmektedir. Ayrıca yetkililerle uzun müzakerelerden sonra saldırgan, protokol üzerinde tam kontrol talep ettiğini öne sürerek kamuoyuna kışkırtıcı bir üslupla mesaj yayımladı.
Bu serideki diğer makaleleri okuyun:
- Giriş: 2023'ün En Önemli On "Müthiş" Güvenlik Olayı
- #1: Flashbots Relay'deki Güvenlik Açıklarından Yararlanarak MEV Bot'larını Ele Geçirmek
- #2: Euler Finance Olayı: 2023'ün En Büyük Hack'i
- #4: Curve Olayı: Derleyici Hatası Masum Kaynak Koddan Hatalı Bytecode Üretiyor
- #5: Platypus Finance: Bir Şans Eseri Üç Saldırıdan Sağ Çıkmak
- #6: Hundred Finance Olayı: Savunmasız Çatallanmış Protokollerde Hassasiyetle İlgili Exploit Dalgasını Tetiklemek
- #7: ParaSpace Olayı: Sektörün En Kritik Saldırısını Engellemek İçin Zamana Karşı Yarış
- #8: SushiSwap Olayı: Beceriksizce Bir Kurtarma Girişimi Bir Dizi Taklitçi Saldırıya Yol Açıyor
- #9: MEV Bot 0xd61492: Yaratıcı Bir Exploit'te Avcıdan Avya Dönmek
- #10: ThirdWeb Olayı: Güvenilir Modüller Arasındaki Uyumsuzluk Güvenlik Açığını Ortaya Çıkarıyor





