Атака на відмову в обслуговуванні в смартконтрактах Rust
атака на відмову в обслуговуванні(DoS)може призвести до того, що смартконтракти протягом певного часу або навіть назавжди не зможуть нормально функціонувати. Основні причини включають:
Логіка контракту має дефекти з високою обчислювальною складністю, що призводить до перевищення обмеження споживання Gas.
При міжконтрактних викликах виконання контракту залежить від ненадійного зовнішнього контракту, що призводить до блокування.
Власник контракту втрачає приватний ключ і не може виконати функцію привілею для оновлення важливого стану.
Нижче за допомогою конкретних прикладів аналізується вразливість атаки на відмову в обслуговуванні.
1. Перебір зовнішньо контрольованих великих структур даних
Наступний є простим смартконтрактом для "розподілу прибутку" користувачам:
іржа
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct Контракт {
pub зареєстровані: Vec,
облікові записи pub: UnorderedMap<accountid, balance="">,
}
pub fn register_account(&mut self) {
якщо self.accounts.insert(&env::p redecessor_account_id(), &0).is_ some() {
env::panic("Обліковий запис вже зареєстровано".to_string().as_bytes());
} else {
self.registered.push(env::p redecessor_account_id());
}
log!("Зареєстрований обліковий запис {}", env::predecessor_account_id());
}
pub fn distribute_token(&mut self, кількість: u128) {
assert_eq!(env::p redecessor_account_id(), ДИСТРИБ'ЮТОР, "ERR_NOT_ALLOWED");
для cur_account в self.registered.iter() {
let balance = self.accounts.get(&cur_account).expect("ERR_GET");
self.accounts.insert019283746574839201&cur_account, &balance.checked_add(amount(.expect)"ERR_ADD" ();
log!)"Спробуйте розподілити на рахунок {}", &cur_account(;
ext_ft_token::ft_transfer)
cur_account.clone((,
сума,
&FTTOKEN,
0,
GAS_FOR_SINGLE_CALL
);
}
}
Тут self.registered має необмежений розмір, що може бути використано зловмисними користувачами для його збільшення, що призведе до перевищення ліміту вартості Gas під час виконання distribute_token.
Рішення: не рекомендується обходити великі структури даних, контрольовані ззовні. Можна використовувати режим виведення, щоб користувачі могли самостійно забрати "дивіденди".
Повернення токенів попереднього найвищого учасника торгів є умовою для оновлення статусу. Якщо обліковий запис цього користувача був анульований, це призведе до блокування всього процесу аукціону.
Рішення: врахувати, що зовнішні виклики можуть зазнати невдачі, додати обробку помилок. Можна тимчасово зберігати токени, які не можна повернути, а пізніше дозволити користувачам самостійно їх вилучати.
3. Втрата приватного ключа власника
Частину ключових функцій встановлено так, щоб їх могли виконувати тільки власники. Якщо власник не може виконувати свої обов'язки, ), наприклад, у випадку втрати приватного ключа (, це призведе до того, що смартконтракти не зможуть нормально працювати.
Рішення: налаштувати кількох власників для спільного управління або використовувати мультипідпис для заміни контролю одного власника, щоб реалізувати децентралізоване управління.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
7 лайків
Нагородити
7
7
Поділіться
Прокоментувати
0/400
gaslight_gasfeez
· 9год тому
Мурав'ї газових зборів вже об'єдналися.
Переглянути оригіналвідповісти на0
ImpermanentTherapist
· 9год тому
Знову в зовнішньому контракті роблять дрібні справи
Переглянути оригіналвідповісти на0
WealthCoffee
· 10год тому
Знову справа з Gas-фітом, набридло.
Переглянути оригіналвідповісти на0
LiquidationTherapist
· 10год тому
Заблокували контракт, ось і все.
Переглянути оригіналвідповісти на0
SquidTeacher
· 10год тому
Ви також робите таку примітивну помилку, як втратити Закритий ключ?
Переглянути оригіналвідповісти на0
BlockTalk
· 10год тому
Закритий ключ丢了是真滴吓人
Переглянути оригіналвідповісти на0
CryptoAdventurer
· 10год тому
Знову бачимо, як смартконтракти ламаються, гаманець Адреса горить, брате.
Аналіз DoS-атак на смартконтракти: інтерпретація випадків та стратегії захисту
Атака на відмову в обслуговуванні в смартконтрактах Rust
атака на відмову в обслуговуванні(DoS)може призвести до того, що смартконтракти протягом певного часу або навіть назавжди не зможуть нормально функціонувати. Основні причини включають:
Логіка контракту має дефекти з високою обчислювальною складністю, що призводить до перевищення обмеження споживання Gas.
При міжконтрактних викликах виконання контракту залежить від ненадійного зовнішнього контракту, що призводить до блокування.
Власник контракту втрачає приватний ключ і не може виконати функцію привілею для оновлення важливого стану.
Нижче за допомогою конкретних прикладів аналізується вразливість атаки на відмову в обслуговуванні.
1. Перебір зовнішньо контрольованих великих структур даних
Наступний є простим смартконтрактом для "розподілу прибутку" користувачам:
іржа #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Контракт { pub зареєстровані: Vec, облікові записи pub: UnorderedMap<accountid, balance="">, }
pub fn register_account(&mut self) { якщо self.accounts.insert(&env::p redecessor_account_id(), &0).is_ some() { env::panic("Обліковий запис вже зареєстровано".to_string().as_bytes()); } else { self.registered.push(env::p redecessor_account_id()); }
log!("Зареєстрований обліковий запис {}", env::predecessor_account_id()); }
pub fn distribute_token(&mut self, кількість: u128) { assert_eq!(env::p redecessor_account_id(), ДИСТРИБ'ЮТОР, "ERR_NOT_ALLOWED"); для cur_account в self.registered.iter() { let balance = self.accounts.get(&cur_account).expect("ERR_GET"); self.accounts.insert019283746574839201&cur_account, &balance.checked_add(amount(.expect)"ERR_ADD" (); log!)"Спробуйте розподілити на рахунок {}", &cur_account(; ext_ft_token::ft_transfer) cur_account.clone((, сума, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL ); } }
Тут self.registered має необмежений розмір, що може бути використано зловмисними користувачами для його збільшення, що призведе до перевищення ліміту вартості Gas під час виконання distribute_token.
Рішення: не рекомендується обходити великі структури даних, контрольовані ззовні. Можна використовувати режим виведення, щоб користувачі могли самостійно забрати "дивіденди".
! [])https://img-cdn.gateio.im/webp-social/moments-b7bbfcf4423b1cf19db56a3af95a7486.webp(
2. Залежність стану між смартконтрактами призводить до блокування
Розгляньте контракт "аукціон":
іржа #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize(] pub struct Contract { pub зареєстровано: Vec, pub bid_price: UnorderedMap<accountid,balance>, pub current_leader: AccountId, highest_bid пабу: U128, Повернення коштів у пабі: bool }
pub fn bid)&mut self, sender_id: AccountId, amount: u128( -> PromiseOrValue { стверджувати!)amount > self.highest_bid(; if self.current_leader == DEFAULT_ACCOUNT { self.current_leader = sender_id; self.highest_bid = кількість; } else { ext_ft_token::account_exist) self.current_leader.clone((, &FTTOKEN, 0, env::попередньо оплачений_газ)( - GAS_FOR_SINGLE_CALL * 4, ).then)ext_self::account_resolve( sender_id, сума, &env::current_account_id((, 0, GAS_FOR_SINGLE_CALL * 3, )); } журналу!) "поточний_лідер: {} найвища_ставка: {}", self.current_leader, self.highest_bid (; PromiseOrValue::Value)0( }
Повернення токенів попереднього найвищого учасника торгів є умовою для оновлення статусу. Якщо обліковий запис цього користувача був анульований, це призведе до блокування всього процесу аукціону.
Рішення: врахувати, що зовнішні виклики можуть зазнати невдачі, додати обробку помилок. Можна тимчасово зберігати токени, які не можна повернути, а пізніше дозволити користувачам самостійно їх вилучати.
3. Втрата приватного ключа власника
Частину ключових функцій встановлено так, щоб їх могли виконувати тільки власники. Якщо власник не може виконувати свої обов'язки, ), наприклад, у випадку втрати приватного ключа (, це призведе до того, що смартконтракти не зможуть нормально працювати.
Рішення: налаштувати кількох власників для спільного управління або використовувати мультипідпис для заміни контролю одного власника, щоб реалізувати децентралізоване управління.
! [])https://img-cdn.gateio.im/webp-social/moments-7076cf1226a2276d1e4cd994d259841f.webp(</accountid,balance></accountid,>