Back to Blog

Dizi Finans Güvenlik Olayının Analizi

Code Auditing
19 Temmuz 2021
5 min read

18 Temmuz'da DeFiRanger sistemimiz birkaç şüpheli işlem bildirdi. Manuel analiz sonucunda, bu işlemlerin Array Finance'e yönelik saldırılar olduğunu doğruladık. Aşağıda, saldırı sürecini ve güvenlik açığının temel nedenini açıklamak için bir saldırı işlemini kullanacağız.

Saldırı İşlemi

Bu blogda kullanılan saldırı işlemi: 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa

Saldırı Akışı

Şekil 1
Şekil 1

Şekil 1'de gösterildiği gibi, saldırganın AAVE'den flaş kredi aldıktan sonra 186,62 WETH kar elde ettiğini tespit ettik (bu blogda WETH ve ETH arasında açık bir ayrım yapmıyoruz).

Şekil 2
Şekil 2

Ayrıntılı saldırı süreci Şekil 2'de gösterilmektedir.

  • İlk olarak, saldırgan Array Finance'in buy fonksiyonunu çağırdı. Saldırgan, 45,91 WETH kullanarak Array Finance tarafından basılan 430 ARRAY token elde etti.
  • Ardından saldırgan, kapalı kaynak kodlu bir sözleşmenin (Array Collater - 0xa800cda5) joinPool fonksiyonunu beş kez çağırdı. 676.410,58 DAI + 679.080,46 USDC + 901,82 WETH + 20 WBTC + 20 renBTC yatırdı ve Array Collater tarafından basılan 726,38 aBPT token elde etti.
  • Saldırgan, 430 ARRAY token yakmak ve 77,17 aBPT token almak için sell fonksiyonunu çağırdı.
  • Son olarak, saldırgan Array Collater'ın exitPool fonksiyonunu çağırdı. Önceki iki adımda elde ettiği 804,55 aBPT token'ı yakarak 748.271,55 DAI + 751.225,08 USDC + 997,62 WETH + 22,63 WBTC + 22,74 renBTC elde etti.

Şekil 2'den, saldırganın 5. adımda (Şekil 2: sell fonksiyonunu çağır) kar elde ettiği görülmektedir. Bunun nedeni, elde edilen 77,17 aBPT token'ın, 3. adımda (Şekil 2: buy fonksiyonunu çağır) yatırılan 49,9142 WETH'den daha değerli olmasıdır. Aşağıda, bu saldırının neden gerçekleşebildiğini anlamak için kodu analiz edeceğiz.

Kod Güvenlik Açığı

Aşağıdaki kod, Array Finance'in sell fonksiyonunu göstermektedir. Bu fonksiyonda Array Finance, saldırganın sahip olduğu ARRAY token bakiyesini kullanır ve ARRAY token satılarak elde edilebilecek aBPT token sayısını hesaplamak için dahili _sell fonksiyonunu çağırır.

Aşağıda _sell fonksiyonunun uygulaması yer almaktadır. Belirli sayıda ARRAY token karşılığında kazanılabilecek aBPT token sayısını elde etmek için calculateLPtokensGivenArrayTokens fonksiyonunu çağırır. Ardından bu fonksiyon ARRAY token'ı yakar ve aBPT token'ı döndürür.

Aşağıda calculateLPtokensGivenArrayTokens fonksiyonunun uygulaması gösterilmektedir.

amountLPToken hesaplamasını etkileyebilecek dört argüman bulunduğuna dikkat edin. saleTargetAmount okunduktan sonra formülün aşağıdaki gibi olduğunu çıkardık:

arraySmartPool.totalSupply() * (1 - (1 - amount / ARRAY.totalSupply()) ^ (1000000 / reseveRatio))
 

arraySmartPool, Array Collater'ın akıllı sözleşme adresidir (0xa800cda5f3416a6fb64ef93d84d6298a685d190d). Saldırgan flaş krediden ödünç aldığı fonları Array Collater'a yatırdığında arraySmartPool.totalSupply() değeri artacaktır (aşağıdaki tabloda gösterildiği gibi).

TxnIndex: 64 arraySmartPool.totalSupply():  110162296218708026400
TxnIndex: 107 arraySmartPool.totalSupply():  165243444328062039600
TxnIndex: 150 arraySmartPool.totalSupply():  247865166492093059400
TxnIndex: 193 arraySmartPool.totalSupply():  371797749738139589100
TxnIndex: 236 arraySmartPool.totalSupply():  557696624607209383650
TxnIndex: 280 arraySmartPool.totalSupply():  836544936910814075475

Bu mantığı arraySmartPool kodunu okuduktan sonra doğrulayabiliriz. Aşağıda arraySmartPool'un joinPool fonksiyonu gösterilmektedir.

Bu fonksiyon önce msg.sender'dan alınması gereken token sayısını (actualAmountsIn) hesaplamak için SmartPoolManager.joinPool fonksiyonunu çağırır. Ardından her token için, token'ı arraySmartPool'a yatırmak amacıyla _pullUnderlying fonksiyonunu çağırır. Son olarak, aBPT token basmak ve basılan aBPT token'ı msg.sender'a aktarmak için _mintPoolShare ve _pushPoolShare fonksiyonlarını çağırır.

