3 Ağustos 2023'te Arbitrum üzerindeki bir MEV Bot saldırıya uğradı ve 800.000 $ kayba yol açtı. Bu saldırının temel nedeni Yetersiz Kullanıcı Girişi Doğrulaması idi.
MEV Bot'lar ile doğrulanmamış sözleşmeleri arasındaki karmaşık etkileşimler göz önüne alındığında, açık kaynak olmamanın güvenliği garanti etmediği, özellikle DeFi protokolleri için bu durumun geçerli olduğu ortaya çıkmaktadır.
Arka Plan
MEV Bot
MEV Bot (Maksimum Çıkarılabilir Değer Botu), blok zinciri üzerindeki kârlı fırsatları tespit etmek ve gerçekleştirmek için tasarlanmıştır. Arbitraj yoluyla kâr elde etmek amacıyla bekleyen işlemleri (yani mempool'dakileri) veya zincir üstü durumları analiz ederek çalışır.
Tipik ön-koşma ve sandviç saldırısı MEV Bot'larının aksine, bu saldırıda hedef alınan MEV Bot, üçgen arbitraj ve borç tasfiyesi gibi stratejileri yürütmeye odaklanıyordu. Bu bot'lar, AMM'ler için fiyatları stabilize etmeye yardımcı olur ve tasfiyeyi gerçekleştirmek için borç verme protokollerine destek sağlayarak sorunsuz bir işleyiş sunar; DeFi ekosisteminin sağlıklı işleyişinin önemli bir parçasını oluşturur.
Flashloan
Flashloan, DeFi ekosistemi içindeki benzersiz bir yeniliği temsil eder – teminatsız bir borç verme biçimidir. Flashloan aracılığıyla herhangi bir teminat olmaksızın bir milyar dolara kadar borç alabilirsiniz; ancak bu borcun aynı işlem içinde geri ödenmesi gerekir. Borç o işlem içinde geri ödenmezse, işlem hiç gerçekleşmemiş gibi geri alınır.
Bu mekanizma, geçici piyasa verimsizliklerinden yararlanmak için genellikle arbitrajda veya diğer DeFi stratejilerini kaldıraçlamak amacıyla kullanılır.
Güvenlik Açığı
Kısa Versiyon
Kullanıcı tarafından girilen parametrelerin yetersiz doğrulanması, saldırganın sahte bir FlashloanProvider (FakeFlashloanProvider) tanıtmasına olanak sağladı. Vault sözleşmesi, flashloan başlatmak için bu sağlayıcıyı kullandı. Ardından, muhtemelen flashloan'ı kapatmak amacıyla vault sözleşmesi, FakeFlashloanProvider'a token onayı verdi; bu da vault'tan varlıkların yetkisiz olarak transfer edilmesine yol açtı.
Ayrıntılı Versiyon
İstismar edilen sözleşme şunlardır:
Vault: Kurban sözleşmesi 0xd614927acfb9744441180c2525faf4cedb70207f, rezerv sağlayan ve AAVE ile Balancer gibi diğer protokollerden flashloan kolaylaştıran bir "Vault" işlevi görür.Arbitrage Bot: Savunmasız sözleşme 0x8db0efee6a7622cd9f46a2cf1aedc8505341a1a7, "Arbitrage Bot" olarak işlev görerek "Vault" sözleşmesinde borçlu rolünü üstlenir.
"Arbitrage Bot" içindeki 0x0582f20f() fonksiyonu, arbitrajları başlatmak için ana giriş noktasıdır.
Önce orijinal anapara edinmek amacıyla "Vault" içindeki borrow() fonksiyonunu çağırır, ardından calldata'da belirtilen ve herhangi bir doğrulama yapılmayan harici bir sözleşmeye delegatecall aracılığıyla arbitraj mantığını yürütür.
function 0x0582f20f(...) {
...
v67, /* uint256 */ v68 = address(0xd614927acfb9744441180c2525faf4cedb70207f).borrow(address(v39), address(v9[0]), v29).gas(msg.gas);
...
// 0x4da91757 = swap(address,address,address,uint256,uint256,uint256,address)
MEM[MEM[64] + 32] = uint224(address(MEM[0 + v4[v69]])) | 0x4da9175700000000000000000000000000000000000000000000000000000000;
v82 = address(v76 >> 96).delegatecall(MEM[(MEM[64]) len 228], MEM[(MEM[64]) len 0]).gas(msg.gas);
...
v189 = v170.refund(0x410085df, address(v9[0]), address(v39), v68, address(v9[0]), v29, v186, 4 + MEM[64] + (varg2.length << 5) - (4 + MEM[64]) + 192).gas(msg.gas);
...
}
Ardından, saldırganın FakeFlashloanProvider sözleşmesine flashloan başlatmak amacıyla "Vault" içindeki 0x512b7351() fonksiyonunu çağırır.
0x512b7351() fonksiyonu, msg.sender'ın izin listesinde olmasını şart koşar; ancak bu denetim, önceki delegatecall tarafından başarıyla atlatıldı. Bu çok kritik bir adımdır.
function 0x512b7351(...) public nonPayable {
...
if (_borrow[msg.sender] >= 1) {
v0 = !_refund;
}
require(v0, Error('BBVault: FORBIDDEN'));
...
v38 = v23.length;
v39 = v23.data;
_refund = keccak256(v23);
...
<FakeFalshloanProvider>.flashloan(...);
...
}
Flashloan geri çağrısı sırasında, "Vault" içindeki executeOperation() fonksiyonu önce ödünç alınan varlıkları MEVBot 0x8db0ef olarak adlandırılan "Arbitrage Bot"a aktarır, ardından onun 0x7fe3ba8b() fonksiyonunu çağırır.
function executeOperation(...) {
...
require(_refund == keccak256(v3.data), Error('BBVault: STATUS'));
Token.transfer(ArbitrageBot, amountBorrowed);
<ArbitrageBot>.call(0x7fe3ba8b...);
}
Bu harici çağrıya güvenen "Arbitrage Bot", aldığı varlıkları FakeFlashloanProvider'a geri transfer eder.
Ancak "Vault", bunu fark edemez ve executeOperation() fonksiyonunun sonunda flashloan'ı geri ödemek amacıyla FakeFlashloanProvider'a token onayı vermeye devam eder.
Saldırı Süreci
Saldırı Tx: 0x864c8cfb8c54d3439613e6bd0d81a5ea2c5d0ad25c9af11afd190e5ea4dcfc1f
Saldırgan, "Arbitrage Bot"un 0x0582f20f() fonksiyonunu çağırır; bu fonksiyon da saldırganın sözleşmesine bir delege çağrısı gerçekleştirir.


hack_contract_2 ardından victim'in 0x512b7351() fonksiyonunu çağırır. 0x512b7351() fonksiyonu, msg.sender'ın izin listesinde olmasını şart koşar; ancak bu denetim, önceki delegatecall tarafından başarıyla atlatıldı.

victim, ardından saldırganın FakeFlashloanProvider sözleşmesini çağırarak flashloan ile alınan tüm varlıkları victim'e transfer eder ve victim'in executeOperation() fonksiyonunu çağırır.

Arbitrage Bot'un 0x7fe3ba8b() fonksiyonu, saldırganın sözleşmesine yeniden bir delegatecall gerçekleştirir ve bu sefer tüm varlıkları saldırgana geri transfer eder.
**Bu noktada, saldırganın Flashloan Sağlayıcısı tarafından ödünç verilen varlıklar geri ödenmiştir.
**

Kurban ("Vault"), muhtemelen flashloan'ı geri ödemek amacıyla FakeFlashloanProvider'a token onayı verir.

Saldırgan, bu onaydan yararlanarak kurbanın fonlarını transferFrom ile boşaltır ve kâr elde eder.
Güvenlik Önerileri
Açık kaynak olmayan kod güvenliği garanti etmez
Açık kaynak olmayan ve gizlenmiş kodun güvenliği sağladığına inanmak bir yanılgıdır. Bu MEV Bot olayı, gizliliğin istismarları engellemediğini ve geliştiricilere sahte bir güvenlik hissi verebileceğini ortaya koymaktadır.
Titiz Girdi Doğrulaması
Özellikle flashloan ve swap geri çağrıları gibi standart arayüzlerle çalışırken, tüm sözleşme etkileşimlerini ve calldata'yı titizlikle doğrulamak büyük önem taşır. Veri bütünlüğünün ve güvenliğinin sağlanması, sözleşme tasarımı ve uygulamasında öncelik olmalıdır.
Bu serideki diğer makaleleri okuyun:
- Giriş: 2023'ün En "Çarpıcı" On Güvenlik Olayı
- #1: Flashbots Relay'deki Güvenlik Açıklarından Yararlanarak MEV Bot'larını Ele Geçirme
- #2: Euler Finance Olayı: 2023'ün En Büyük Hack'i
- #3: KyberSwap Olayı: Son Derece İnce Hesaplamalarla Yuvarlama Hatalarının Ustaca İstismarı
- #4: Curve Olayı: Derleyici Hatası, Masum Kaynak Koddan Hatalı Bytecode Üretiyor
- #5: Platypus Finance: Şans Eseri Üç Saldırıdan Sağ Kurtulmak
- #6: Hundred Finance Olayı: Savunmasız Çatallanmış Protokollerde Hassasiyetle İlgili İstismar Dalgasını Tetiklemek
- #7: ParaSpace Olayı: Sektörün En Kritik Saldırısını Engellemek İçin Zamana Karşı Yarış
- #8: SushiSwap Olayı: Beceriksiz Bir Kurtarma Girişimi Bir Dizi Kopya Saldırıya Yol Açıyor
- #10: ThirdWeb Olayı: Güvenilen Modüller Arasındaki Uyumsuzluk Güvenlik Açığını Gün Yüzüne Çıkarıyor



