Phân tích sâu về tấn công từ chối dịch vụ trong hợp đồng thông minh
tấn công từ chối dịch vụ(DoS)có thể dẫn đến hợp đồng thông minh tạm thời hoặc vĩnh viễn không thể sử dụng bình thường. Nguyên nhân chính bao gồm:
Logic hợp đồng có khuyết điểm. Ví dụ, một số hàm công khai không xem xét độ phức tạp tính toán, có thể vượt quá giới hạn Gas dẫn đến giao dịch thất bại.
Trong việc gọi hợp đồng chéo, việc thực thi hợp đồng phụ thuộc vào trạng thái của hợp đồng bên ngoài. Việc thực thi hợp đồng bên ngoài không đáng tin cậy có thể cản trở việc chạy hợp đồng này, chẳng hạn như vốn của người dùng bị khóa và không thể nạp hoặc rút.
Yếu tố con người, như việc chủ hợp đồng mất khóa riêng, dẫn đến một số chức năng đặc quyền không thể gọi, trạng thái hệ thống quan trọng không thể cập nhật.
Dưới đây là phân tích lỗ hổng tấn công từ chối dịch vụ (DoS) kết hợp với ví dụ cụ thể:
1. Duyệt qua cấu trúc dữ liệu lớn có thể bị thay đổi từ bên ngoài
Dưới đây là một hợp đồng đơn giản để "chia cổ tức" cho người dùng:
rỉ sét
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct Hợp đồng {
pub registered: Vec\u003caccountid\u003e,
pub accounts: UnorderedMap\u003caccountid, balance=""\u003e,
}
pub fn register_account(&mut self) {
nếu self.accounts.insert(&env::predecessor_account_id(), &0).is_some() {
env::panic("Tài khoản đã được đăng ký".to_string().as_bytes());
} else {
self.registered.push(env::predecessor_account_id());
}
log!("Tài khoản đã đăng ký {}", env::predecessor_account_id());
}
cho cur_account trong self.registered.iter() {
let balance = self.accounts.get(&cur_account).expect("ERR_GET");
self.accounts.insert(\u0026cur_account, \u0026balance.checked_add(amount).expect("ERR_ADD"));
log!("Cố gắng phân phối cho tài khoản {}", &cur_account);
ext_ft_token::ft_transfer(
cur_account.clone(),
số lượng,
&FTTOKEN,
0,
GAS_FOR_SINGLE_CALL
);
}
}
Dữ liệu trạng thái hợp đồng này self.registered không giới hạn kích thước, có thể bị người dùng ác ý thao túng. Khi có quá nhiều người dùng đăng ký, việc thực hiện distribute_token có thể vượt quá giới hạn Gas dẫn đến giao dịch thất bại.
Đề nghị áp dụng chế độ rút tiền cải tiến: không chủ động phân chia lợi nhuận cho tất cả người dùng, mà thay vào đó ghi chép và thiết lập hàm withdraw để người dùng tự rút thưởng.
2. Sự phụ thuộc trạng thái giữa các hợp đồng dẫn đến tắc nghẽn
Hợp đồng này yêu cầu phải trả lại token của người ra giá cao nhất trước đó để cập nhật giá thầu cao nhất. Nếu bên trước đó hủy tài khoản trong hợp đồng bên ngoài, sẽ dẫn đến việc hệ thống không thể cập nhật người ra giá cao nhất.
Đề nghị tăng cường cơ chế xử lý lỗi, như việc chuyển các token không thể hoàn lại vào tài khoản lost_found của hợp đồng, sau đó cho phép người dùng rút.
3. Mất khóa riêng của Chủ sở hữu
Một số hàm hợp đồng được thiết lập chỉ có thể thực hiện bởi owner, dùng để thay đổi các biến hệ thống quan trọng. Khi owner không thể thực hiện nhiệm vụ ( như mất khóa riêng ), có thể dẫn đến việc khóa tiền hoặc tạm dừng giao dịch.
Đề xuất sử dụng cơ chế đa ký thay thế cho quyền kiểm soát của chủ sở hữu đơn lẻ, thực hiện quản trị phi tập trung.
Tóm lại, trong quá trình phát triển hợp đồng, cần xem xét đầy đủ các rủi ro tiềm ẩn về tấn công từ chối dịch vụ, thực hiện các biện pháp phòng ngừa tương ứng để đảm bảo hợp đồng hoạt động ổn định lâu dài.
</accountid,balance></accountid,>
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
5 thích
Phần thưởng
5
7
Chia sẻ
Bình luận
0/400
DeFiChef
· 4giờ trước
Khai thác này không còn hot nữa, ngày nào cũng chỉ có DoS phá hoại.
Xem bản gốcTrả lời0
PrivacyMaximalist
· 19giờ trước
Khóa riêng bị mất thì g rồi, ai hiểu chứ.
Xem bản gốcTrả lời0
GmGnSleeper
· 19giờ trước
Lại là lỗi phí Gas rồi.
Xem bản gốcTrả lời0
NFTHoarder
· 19giờ trước
Lại có anh em mất Khóa riêng rồi phải không?
Xem bản gốcTrả lời0
NFTArchaeologis
· 19giờ trước
Lỗ hổng hợp đồng thông minh trong thời kỳ Gas War đầu tiên, thực sự là một tài liệu khảo cổ số đáng để gìn giữ.
Xem bản gốcTrả lời0
MemeCurator
· 19giờ trước
Lại có người bị hack hợp đồng sao? Lỗi hợp đồng rõ ràng như vậy mà đã nên tránh từ lâu rồi.
Xem bản gốcTrả lời0
CompoundPersonality
· 19giờ trước
tọa độ on-chain ape nằm phẳng vận động viên có khả năng cao đang chơi hợp đồng thông minh và làm bảo mật hai việc này
Ba lỗ hổng DoS tấn công hợp đồng thông minh và chiến lược phòng ngừa
Phân tích sâu về tấn công từ chối dịch vụ trong hợp đồng thông minh
tấn công từ chối dịch vụ(DoS)có thể dẫn đến hợp đồng thông minh tạm thời hoặc vĩnh viễn không thể sử dụng bình thường. Nguyên nhân chính bao gồm:
Logic hợp đồng có khuyết điểm. Ví dụ, một số hàm công khai không xem xét độ phức tạp tính toán, có thể vượt quá giới hạn Gas dẫn đến giao dịch thất bại.
Trong việc gọi hợp đồng chéo, việc thực thi hợp đồng phụ thuộc vào trạng thái của hợp đồng bên ngoài. Việc thực thi hợp đồng bên ngoài không đáng tin cậy có thể cản trở việc chạy hợp đồng này, chẳng hạn như vốn của người dùng bị khóa và không thể nạp hoặc rút.
Yếu tố con người, như việc chủ hợp đồng mất khóa riêng, dẫn đến một số chức năng đặc quyền không thể gọi, trạng thái hệ thống quan trọng không thể cập nhật.
Dưới đây là phân tích lỗ hổng tấn công từ chối dịch vụ (DoS) kết hợp với ví dụ cụ thể:
1. Duyệt qua cấu trúc dữ liệu lớn có thể bị thay đổi từ bên ngoài
Dưới đây là một hợp đồng đơn giản để "chia cổ tức" cho người dùng:
rỉ sét #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Hợp đồng { pub registered: Vec\u003caccountid\u003e, pub accounts: UnorderedMap\u003caccountid, balance=""\u003e, }
pub fn register_account(&mut self) { nếu self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Tài khoản đã được đăng ký".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); } log!("Tài khoản đã đăng ký {}", env::predecessor_account_id()); }
pub fn distribute_token(&mut self, amount: u128) { assert_eq!(env::predecessor_account_id(), DISTRIBUTOR, "ERR_NOT_ALLOWED");
}
Dữ liệu trạng thái hợp đồng này self.registered không giới hạn kích thước, có thể bị người dùng ác ý thao túng. Khi có quá nhiều người dùng đăng ký, việc thực hiện distribute_token có thể vượt quá giới hạn Gas dẫn đến giao dịch thất bại.
Đề nghị áp dụng chế độ rút tiền cải tiến: không chủ động phân chia lợi nhuận cho tất cả người dùng, mà thay vào đó ghi chép và thiết lập hàm withdraw để người dùng tự rút thưởng.
2. Sự phụ thuộc trạng thái giữa các hợp đồng dẫn đến tắc nghẽn
Xem xét một tình huống hợp đồng đấu giá:
rỉ sét #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Hợp đồng { pub registered: Vec\u003caccountid\u003e, pub bid_price: UnorderedMap\u003caccountid,balance\u003e, pub current_leader: AccountId, pub highest_bid: u128, pub refund: bool }
PromiseOrValue { assert!(amount > self.highest_bid); nếu 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::prepaid_gas() - GAS_FOR_SINGLE_CALL * 4, (.then)ext_self::account_resolve) sender_id, số lượng, &env::current_account_id((, 0, GAS_FOR_SINGLE_CALL * 3, (); } log!) "current_leader: {} highest_bid: {}", self.current_leader, self.highest_bid ); PromiseOrValue::Value(0) }
#( pub fn account_resolve)&mut self, sender_id: AccountId, amount: u128[private] { match env::promise_result(0) { PromiseResult::NotReady => unreachable!(), PromiseResult::Successful(_) => { 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 = amount; } PromiseResult::Failed => { ext_ft_token::ft_transfer) sender_id.clone)(, số lượng, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, (; log!)"Return Back Now"); } }; }
Hợp đồng này yêu cầu phải trả lại token của người ra giá cao nhất trước đó để cập nhật giá thầu cao nhất. Nếu bên trước đó hủy tài khoản trong hợp đồng bên ngoài, sẽ dẫn đến việc hệ thống không thể cập nhật người ra giá cao nhất.
Đề nghị tăng cường cơ chế xử lý lỗi, như việc chuyển các token không thể hoàn lại vào tài khoản lost_found của hợp đồng, sau đó cho phép người dùng rút.
3. Mất khóa riêng của Chủ sở hữu
Một số hàm hợp đồng được thiết lập chỉ có thể thực hiện bởi owner, dùng để thay đổi các biến hệ thống quan trọng. Khi owner không thể thực hiện nhiệm vụ ( như mất khóa riêng ), có thể dẫn đến việc khóa tiền hoặc tạm dừng giao dịch.
Đề xuất sử dụng cơ chế đa ký thay thế cho quyền kiểm soát của chủ sở hữu đơn lẻ, thực hiện quản trị phi tập trung.
Tóm lại, trong quá trình phát triển hợp đồng, cần xem xét đầy đủ các rủi ro tiềm ẩn về tấn công từ chối dịch vụ, thực hiện các biện pháp phòng ngừa tương ứng để đảm bảo hợp đồng hoạt động ổn định lâu dài.