Back to Blog

FEGtoken Güvenlik Olayının Analizi: Şeytan Ayrıntılarda Gizlidir

Code Auditing
May 18, 2022
5 min read

15 Mayıs 2022'de yaklaşık saat 20:20'de (UTC), izleme sistemimiz FEGtoken projesinin FEGexPRO sözleşmesinin saldırıya uğradığını tespit etti. Saldırgan hem ETH hem de BSC ana ağında bir dizi saldırı gerçekleştirdi ve toplam etkilenen değer yaklaşık 1,3 milyon dolara ulaştı (proje tarafından zincir üzerinde gönderilen mesaja göre).

Bu olay hakkında daha fazla bilgiye projenin resmi Twitter hesabından ulaşılabilir. Bu raporda, olayın temel nedenini ortaya koymak için ayrıntılara derinlemesine inceleyeceğiz.

0x1 Güvenlik Açığı Analizi: İlk Bakış

Güvenlik açığı bulunan FEGexPRO sözleşmesi hem ETH hem de BSC üzerinde dağıtılmıştır ve sözleşmedeki güvenlik açıklı fonksiyon aşağıda gösterildiği gibi swapToSwap'tır:

Sosyal medyada da belirtildiği üzere, swapToSwap fonksiyonunun path adlı ilk parametresi fonksiyon çağırıcısı tarafından belirlenebilmektedir. Bu sayede saldırgan, rastgele onay elde etmek için bunu istismar edebildi (swapToSwap fonksiyonunun 682. satırına bakınız).

Şimdiye kadar yeni bir şey yok; zira bu, doğrulanmamış parametre(ler) içeren bir diğer vakadan ibarettir. Ancak saldırı izi, bu saldırının yalnızca rastgele onaya atfedilerek açıkça ortaya konulamayacağını göstermektedir. Aslında ince bir numara mevcuttur ve işte tam burada konular ilginçleşmektedir.

0x2 Saldırı Analizi

0x2.1 Ön Saldırı Analizi

Saldırı prosedürünü açıklamak için örnek olarak BSC üzerindeki bir saldırı işlemini ele alıyoruz; fBNB varlığını hedef alan karşılık gelen saldırı izi kısaca şu şekilde özetlenebilir:

  • Adım 1: Fon ve sahte path'lerin hazırlanması. Saldırgan, DVM'den flaş kredi olarak yaklaşık 915 BNB ödünç alır ve bunların bir kısmını 116 fBNB ile takas eder. Saldırgan daha sonra sahte path olarak kullanılacak bir grup sözleşme oluşturur.
  • Adım 2: İlk fonun yatırılması. Saldırgan, 115 fBNB'yi FEGexPRO sözleşmesine yatırarak kurban sözleşmedeki balances2 değerini artırır.
  • Adım 3: Rastgele onayın gerçekleştirilmesi. Saldırgan daha sonra swapToSwap fonksiyonunu çağırır ve ilk parametre olarak sahte bir path geçirir; bu durum FEGexPRO sözleşmesinin path'e 114 fBNB harcama yetkisi vermesine yol açar.
  • Adım 4: depositInternal fonksiyonu ve swapToSwap fonksiyonu çağrılarak başka bir onay yapılması. FEGexPRO sözleşmesi, başka bir path'e 114 fBNB harcama yetkisi verir.

Saldırgan, daha fazla onay elde etmek için Adım 4'ü tekrar tekrar gerçekleştirir. Son olarak saldırgan, onaylanan sahte path'leri kullanarak FEGexPRO'nun tüm fBNB'sini boşaltır ve flaş krediyi geri ödemek için bir kısmını BNB ile takas eder.

Açıkça görülebildiği üzere, sözleşmenin path parametresini kesinlikle kontrol etmesi gerekirdi.

ANCAK, bu saldırıyı tam olarak anlamak için ele alınması gereken bir sorun daha bulunmaktadır: FEGexPRO sözleşmesi sahte path'i onaylasa bile, approve işlemi kullanıcının balances2 değerinin hemen azaltılacağı gerçeğine dayanmaktadır (swapToSwap fonksiyonunun 684. satırı), yani onaylanan fon tam olarak Adım 3'te yatırılan miktardan gelmektedir. Diğer bir deyişle saldırgan, kendi yatırdığı fonu sahte path'e onaylamaktadır. Bunun ardından balances2'nin azalması nedeniyle saldırganın diğer sahte path'ler için onay yapamaması gerekmektedir.

Bu durumda şu soru ortaya çıkmaktadır: Saldırganın ek kâr elde etmek amacıyla diğer onayları yapabilmek için oynadığı kesin numara nedir?

0x2.2 Gelişmiş Saldırı Analizi

