Rust akıllı sözleşmeler DoS saldırı açığı analizi ve çözüm önerileri

Rust akıllı sözleşmelerindeki hizmet reddi saldırısı

hizmet reddi saldırısı(DoS)saldırıları, akıllı sözleşmelerin bir süre boyunca hatta kalıcı olarak düzgün bir şekilde kullanılamamasına neden olabilir. Ana nedenler arasında şunlar bulunmaktadır:

  1. Sözleşme mantığında hatalar vardır, bazı fonksiyonların hesaplama karmaşıklığının çok yüksek olması nedeniyle Gas tüketimi sınırları aşmaktadır.

  2. Akıllı sözleşmeler arası çağrılarda, sözleşme yürütmesi dış sözleşme durumuna bağlıdır ve dış sözleşme tarafından engellenebilir.

  3. İnsan faktörleri, örneğin sözleşme sahibinin özel anahtarını kaybetmesi, ayrıcalıklı işlevlerin çağrılamamasına neden olur.

Aşağıda, akıllı sözleşmelerdeki DoS saldırı açıklarını somut örneklerle analiz edeceğiz.

1. Dışarıdan değiştirilebilen büyük veri yapılarının döngüsel olarak gezilmesi

Aşağıda kayıtlı kullanıcılara kar payı dağıtmak için basit bir akıllı sözleşme bulunmaktadır:

pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub hesaplar: UnorderedMap<accountid, bakiye="">, }

impl Sözleşme { pub fn register_account(&mut self) { eğer self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Hesap zaten kayıtlı".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); } log!("hesap kaydı {}", env::önceki_hesap_id()); }

pub fn distribute_token(&mut self, amount: u128) {
    assert_eq!(env::predecessor_account_id(), DISTRIBUTOR, "İzinsiz işlem");
    for account in self.registered.iter() {
        let balance = self.accounts.get(&account).expect("alınamadı");
        self.accounts.insert(&account, &balance.checked_add(amount).expect("toplama taşması")); 
        log!("Hesaba {} dağıtma girişimi", &account);
        ext_ft_token::ft_transfer(
            account.clone(),
            miktar,
            &FTTOKEN,
            0,
            TEK ÇAĞRI İÇİN GAZ
        );
    }
}

}

Bu sözleşmenin sorunu, registered dizisinin boyutunun bir sınırının olmaması ve kötü niyetli kullanıcılar tarafından aşırı büyütülebilmesidir; bu da distribute_token fonksiyonunun Gaz tüketiminin çok yüksek olmasına neden olmaktadır.

Önerilen çözüm:

Çekim modunu kullanarak sözleşmeyi yeniden yapılandırın. Kullanıcıların ödülleri almak için çekim fonksiyonunu aktif hale getirmelerine izin verin, sözleşme yalnızca kullanıcıların çekebileceği ödül miktarını kaydetmelidir.

2. Akıllı sözleşmeler arası durum bağımlılığı nedeniyle tıkanma

Bir ihale aklı sözleşmesi düşünün:

pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec\u003caccountid\u003e, pub bid_price: UnorderedMap\u003caccountid,balance\u003e, mevcut_lider: AccountId, en yüksek teklif: u128, pub iade: bool }

impl Sözleşme { PromiseOrValue { assert!(miktar > self.en_yüksek_teklif); eğer self.current_leader == DEFAULT_ACCOUNT { self.current_leader = sender_id; self.highest_bid = amount; } else { ext_ft_token::account_exist( self.current_leader.clone)(, &FTTOKEN, 0, env::ön ödenmiş_gas() - TEK_ARAMA_IÇIN_GAS * 4, (.then)ext_self::account_resolve) gönderen_id, miktar, &env::current_account_id((, 0, GAS_FOR_SINGLE_CALL * 3, (); } log!) "Mevcut en yüksek teklifi veren: {} En yüksek teklif: {}", self.current_leader, self.highest_bid ); PromiseOrValue::Value(0) }

#(
pub fn account_resolve)&mut self, sender_id: AccountId, amount: u128[private] {
    eşleşme env::promise_result(0) {
        PromiseResult::NotReady => unreachable!(),
        PromiseResult::Successful(_) => {
            ext_ft_token::ft_transfer(
                self.current_leader.clone)(,
                self.en yüksek teklif,
                &FTTOKEN,
                0,
                GAS_FOR_SINGLE_CALL * 2,
            (;
            self.current_leader = sender_id;
            self.en yüksek teklif = miktar;
        }
        PromiseResult::Başarısız => {
            ext_ft_token::ft_transfer)
                sender_id.clone)(,
                miktar,
                &FTTOKEN,
                0,
                GAS_FOR_SINGLE_CALL * 2,
            (;
            log!)"Mevcut teklifi geri gönder");
        }
    };
}

}

Sözleşmenin sorunu şudur: En yüksek teklifi güncellemek için önceki teklif sahibinin token'larının başarıyla geri iade edilmesi gerekmektedir. Eğer önceki teklif sahibi hesabını iptal ederse, sözleşme geri ödeme işlemini tamamlayamaz ve tıkanır.

Çözüm:

Dış sözleşme çağrılarının başarısız olabileceği durumları göz önünde bulundurarak, makul bir hata işleme uygulayın. Geri alınamayan tokenleri sözleşmede geçici olarak saklayabilir, daha sonra kullanıcıların bunları aktif olarak almasına izin verebilirsiniz.

3. Akıllı sözleşme sahibi özel anahtarı kayboldu

Bazı sözleşme işlevleri yalnızca sahibi tarafından yürütülecek şekilde ayarlanmıştır ve kritik sistem değişkenlerini değiştirmek için kullanılır. Eğer sahibin özel anahtarı kaybolursa, bu işlevler çağrılamaz ve sözleşmenin düzgün çalışmamasına neden olabilir.

Çözüm:

Birden fazla sözleşme sahibini ortak yönetim için ayarlayın veya merkezi olmayan yönetimi sağlamak için tek bir sahibin yetki kontrolünü yerine getirmek üzere çoklu imza mekanizması kullanın.

<accountid,balance><accountid,>

View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • 8
  • Share
Comment
0/400
WhaleWatchervip
· 07-20 17:14
Sözleşme, ancak bir elekse saldırıya uğrayabilir.
View OriginalReply0
CryptoSourGrapevip
· 07-20 17:08
Eğer bu açığı daha erken bilseydim, neden şimdi her gün acınası bir duruma düşeyim?
View OriginalReply0
PancakeFlippavip
· 07-18 18:19
Sözleşmelerin de bir eşiği var, kimse seni kötü teknikle suçlayamaz.
View OriginalReply0
LazyDevMinervip
· 07-17 19:29
Kod yazma işini bir sonraki hayatta konuşalım 8
View OriginalReply0
NftPhilanthropistvip
· 07-17 19:28
aslında... *çay yudumlar* sosyal etki için optimize edilebilecek başka bir gaz-ineffisiyent sözleşme. geliştiriciler ne zaman dikkatli kodlama uygulamalarını öğrenecek smh
View OriginalReply0
just_another_walletvip
· 07-17 19:20
Güvenlik sorunları, kardeşlerim, ciddiye alınmalı.
View OriginalReply0
NFTragedyvip
· 07-17 19:16
Bu sorunun kodu henüz tamamlanmadı...
View OriginalReply0
HalfBuddhaMoneyvip
· 07-17 19:01
Aman Tanrım, yine delikleri kapatmam gerekiyor, çöplük sözleşmesi.
View OriginalReply0
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate app
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)