25 Aralık 2023'te izleme sistemimiz, Telcoin'i hedef alan bir dizi kötü amaçlı faaliyet tespit etti. Telcoin ekibine, cüzdan sözleşmelerinin hatalı başlatılmasından kaynaklanan temel nedeni belirlemede yardımcı olduk; bu durum, cüzdanın gerçek uygulaması ile karşılık gelen proxy'si arasındaki tutarsızlıklardan kaynaklanıyordu. Bu rapor, olayı tam olarak kavramak için kapsamlı bir analiz sunmayı amaçlamaktadır.
0x0: Temel Tasarım
Güvenlik açığını incelemeden önce, ilgili akıllı sözleşmeler arasındaki ilişkileri anlamak önemlidir. Özünde, bunlar üç tasarım kalıbının bir kombinasyonu olarak soyutlanabilir: CloneFactory, Cloneable Proxy ve Beacon Proxy kalıpları; bunlar aşağıdaki diyagramda gösterilmektedir.

0x1: Güvenlik Açığı Analizi
Güvenlik açığı, cüzdan sözleşmelerinin hatalı başlatılmasından kaynaklanmakta olup bu durum, cüzdanın gerçek uygulaması ile karşılık gelen proxy'si arasındaki uyumsuzluktan ileri gelmektedir. Özellikle, başlatma sürecinde proxy, depolama konumunun en az anlamlı bitlerini yazarak depolama slot 0'ı sıfırdan farklı bir duruma getirdi. Ardından cüzdan kodu da depolama slot 0'a yazarak proxy'nin en az anlamlı bitlerdeki başlangıç değerinin üzerine yazdı. Bu sorun, akıllı sözleşmelerin herhangi birindeki doğal bir güvenlik açığının değil, ikisi arasındaki etkileşimin bir sonucudur.
Aşağıda, aşağıda sunulan işlem izine dayalı olarak ayrıntıları açıklayacağız:

Özellikle, CloneableProxy:Proxy.initialize() fonksiyonu içinde, Wallet.initialize() fonksiyonunu çağıran bir delegatecall bulunmaktadır. Bu çağrı, CloneableProxy:Implementation.initialize() fonksiyonuna yapılan bir delegatecall aracılığıyla gerçekleşir. Sonuç olarak, Wallet.initialize() fonksiyonu tarafından yapılan depolama değişiklikleri, CloneableProxy:Proxy sözleşmesinin depolamasına yansıtılacaktır.
Sonuçları tam olarak anlamak için CloneableProxy:Proxy sözleşmesinin depolama düzenini incelemek gerekmektedir. Bu sözleşmenin tanımı aşağıda özetlenmiştir:

Ne Proxy ne de ERC1967Upgrade sözleşmelerinin depolama değişkenleri olmadığından, slot 0 bunun yerine Initializable sözleşmesinden miras alınan iki depolama değişkeni tarafından kullanılmaktadır: _initialized ve _initializing.

Şimdi Wallet sözleşmesini inceleyelim. Wallet.initialize() fonksiyonu içinde, 3–4 ve 11–12. satırlardaki aşağıdaki kod parçacığında da vurgulandığı üzere, slot 0xaa'nın başlatma bayrağı olarak kullanıldığı açıkça görülmektedir:

- satırda belirtildiği üzere, slot 0'ın _state için ayrıldığını ve fonksiyon seçicisinin ardından calldata'daki sonraki 32 baytı depoladığını unutmayın. Daha ayrıntılı bilgi için Wallet sözleşmesinin başındaki açıklamalara bakın:

Slot 0'ın kullanımında belirgin bir uyumsuzluk mevcuttur: CloneableProxy:Proxy sözleşmesi bunu başlatma bayrağı olarak yorumlarken, Wallet:initialize() fonksiyonu bunu cüzdanın durumu olarak ele almaktadır.
Sonuç olarak, başlatma sürecinin ardından slot 0'ın en az anlamlı iki baytı sıfıra sıfırlanacaktır. Bu, hem _initialized hem de _initializing değerlerini sıfıra ayarlar. Bunun sonucunda, initializer değiştiricisinin koruması devre dışı bırakılabileceğinden, CloneableProxy:Proxy sözleşmesi initialize() fonksiyonu aracılığıyla yeniden başlatılmaya karşı savunmasız hale gelir.

