Back to Blog

#9: MEV Bot 0xd61492: Zekice Bir Açıkta Avcıdan Avya Dönüşüm

Phalcon Security
February 21, 2024
6 min read

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:

Get Real-Time Protection with Phalcon Security

Audits alone are not enough. Phalcon Security detects attacks in real time and blocks threats mid-flight.

phalcon security