Analisis Mendalam tentang Serangan Penolakan Layanan dalam Kontrak Pintar
denial-of-service attack(DoS) dapat menyebabkan smart contract tidak dapat digunakan dengan baik sementara atau secara permanen. Penyebab utama termasuk:
Logika kontrak memiliki cacat. Misalnya, beberapa fungsi publik tidak mempertimbangkan kompleksitas perhitungan, yang mungkin melebihi batas Gas dan menyebabkan transaksi gagal.
Dalam pemanggilan kontrak lintas, eksekusi kontrak bergantung pada status kontrak eksternal. Eksekusi kontrak eksternal yang tidak dapat diandalkan dapat menghalangi jalannya kontrak ini, seperti dana pengguna yang ter鎖 dan tidak dapat ditarik.
Faktor manusia, seperti pemilik kontrak yang kehilangan kunci pribadinya, menyebabkan beberapa fungsi istimewa tidak dapat dipanggil, dan status sistem yang penting tidak dapat diperbarui.
Berikut adalah analisis kerentanan serangan denial-of-service (DoS) dengan contoh konkret:
1. Menelusuri struktur data besar yang dapat diubah dari luar
Berikut adalah kontrak sederhana untuk memberikan "dividen" kepada pengguna:
untuk cur_account dalam 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!("Coba distribusikan ke akun {}", &cur_account);
ext_ft_token::ft_transfer(
cur_account.clone(),
jumlah,
&FTTOKEN,
0,
GAS_FOR_SINGLE_CALL
);
}
}
Data status kontrak ini self.registered tidak memiliki batasan ukuran, dapat dikendalikan oleh pengguna jahat. Ketika jumlah pengguna terdaftar terlalu banyak, pelaksanaan distribute_token mungkin melebihi batas Gas yang menyebabkan transaksi gagal.
Disarankan untuk mengubah mode penarikan: tidak secara aktif membagikan dividen kepada semua pengguna, tetapi mencatat dan mengatur fungsi withdraw agar pengguna dapat menarik hadiah mereka sendiri.
2. Ketergantungan Status Antara Kontrak Menyebabkan Terblokir
Kontrak ini mengharuskan pengembalian token dari penawar tertinggi sebelumnya untuk memperbarui penawaran tertinggi. Jika yang sebelumnya membatalkan akun di kontrak eksternal, maka sistem tidak akan dapat memperbarui penawar tertinggi.
Disarankan untuk menambahkan mekanisme penanganan kesalahan, seperti menyimpan token yang tidak dapat dikembalikan ke akun lost_found di kontrak, dan kemudian memungkinkan pengguna untuk menariknya.
3. Pemilik kunci pribadi hilang
Beberapa fungsi kontrak diatur agar hanya dapat dijalankan oleh pemilik, digunakan untuk mengubah variabel sistem yang krusial. Ketika pemilik tidak dapat menjalankan tugas ( seperti kehilangan kunci pribadi ), hal ini dapat menyebabkan dana terkunci atau transaksi terhenti.
Disarankan untuk menggunakan mekanisme multi-signature sebagai pengganti kontrol hak pemilik tunggal, untuk mewujudkan pemerintahan terdesentralisasi.
Oleh karena itu, dalam pengembangan kontrak, harus mempertimbangkan berbagai potensi risiko penolakan layanan (DoS), mengambil langkah-langkah pencegahan yang sesuai, dan memastikan kontrak berfungsi stabil dalam jangka panjang.
</accountid,balance></accountid,>
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
5 Suka
Hadiah
5
7
Bagikan
Komentar
0/400
DeFiChef
· 4jam yang lalu
Penambangan ini tidak lagi populer, setiap hari hanya DoS yang merusak.
Lihat AsliBalas0
PrivacyMaximalist
· 19jam yang lalu
Kunci Pribadi hilang, jadi g. Siapa yang mengerti?
Lihat AsliBalas0
GmGnSleeper
· 19jam yang lalu
Ini lagi kesalahan biaya Gas
Lihat AsliBalas0
NFTHoarder
· 19jam yang lalu
Lagi-lagi ada saudara yang kehilangan Kunci Pribadi ya?
Lihat AsliBalas0
NFTArchaeologis
· 19jam yang lalu
Kelemahan smart contract dari era Gas War awal, benar-benar merupakan bahan arsip digital yang patut disimpan.
Lihat AsliBalas0
MemeCurator
· 19jam yang lalu
Apakah ada lagi orang yang kontraknya diretas? Kekurangan kontrak yang begitu jelas seharusnya sudah dihindari.
Lihat AsliBalas0
CompoundPersonality
· 19jam yang lalu
Koordinat on-chain ape terbaring kemungkinan besar sedang bermain smart contract dan mengurus keamanan kedua hal ini.
Penjelasan mendetail tentang tiga kerentanan serangan DoS pada smart contract dan strategi pencegahannya
Analisis Mendalam tentang Serangan Penolakan Layanan dalam Kontrak Pintar
denial-of-service attack(DoS) dapat menyebabkan smart contract tidak dapat digunakan dengan baik sementara atau secara permanen. Penyebab utama termasuk:
Logika kontrak memiliki cacat. Misalnya, beberapa fungsi publik tidak mempertimbangkan kompleksitas perhitungan, yang mungkin melebihi batas Gas dan menyebabkan transaksi gagal.
Dalam pemanggilan kontrak lintas, eksekusi kontrak bergantung pada status kontrak eksternal. Eksekusi kontrak eksternal yang tidak dapat diandalkan dapat menghalangi jalannya kontrak ini, seperti dana pengguna yang ter鎖 dan tidak dapat ditarik.
Faktor manusia, seperti pemilik kontrak yang kehilangan kunci pribadinya, menyebabkan beberapa fungsi istimewa tidak dapat dipanggil, dan status sistem yang penting tidak dapat diperbarui.
Berikut adalah analisis kerentanan serangan denial-of-service (DoS) dengan contoh konkret:
1. Menelusuri struktur data besar yang dapat diubah dari luar
Berikut adalah kontrak sederhana untuk memberikan "dividen" kepada pengguna:
karat #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub terdaftar: Vec, pub accounts: UnorderedMap\u003caccountid, balance=""\u003e, }
pub fn register_account(&mut self) { jika self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Akun sudah terdaftar".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); } log!("Akun terdaftar {}", env::predecessor_account_id()); }
pub fn distribute_token(&mut self, amount: u128) { assert_eq!(env::predecessor_account_id(), DISTRIBUTOR, "ERR_NOT_ALLOWED");
}
Data status kontrak ini self.registered tidak memiliki batasan ukuran, dapat dikendalikan oleh pengguna jahat. Ketika jumlah pengguna terdaftar terlalu banyak, pelaksanaan distribute_token mungkin melebihi batas Gas yang menyebabkan transaksi gagal.
Disarankan untuk mengubah mode penarikan: tidak secara aktif membagikan dividen kepada semua pengguna, tetapi mencatat dan mengatur fungsi withdraw agar pengguna dapat menarik hadiah mereka sendiri.
2. Ketergantungan Status Antara Kontrak Menyebabkan Terblokir
Pertimbangkan skenario kontrak lelang:
karat #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { 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); jika 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, jumlah, &env::current_account_id((, 0, GAS_FOR_SINGLE_CALL * 3, (); } log!) "pemimpin_saat_ini: {} tawaran_tertinggi: {}", self.current_leader, self.highest_bid ); PromiseOrValue::Value(0) }
#( pub fn account_resolve)&mut self, sender_id: AccountId, amount: u128[private] { cocok 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)(, jumlah, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL * 2, (; log!)"Return Back Now"); } }; }
Kontrak ini mengharuskan pengembalian token dari penawar tertinggi sebelumnya untuk memperbarui penawaran tertinggi. Jika yang sebelumnya membatalkan akun di kontrak eksternal, maka sistem tidak akan dapat memperbarui penawar tertinggi.
Disarankan untuk menambahkan mekanisme penanganan kesalahan, seperti menyimpan token yang tidak dapat dikembalikan ke akun lost_found di kontrak, dan kemudian memungkinkan pengguna untuk menariknya.
3. Pemilik kunci pribadi hilang
Beberapa fungsi kontrak diatur agar hanya dapat dijalankan oleh pemilik, digunakan untuk mengubah variabel sistem yang krusial. Ketika pemilik tidak dapat menjalankan tugas ( seperti kehilangan kunci pribadi ), hal ini dapat menyebabkan dana terkunci atau transaksi terhenti.
Disarankan untuk menggunakan mekanisme multi-signature sebagai pengganti kontrol hak pemilik tunggal, untuk mewujudkan pemerintahan terdesentralisasi.
Oleh karena itu, dalam pengembangan kontrak, harus mempertimbangkan berbagai potensi risiko penolakan layanan (DoS), mengambil langkah-langkah pencegahan yang sesuai, dan memastikan kontrak berfungsi stabil dalam jangka panjang.