Açıkçası, istismar potansiyeli cüzdanın durumuna bağlıdır. Sıfırdan farklı bir değere güncellendikten sonra, cüzdanın durumu bu sözleşmenin yeniden başlatılmasını engeller. Başlatmanın ardından, her işlemle cüzdan durumu güncellendiğinden, slot 0'ın en az anlamlı iki baytının sıfırdan farklı olma olasılığı artar ve bu da cüzdanı yeniden başlatılmaya karşı etkili biçimde bağışık kılar. Bu durum, neden savunmasız cüzdanların büyük çoğunluğunun çok az veya hiç işlem geçmişine sahip olmadığını ve bunların saldırıya açık kaldığını açıklamaktadır.
0x2: Saldırı Analizi
Saldırgan, Beacon sözleşmesinin adresini değiştirmek için savunmasız CloneableProxy:Proxy sözleşmesini yeniden başlatarak işe başladı. Ardından saldırgan, aşağıda ayrıntılı olarak açıklandığı üzere CloneableProxy:Proxy sözleşmesinde bulunan varlıkları transfer etmeye devam etti:

Dikkat çekici olan husus, birkaç savunmasız sözleşmenin tek bir işlemde ele geçirilmesi ve saldırganın bu stratejiyi tekrar tekrar uygulamasıdır.
0x3: Saldırıların Özeti
Altı farklı hesap tarafından gerçekleştirilen toplam 4.958 saldırı gözlemledik:

0x4: Düzeltme ve Öneriler
Araştırmamız, temel sorunun depolama slot 0'ın tutarsız kullanımından kaynaklandığını ve savunmasız sözleşmelerin yeniden başlatılabilmesine yol açtığını ortaya koymuştur. Çözümün, depolama tahsislerinin dikkatli bir şekilde yönetilmesini içerdiği açıktır.
Bu olaydan birkaç kritik ders çıkardık:
-
Satır içi assembly ile depolama slotlarını manipüle ederken son derece dikkatli olun; zira hatalar önemli güvenlik açıklarına yol açabilir.
-
Sözleşme durumlarının titizlikle izlenmesini sürdürün. Hızlı yanıt verme yeteneği, zamanında uyarı almaya bağlıdır.
-
Bir güvenlik ihlali tespit edildiğinde faaliyetlerin derhal askıya alınabilmesi için sözleşmelere duraklatma mekanizması ekleyin.
Ayrıca, bu olayın farklı cüzdan sözleşmelerini hedef alan çok sayıda saldırı işlemini kapsaması, Phalcon gibi tehdit izleme ve saldırı engelleme çözümlerine olan acil ihtiyacı gözler önüne sermektedir. Bu tür araçlar, gelecekteki riskleri azaltmak ve olası kayıplara karşı koruma sağlamak açısından vazgeçilmezdir.
0x5: Olayların Zaman Çizelgesi
25 Aralık, PST 09:23: Sistemimiz, Polygon ağında ilk kötü amaçlı işlemi tespit etti:

25 Aralık, PST 10:28: Telcoin destek ekibi, olayı dahili iletişim kanalında bildirdi.
25 Aralık, PST 10:32 — 10:37: Telcoin ekip üyeleri Telcoin Discord topluluğunu bilgilendirdi ve tüm ilgili kilit ekip üyeleriyle acil bir toplantı düzenledi.
25 Aralık, PST 10:45: Telcoin Altyapısına tüm erişimi kısıtlamak amacıyla bir Web Uygulama Güvenlik Duvarı kuralı uygulamaya konuldu.
25 Aralık, PST 11:02: Telcoin ekibi Seal 911 ile görüşmelere başladı.
25 Aralık, PST 11:11: Telcoin ekibi ve diğer güvenlik üyeleri tarafından sorunun temel nedenini keşfetmek ve saldırıyı engelleyecek olası çözümleri tartışmak üzere bir savaş odası kuruldu.
25 Aralık, PST 13:14: Telcoin ekibi X (Twitter) aracılığıyla kullanıcılara kamuoyu uyarısı yayımladı:
25 Aralık, PST 15:39: Telcoin, çalınan cüzdanları ve adresleri etiketleyip bu istihbaratı borsalarla paylaşarak çalınan fonların araştırılmasına yardımcı olmaları için Chainalysis ve Slowmist ile iletişime geçti.