arraySmartPool'un PCToken'dan miras aldığına dikkat edin. _mintPoolShare fonksiyonu, aşağıda gösterilen _mint fonksiyonunu çağırır.

_mint fonksiyonu varTotalSupply değişkenini artıracaktır; bu değişken doğrudan totalSupply() tarafından döndürülür. Dolayısıyla bu değer, her joinPool çağrısında artmaktadır.

Kar Tahmini

Özet

Özetle, saldırgan Array Finance'in fiyat mekanizmasının manipüle edilebilir olan aBPT token'ının totalSupply'ına bağımlı olması güvenlik açığından yararlanmaktadır. Bu güvenlik açığı, DeFiRanger: DeFi Uygulamalarında Fiyat Manipülasyonu Saldırılarının Tespiti adlı araştırma makalemizde ele alınmıştır.

Katkıda Bulunanlar

Junjie Fei, Yufeng Hu, Ziling Lin, Siwei Wu, Lei Wu, Yajin Zhou @BlockSec

(Soyadına göre alfabetik sırayla)

BlockSec Hakkında

BlockSec, 2021 yılında dünyaca tanınan güvenlik uzmanlarından oluşan bir grup tarafından kurulmuş öncü bir blok zinciri güvenlik şirketidir. Şirket, kitlesel benimsenmesini kolaylaştırmak amacıyla gelişmekte olan Web3 dünyasının güvenliğini ve kullanılabilirliğini artırmayı taahhüt etmektedir. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetim hizmetleri, güvenli geliştirme ve tehditleri proaktif olarak engelleme için Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve kripto dünyasında verimli gezinmek isteyen web3 geliştiricileri için MetaDock uzantısı sunmaktadır.

Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital gibi önde gelen yatırımcıların katıldığı iki finansman turunda onlarca milyon ABD doları yatırım almıştır.

Resmi web sitesi: https://blocksec.com/

Resmi Twitter hesabı: https://twitter.com/BlockSecTeam

Sign up for the latest updates
Yaklaşık 5,57 milyon USD Kayıp: X100 Freezer ve NEM İstismarları | BlockSec Haftalık Bülteni
Security Insights

Yaklaşık 5,57 milyon USD Kayıp: X100 Freezer ve NEM İstismarları | BlockSec Haftalık Bülteni

Bu haftalık rapor, 19.10.2026–25.10.2026 tarihleri arasında Ethereum ve BNB Chain'de yaşanan iki güvenlik olayını ele alıyor. X100 Freezer'ın flaş krediyle finanse edilen yönetişim kontrolünün ele geçirilmesini ve BNB Chain'deki bir NEM tokeninin likidite havuzunu etkileyen vergi hesaplaşması kusurunu inceliyor. Raporun kapsamındaki tahmini kayıplar toplam yaklaşık 5,57 milyon USD: temsili X100 işleminden ~4,75 milyon USD, NEM havuzu olayından ise ~820 bin USD. Bu toplama, ayrıca bildirilen sonraki X100 fon çıkışları dahil değil.

Yaklaşık 3,87 milyon USD kayıp: Autheo Network ve UNCX saldırıları | BlockSec Haftalık Bülteni
Security Insights

Yaklaşık 3,87 milyon USD kayıp: Autheo Network ve UNCX saldırıları | BlockSec Haftalık Bülteni

Bu haftalık rapor, 12.10.2026–18.10.2026 tarihleri arasındaki 3 güvenlik olayını ve toplamda yaklaşık 3,87 milyon USD tutarındaki tahmini kaybı ele alıyor. Autheo Network, yaklaşık 1,76 milyon USD tutarında kayba yol açan bir özel anahtar ele geçirilmesi olayı yaşadı; Qubic Wallet, zayıf seed oluşturma nedeniyle yaklaşık 1,30 milyon USD kaybetti. UNCX Network’ün Smart Token Vesting V2 sözleşmelerinde ise Ethereum, BNB Chain, Base ve Robinhood Chain üzerinde yaklaşık 807 bin USD tutarında bir muhasebe hatası meydana geldi. Öne çıkarılan UNCX analizi, hatalı toplam pay hesaplamasının farklı token/pay oranlarıyla oluşturulan hak ediş dilimlerini nasıl birbirine karıştırdığını ve ortak havuzlardan hak edilenden fazla çekim yapılmasına nasıl olanak tanıdığını açıklıyor.

~542 bin dolar kayıp: MakerDaoBot Açığı | BlockSec Haftalık Bülteni
Security Insights

~542 bin dolar kayıp: MakerDaoBot Açığı | BlockSec Haftalık Bülteni

Ethereum'da 2026/10/05-2026/10/11 döneminde 1 güvenlik olayı yaşandı; kayıp yaklaşık 542 bin $. Kötü amaçlı adaptör, erişim kontrolü olmayan MakerDaoBot işleviyle botun MakerDAO bakiyelerinde yetki aldı; 4 eski ETH-A ihalesini kapatıp 200 ETH-A teminatını WETH'ye çevirdi. WETH, 200 ETH olarak saldırgana gönderildi.

Best Security Auditor for Web3

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

BlockSec Audit