The Mirror Protocol'ün istismar edildiği @FatMan tarafından raporlandı. Blog, bu konuda iyi bir rapor sunmaktadır. Bu kısa makalede, bunun nasıl gerçekleştiğini açıklamak için saldırı işlemini kullanacağız.

Sorumluluk Reddi: Bu makale, kamuya açık işleme ve Mirror protokolü ile Terra ekosistemi hakkındaki anlayışımıza dayanmaktadır. Yanlış bir şey varsa lütfen bize bildirin. Bu blog hakkındaki her türlü yorum memnuniyetle karşılanır.
1 Saldırı
1.1 Hazırlık
İşlem saldırıları hazırlamak için kullanılmaktadır.
ADIM 1: Bu işlemde, saldırgan önce kilit sözleşmesine 100.000 USTC gönderdi. Bu, bir pozisyon açmak için gerekli değildir, ancak saldırı için kritik öneme sahiptir.

ADIM 2: Bunun ardından saldırgan, teminat olarak 10 USTC yatırarak ve teminat_oranını 2,5 olarak belirleyerek bir pozisyon açtı.

short_params belirtilmiştir; böylece mint sözleşmesi, basılan mVarlıkları (yani mETH) satacak ve elde edilen USTC'yi pozisyonun kilitli miktarına ekleyecektir.
ADIM 2.1: İşlemi adım adım inceleyelim. İlk olarak, open_position fonksiyonu, ID'si 43186 olan bir kısa pozisyon açmak için çağrılacaktır.

ADIM 2.2: İsteğe bağlı short_params eklendiğinden, sözleşme önce 0,001208 mETH basacak (ETH'nin mevcut fiyatına göre) ve ardından bunu mETH-UST Çiftinde takas ederek satacaktır.

ADIM 2.3: 0,001208 mETH, 4,06582 USTC ile takas edilecek ve takas edilen USTC, ilgili ücretler (örneğin vergi) düşüldükten sonra kilit sözleşmesine gönderilecektir. Bunun nedeni, açılan pozisyonun yalnızca belirli bir süre sonra serbest bırakılabilmesidir.

ADIM 2.4: Ardından lock_position_funds_hook çağrılacaktır. Bu fonksiyonda, position_locked_amount, current_balance sorgulanarak ve mevcut bakiye ile kilitli fonlar karşılaştırılarak hesaplanacaktır.

Ancak, Adım 1'de gördüğümüz gibi, 100.000 USTC doğrudan kilit sözleşmesine aktarılmıştır; bu nedenle kilitli miktar 4 USTC yerine yaklaşık 100.004 USTC olacaktır.

ADIM 2.5: Son olarak, sLP tokenlarını kaydetmek için increase_short_token çağrılacaktır.

Bu noktaya kadar saldırgan, kilit sözleşmesine doğrudan 100.000 USTC ve teminat olarak 10 USTC göndererek bir pozisyon açtı. Pozisyonun kilitli miktarı yaklaşık 100.004 USTC olup belirli bir süre sonra serbest bırakılabilir. Saldırgan, 1.000 ile 100.000 USTC göndererek bu tür birçok pozisyon açtı.

1.2. Saldırı
Mirror Protocol, pozisyon ID'sinin tekrarını kontrol etmemektedir. Bu durumda saldırgan, bir pozisyondaki kilitli miktarı tekrar tekrar açmak için birçok yinelenen pozisyon ID'si besleyebilir.
İşlem saldırı işlemidir. Örneğin, 43186 pozisyon ID'si için saldırgan 437 kez yineleme yaptı.

Orijinal sözleşme kodu tekrarı kontrol etmediğinden, (bu tek fonksiyon çağrısında) yaklaşık 43,7M (437 * 0,1M) USTC serbest bırakıldı.

Diğer pozisyonların da aynı mekanizmayla serbest bırakıldığını unutmayın.
2. Hata Düzeltmesi
Güvenlik açığı bu commit ile düzeltildi.

Özellikle, unlockable_positions, serbest bırakılacak pozisyon ID'lerini içeren bir vektördür. Orijinal kodda, unlockable_positions içinde yinelenen ID'ler olup olmadığına dair herhangi bir kontrol bulunmamaktadır. Yamalı kod, pozisyon ID'lerinin tekrarını kontrol eden bir denetim eklemektedir.
3. Sonuç
@FatMan ve diğer topluluk üyeleri tarafından da belirtildiği gibi, bu hata birkaç aydır mevcut olup gerçek dünyada istismar edilmiştir. Gerçek dünyada zaten istismar edilmiş bir güvenlik açığını sessizce yamalamayı iyi bir güvenlik uygulaması olarak görmüyoruz. Ayrıca, yüksek profilli DeFi projelerinin uygulamalarının durumunu aktif olarak izlemek ve olağandışı bir şey olduğunda uyarı almak için bazı bekçiler konuşlandırmaları gerektiğini düşünüyoruz.



