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 normal bir şekilde kullanılamamasına neden olabilir. Başlıca birkaç nedeni şunlardır:
Sözleşme mantığında, hesaplama karmaşıklığının çok yüksek olduğuna ve gaz tüketiminin limiti aştığına dair bir kusur vardır.
Sözleşmeler arasında çağrı yapılırken, sözleşmenin yürütülmesi güvenilmez harici sözleşme durumuna dayanır ve bu da tıkanıklığa neden olur.
Sözleşme sahibi özel anahtarı kaybeder ve bu da temel ayrıcalıklı işlevlerin yürütülememesine neden olur.
Aşağıda bu DoS açıklarını analiz etmek için somut örnekler verilmektedir.
1. Harici olarak değiştirilebilen büyük veri yapılarında geçiş yapın
Aşağıdakiler, DoS riski içeren basit bir "temettü" sözleşmesidir:
pas
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct Sözleşme {
pub kayıtlı: Vec,
pub accounts: UnorderedMap\u003caccountid, balance=""\u003e,
}
Eğer önceki teklif sahibinin hesabı yok edildiyse, yeni teklif engellenecektir.
Harici aramaların başarısızlığı göz önüne alındığında, iade edilemeyen jetonlar daha sonra çekilmek üzere sahnelenebilir:
pas
pub fn withdraw_lost_funds(&mut self) {
let account_id = env::predecessor_account_id();
let miktarı = self.lost_funds.get(&account_id).expect("Kayıp para yok");
self.lost_funds.remove(&account_id);
ext_ft_token::ft_transfer(
hesap_id,
miktar,
&FTTOKEN,
0,
TEKÇAĞRI İÇİN GAZ
);
}
!
3. Sahibinin özel anahtarı kayboldu
Bazı anahtar fonksiyonlar yalnızca sözleşme sahibi tarafından çağrılabilir. Eğer sahibi özel anahtarını kaybederse, bu fonksiyonlar yürütülemez.
Sözleşmeyi yönetmek için çoklu imza çözümü kullanılmalı, tek nokta arızasından kaçınılmalıdır:
pas
pub struct MultiSigContract {
sahipler: Vec\u003caccountid\u003e,
gerekli_onaylar: u32,
}
pub fn confirm_transaction(&mut self, transaction_id: u64) {
assert!(self.owners.contains(&env::predecessor_account_id()));
// Onay sayısını artır
// Eğer onay sayısı gereksinimleri karşılıyorsa, işlemi gerçekleştir
}
Yukarıdaki yöntemler, akıllı sözleşmelerdeki hizmet reddi saldırısı riskini etkili bir şekilde önleyebilir.
</accountid,></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.
Rust akıllı sözleşmeler DoS saldırılarına karşı savunma uygulama kılavuzu
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 normal bir şekilde kullanılamamasına neden olabilir. Başlıca birkaç nedeni şunlardır:
Sözleşme mantığında, hesaplama karmaşıklığının çok yüksek olduğuna ve gaz tüketiminin limiti aştığına dair bir kusur vardır.
Sözleşmeler arasında çağrı yapılırken, sözleşmenin yürütülmesi güvenilmez harici sözleşme durumuna dayanır ve bu da tıkanıklığa neden olur.
Sözleşme sahibi özel anahtarı kaybeder ve bu da temel ayrıcalıklı işlevlerin yürütülememesine neden olur.
Aşağıda bu DoS açıklarını analiz etmek için somut örnekler verilmektedir.
1. Harici olarak değiştirilebilen büyük veri yapılarında geçiş yapın
Aşağıdakiler, DoS riski içeren basit bir "temettü" sözleşmesidir:
pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub accounts: UnorderedMap\u003caccountid, balance=""\u003e, }
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::p redecessor_account_id()); } log!("Kayıtlı hesap {}", env::önceki_hesap_id()); }
pub fn distribute_token(&mut öz, miktar: u128) { assert_eq!(env::predecessor_account_id(), DAĞITICI, "ERR_NOT_ALLOWED");
}
Burada self.registered sonsuz bir şekilde genişletilebilir, bu da dolaşım sırasında Gas'ın yetersiz olmasına neden olur.
"Çekim" modunun kullanılması gerektiği, kullanıcıların ödülleri aktif olarak çekmelerini sağlamalı:
pas pub fn withdraw(&mut self) { let account_id = env::predecessor_account_id(); let amount = self.accounts.get(&account_id).expect("No reward");
}
2. Akıllı sözleşmeler arası durum bağımlılıkları nedeniyle tıkanma
Aşağıda bir "teklif" akıllı sözleşmesi bulunmaktadır:
pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub bid_price: UnorderedMap<accountid, balance="">, mevcut_lider: HesapId, en yüksek teklif: u128, pub iade: bool }
pub fn bid(&mut self, sender_id: AccountId, amount: u128) -> PromiseOrValue { assert!(miktar > self.en yüksek teklif);
}
#[private] pub fn account_resolve(&mut self, sender_id: AccountId, amount: u128) { maç env::p romise_result(0) { PromiseResult::NotReady => ulaşılmaz!(), PromiseResult::Başarılı(_) => { ext_ft_token::ft_transfer( self.current_leader.clone(), self.highest_bid, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, ); self.current_leader = sender_id; self.highest_bid = miktar; } PromiseResult::Başarısız => { ext_ft_token::ft_transfer( sender_id.clone(), miktar &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, ); log!("Şimdi Geri Dön"); } }; }
Eğer önceki teklif sahibinin hesabı yok edildiyse, yeni teklif engellenecektir.
Harici aramaların başarısızlığı göz önüne alındığında, iade edilemeyen jetonlar daha sonra çekilmek üzere sahnelenebilir:
pas pub fn withdraw_lost_funds(&mut self) { let account_id = env::predecessor_account_id(); let miktarı = self.lost_funds.get(&account_id).expect("Kayıp para yok");
}
!
3. Sahibinin özel anahtarı kayboldu
Bazı anahtar fonksiyonlar yalnızca sözleşme sahibi tarafından çağrılabilir. Eğer sahibi özel anahtarını kaybederse, bu fonksiyonlar yürütülemez.
Sözleşmeyi yönetmek için çoklu imza çözümü kullanılmalı, tek nokta arızasından kaçınılmalıdır:
pas pub struct MultiSigContract { sahipler: Vec\u003caccountid\u003e, gerekli_onaylar: u32, }
pub fn submit_transaction(&mut self, transaction: Transaction) { assert!(self.owners.contains(&env::predecessor_account_id())); // İşlemi onay bekleyen listeye ekle }
pub fn confirm_transaction(&mut self, transaction_id: u64) { assert!(self.owners.contains(&env::predecessor_account_id())); // Onay sayısını artır // Eğer onay sayısı gereksinimleri karşılıyorsa, işlemi gerçekleştir }
Yukarıdaki yöntemler, akıllı sözleşmelerdeki hizmet reddi saldırısı riskini etkili bir şekilde önleyebilir.