25 Aralık, PST 22:35: Telcoin ekibinin daveti üzerine savaş odasına katıldık ve temel nedeni belirlemek için analizimizi paylaştık.
25 Aralık PST 23:00 — 26 Aralık PST 02:06: Temel nedeni belirledikten sonra Telcoin ekibi, güvenli ve kontrollü bir ortamda açığı yeniden oluşturarak başarılı bir şekilde bir azaltma stratejisi geliştirdi. Bu süreç, cüzdan proxy'lerini yeni ve güvenli biçimde uygulanmış bir beacon ile uyumlu hale getirmek amacıyla yeniden başlatmayı içerdi. Bu açık tek seferlik bir fırsat olduğundan, Telcoin cüzdan yapılandırmalarını önleyici biçimde güncelleyerek saldırganın bu güvenlik açıklarını daha fazla istismar etme kapasitesini devre dışı bırakabilir.
26 Aralık PST 02:07 — 26 Aralık PST 02:14: Telcoin ekibi, kapsamlı bir kapsam sağlamak amacıyla daha önce ele geçirilmemiş tüm cüzdanlara azaltma sürecini uyguladı. Hızlı ve verimli dağıtım için süreç, kesin olarak belirlenmiş bir zaman dilimi içinde gruplar halinde yürütüldü. Telcoin ardından, etkilenen tüm cüzdanların eksiksiz olarak yeniden işler hale getirilmesi ve tüm cüzdanlar için kalıcı bir düzeltme sağlanması amacıyla çözüm planının hazırlanması ve dahili olarak test edilmesi sürecine başladı.
26 Aralık, PST 16:52: Telcoin ve ekibimiz aşağıdaki konularda görüşmelere başladı:
-
Olay Genel Bakışı
-
Olayların Zaman Çizelgesi: Olayın nasıl geliştiğine dair kronolojik bir anlatım.
-
Kök Neden Analizi: Olayın temel nedenlerinin derinlemesine analizi.
-
İyileştirme Önerileri
-
Kod Denetimi
29 Aralık, PST 12:27: Birkaç tur görüşmenin ardından, son analiz raporunu taslak olarak hazırlamak ve düzeltmeleri denetlemek üzere Telcoin ekibiyle iş birliğine başladık.
3 Ocak 2024: Son analiz raporu taslağı sunuldu.
4 Ocak 2024: Tespit edilen sorunlar ve önerileri içeren denetim bulgularımız sunuldu.
4 Ocak — 10 Ocak 2024: Son analiz raporunu tamamlamak ve düzeltmeleri gözden geçirmek için Telcoin ekibiyle iş birliği yaptık.
Ayrıca belirtmek gerekir ki, 25 Aralık'tan bu yana Telcoin, olayla ilgili olarak blockchain araştırma firmaları ve kolluk kuvvetleriyle yakın iş birliği içinde aktif olarak çalışmaktadır.
BlockSec Hakkında
BlockSec, 2021 yılında dünya genelinde tanınan güvenlik uzmanlarından oluşan bir grup tarafından kurulmuş öncü bir blockchain 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ştirip engellemek için Phalcon platformu, fon takibi ve araştırma için MetaSleuth platformu ve kripto dünyasında verimli biçimde gezinen web3 geliştiricileri için MetaDock eklentisini 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 finansman turunda on milyonlarca ABD doları almıştır.
Web sitesi: https://blocksec.com/



