Анализ DoS-атак на смарт-контракты: интерпретация случаев и стратегии защиты

Атака типа «отказ в обслуживании» в смарт-контрактах Rust

атака типа «отказ в обслуживании»(DoS)может сделать смарт-контракты недоступными на определенный период времени или даже навсегда. Основные причины включают:

  1. Логика контракта имеет недостатки с высокой вычислительной сложностью, что приводит к превышению лимита потребления газа.

  2. При вызове между контрактами выполнение контракта зависит от внешнего ненадежного контракта, что приводит к блокировке.

  3. Владелец контракта потерял приватный ключ, не может выполнить функции привилегий для обновления важного состояния.

Ниже приведён анализ уязвимости атаки типа «отказ в обслуживании» на конкретных примерах.

1. Обход больших структур данных, контролируемых извне

Вот простой смарт-контракт для "разделения дивидендов" с пользователями:

ржавчина #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] публичная структура Контракт { pub зарегистрированные: Vec, аккаунты пабов: 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()); } иначе { 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.insert(&cur_account, &balance.checked_add(amount).expect("ERR_ADD" )); log!("Попробуйте распределить на счет {}", &cur_account); ext_ft_token::ft_transfer( cur_account.клон(), сумма, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL ); } }

Здесь self.registered размер не ограничен, что может позволить злоумышленникам управлять им и сделать его слишком большим, что приведет к превышению лимита gas-стоимости при выполнении distribute_token.

Решение: не рекомендуется обходить большие структуры данных, контролируемые извне. Можно использовать режим вывода, чтобы пользователи могли самостоятельно забрать "дивиденды".

!

2. Зависимость состояния между смарт-контрактами приводит к блокировке

Рассмотрите контракт «торговые ставки»:

ржавчина #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub зарегистрированные: Vec\u003caccountid\u003e, паб bid_price: UnorderedMap<accountid,balance>, pub current_leader: AccountId, highest_bid паб: U128, Возврат средств в пабе: Bool }

pub fn bid(&mut self, sender_id: AccountId, amount: u128) -> PromiseOrValue { assert!(amount > self.highest_bid); если self.current_leader == DEFAULT_ACCOUNT { self.current_leader = sender_id; self.highest_bid = сумма; } иначе { ext_ft_token::account_exist( self.current_leader.клон(), &FTTOKEN, 0, env::предоплаченный_газ() - ГАЗ_ДЛЯ_ЕДИНОГО_ВЫЗОВА * 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,>

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Поделиться
комментарий
0/400
gaslight_gasfeezvip
· 7ч назад
Муравьи за газовые сборы объединились.
Посмотреть ОригиналОтветить0
ImpermanentTherapistvip
· 7ч назад
Снова шпионят за внешними контрактами.
Посмотреть ОригиналОтветить0
WealthCoffeevip
· 7ч назад
Снова вопросы с газовыми сборами, уже достали.
Посмотреть ОригиналОтветить0
LiquidationTherapistvip
· 7ч назад
Заключен контракт, просто и ясно.
Посмотреть ОригиналОтветить0
SquidTeachervip
· 7ч назад
Вы действительно допускаете такую примитивную ошибку, как потеря Закрытого ключа?
Посмотреть ОригиналОтветить0
BlockTalkvip
· 7ч назад
Закрытый ключ потерять действительно страшно
Посмотреть ОригиналОтветить0
CryptoAdventurervip
· 7ч назад
Снова смарт-контракты рухнули, Адрес Кошелька в огне, брат.
Посмотреть ОригиналОтветить0
  • Закрепить