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:
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.
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.
İ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)
}
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.
16 Likes
Reward
16
8
Share
Comment
0/400
WhaleWatcher
· 07-20 17:14
Sözleşme, ancak bir elekse saldırıya uğrayabilir.
View OriginalReply0
CryptoSourGrape
· 07-20 17:08
Eğer bu açığı daha erken bilseydim, neden şimdi her gün acınası bir duruma düşeyim?
View OriginalReply0
PancakeFlippa
· 07-18 18:19
Sözleşmelerin de bir eşiği var, kimse seni kötü teknikle suçlayamaz.
View OriginalReply0
LazyDevMiner
· 07-17 19:29
Kod yazma işini bir sonraki hayatta konuşalım 8
View OriginalReply0
NftPhilanthropist
· 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_wallet
· 07-17 19:20
Güvenlik sorunları, kardeşlerim, ciddiye alınmalı.
View OriginalReply0
NFTragedy
· 07-17 19:16
Bu sorunun kodu henüz tamamlanmadı...
View OriginalReply0
HalfBuddhaMoney
· 07-17 19:01
Aman Tanrım, yine delikleri kapatmam gerekiyor, çöplük sözleşmesi.
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:
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.
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.
İ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()); }
}
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) }
}
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.