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).
@FEGtoken The paramter `path` in your FEGexPRO contract (0x818E2013dD7D9bf4547AaabF6B617c1262578bc7) should be checked in advance ! Our monitor system just reports an attack against the FEGexPRO contract, which lost its fBNB and FEG. pic.twitter.com/A4obANAMhW
— BlockSec (@BlockSecTeam) May 16, 2022
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 sahtepatholarak 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
balances2değerini artırır. - Adım 3: Rastgele onayın gerçekleştirilmesi. Saldırgan daha sonra
swapToSwapfonksiyonunu çağırır ve ilk parametre olarak sahte birpathgeçirir; bu durum FEGexPRO sözleşmesininpath'e 114 fBNB harcama yetkisi vermesine yol açar. - Adım 4:
depositInternalfonksiyonu veswapToSwapfonksiyonu çağrılarak başka bir onay yapılması. FEGexPRO sözleşmesi, başka birpath'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,
swapToSwapfonksiyonundaki doğrulanmamış parametreden kaynaklanan rastgele onay. - İkincisi,
swapToSwapfonksiyonundaki 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.
ROX(https://t.co/NWvSy5faY3) is not open-sourced, but something is wrong.
— BlockSec (@BlockSecTeam) May 17, 2022
Take a look at the following transaction:https://t.co/chPxcDoFOD@Mudit__Gupta
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



