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'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).

Ayrıntılı saldırı süreci Şekil 2'de gösterilmektedir.
- İlk olarak, saldırgan Array Finance'in
buyfonksiyonunu ç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)
joinPoolfonksiyonunu 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
sellfonksiyonunu çağırdı. - Son olarak, saldırgan Array Collater'ın
exitPoolfonksiyonunu ç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
| Saldırı Adresi | Saldırı İşlemi | Kar (ETH) |
|---|---|---|
| 0x1337 | 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa | 186.62073907323577 |
| 0x1b4fb735b51a25b280499710d02f50e4f772949664f9eb088e9d968b41ca2a1c | 59.338842936817095 | |
| 0x356ae8a278754551d9d2ae7dc0ea876b37c342ff2d010bee14aa253bb0b6030b | 18.827787420260467 | |
| 0x388fd59eab65b6034c96c01a21197eb2889d6507f84ff07e553749c541563962 | 5.880854505948256 | |
| 0xf4227ca3c8e8b5c8a0b10f034c6dee6556788c618e4cd289dc343b3247e85add | 0.4327422187881 | |
| Toplam | 271.1009661550497 | |
| 0x80d2 | 0xf061f8fc19c894ec37310ff59977ec97de55fd1494f1b1e66ae89188552d5c60 | 1.8414029470248867 |
| Toplam | 1.8414029470248867 | |
| Toplam | 272.9423691020746 |
Ö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