Bu soruyu yanıtlamak için swapToSwap fonksiyonuna geri dönmemiz gerekmektedir. Kodu dikkatlice incelediğimizde, burada oynanan numaranın yalnızca sahte bir path değil aynı zamanda sahte bir swap olduğunu ve bunun kurban sözleşmenin bakiyesinin gerçek değeri ile kaydedilen değeri arasında bir tutarsızlığa yol açtığını tespit ettik. Sonuç olarak bu tutarsızlık, saldırganın yatırım miktarını geri yükleyerek depositInternal fonksiyonunu çağırmak suretiyle tekrar tekrar onay yapılmasında kullanılabilmektedir.

Özellikle, depositInternal fonksiyonu bir kullanıcının balances2 değerini esas olarak sözleşmenin Main.balanceOf değeri ile _totalSupply2 arasındaki farka göre değiştirir (depositInternal fonksiyonunun 651. satırı).

swapToSwap'a geçirilen path adresi saldırgan tarafından kontrol edilen sahte bir path olduğundan, gerçekte hiçbir şey transfer edilmez. Sonuç olarak Main.balanceOf dönüş değeri Adım 3'tekiyle aynı kalmaktadır. _totalSupply2'nin swapToSwap fonksiyonunda azaltıldığını göz önünde bulundurduğumuzda, saldırgan yatırım yaptığı sürece artan balance2 değeri kaçınılmaz olarak gerçekte yatırılan miktardan daha yüksek olacaktır.

Dolayısıyla Adım 4'te saldırgan önce depositInternal fonksiyonunu çağırarak yatırım miktarını geri yükler, ardından swapToSwap fonksiyonunu çağırarak onay ve sahte swap işlemini gerçekleştirir. Saldırgan tarafından kullanılan yatırım miktarının yalnızca neredeyse 0 (yani 1 / 1e18) fBNB olduğunu; bu nedenle depositInternal fonksiyonunun, yukarıda açıklandığı şekilde (bir sonraki onayın izinden de görüldüğü üzere) saldırganın balances2 değerini Adım 3'tekiyle neredeyse aynı miktara geri yükleyeceğini belirtmek gerekir.

Saldırgan, Adım 4'ü tekrar tekrar uygulayarak elde ettiği kazancı artırabilir.

Son olarak belirtmek gerekir ki, yukarıda açıkladığımız saldırı, saldırgan tarafından istismar edilen saldırı yollarından yalnızca biridir. Aynı saldırı işleminde saldırgan aynı zamanda FEG varlığını da hedef almaktadır:

0x3 Temel Neden

Bu saldırının temel nedenini şu şekilde özetleyebiliriz:

  • Birincisi, swapToSwap fonksiyonundaki doğrulanmamış parametreden kaynaklanan rastgele onay.
  • İkincisi, swapToSwap fonksiyonundaki sahte swap nedeniyle kurban sözleşmenin bakiyesinin gerçek değeri ile kaydedilen değeri arasındaki tutarsızlık. Bu, saldırganın yatırım miktarı geri yüklenerek tekrar tekrar onay yapılmasında kullanılmaktadır.

Bunları bir araya getirerek saldırgan, kurban sözleşmedeki tüm fonları başarıyla boşalttı.

0x4 Diğer İlgili Saldırılar

Bu yazının kaleme alındığı sırada, başka bir saldırgan tarafından gerçekleştirilen daha fazla ilgili saldırı da gözlemledik.

Yine hem Ethereum hem de BSC üzerinde dağıtılmış sözleşmeler saldırıya uğradı. İlginç bir şekilde, saldırı izleri az önce ele aldığımızdan farklıdır. Kurban sözleşmeler açık kaynaklı olmasa da saldırganın benzer bir saldırı yöntemiyle aynı güvenlik açığını istismar ettiğinden kuvvetle şüphelenmekteyiz.

0x5 Çıkarımlar

Bir DeFi projesini güvenli kılmak kolay bir iş değildir. Kod denetiminin yanı sıra, topluluğun proje durumunu izlemek için proaktif bir yöntem benimsemesi ve saldırı gerçekleşmeden önce engellenmesi gerektiğini düşünüyoruz.

BlockSec Hakkında

BlockSec, 2021 yılında küresel alanda tanınmış bir grup güvenlik uzmanı 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ırmaya adanmıştır. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetim hizmetleri, tehditleri proaktif biçimde geliştirmek ve engellemek için Phalcon platformu, fon takibi ve araştırması için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli gezinmesi için MetaDock eklentisi 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ılardan iki tur finansmanda on milyonlarca ABD doları yatırım almıştır.

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

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

Best Security Auditor for Web3

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

BlockSec Audit