Bagaimana Menghindari Kontrak Cerdas dari Clutch of Reentrancy Attacks? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.

Bagaimana Menghindari Kontrak Cerdas dari Clutch of Reentrancy Attacks?

Waktu Baca: 6 menit

Jika kita melihat lebih dekat ke peretasan crypto terbesar dan angka-angka menakjubkan yang hilang darinya, mereka akan mengakar dari kekurangan pengkodean.

Salah satu kejadian umum kerentanan keamanan adalah serangan Reentrancy. Namun, efek destruktif yang disebabkan karena salah penanganan reentrancy mungkin tidak sesederhana meluncurkan serangan itu sendiri.

Meskipun menjadi masalah yang akrab dan dipublikasikan dengan baik, kemunculan bug Reentrancy dalam kontrak pintar selalu tak terelakkan. 

Seberapa sering kerentanan Reentrancy dieksploitasi oleh peretas dalam beberapa tahun terakhir? Bagaimana cara kerjanya? Bagaimana cara menahan kontrak pintar dari kehilangan dana karena bug Reentrancy? Temukan jawaban atas pertanyaan-pertanyaan ini di blog ini.

Jadi, tak lama lagi, mari kita memoles serangan re-entrancy terbesar di memori. 

Beberapa Hacks Reentrancy Real-time Paling Terkenal 

Serangan reentrancy yang menyebabkan efek paling buruk pada proyek akhirnya melakukan salah satu dari dua atau bahkan keduanya. 

  • Tiriskan Eter sepenuhnya dari kontrak pintar
  • Peretas menyelinap masuk ke kode kontrak pintar

Kita sekarang dapat mengamati beberapa kasus serangan Reentrancy dan dampaknya. 

Juni 2016: serangan DAO โ€“ 3.54 juta atau $150 juta Eter

April 2020: Peretasan Uniswap/Lendf.Me โ€“ $25 juta

May 2021: Peretasan BurgerSwap โ€“ $7.2M

2021 Agustus Peretasan CREAM FINANCE โ€“ $18.8 juta

Maret 2022: Ola Finance โ€“ $3.6 juta

Juli 2022: Protokol OMNI โ€“ $1.43M

Sangat jelas bahwa serangan Reentrancy tidak pernah ketinggalan zaman. Mari kita mendapatkan wawasan yang mendalam ke dalamnya dalam bagian-bagian berikut. 

Ikhtisar serangan Reentrancy

Seperti dari nama โ€œReentrancyโ€, yang berarti โ€œMasuk lagi dan lagi.โ€ Serangan reentrancy melibatkan dua kontrak: Kontrak korban dan kontrak Penyerang. 

Kontrak penyerang mengeksploitasi kerentanan reentrancy dalam kontrak korban. Ia menggunakan fungsi penarikan untuk mencapainya. 

Kontrak penyerang memanggil fungsi penarikan untuk mengalirkan dana dari kontrak korban dengan melakukan panggilan berulang sebelum saldo dalam kontrak korban diperbarui. Kontrak korban akan memeriksa saldo, mengirim dana dan memperbarui saldo. 

Namun dalam jangka waktu pengiriman dana dan memperbarui saldo dalam kontrak, kontrak penyerang membuat panggilan terus-menerus untuk menarik dana. Akibatnya, saldo tidak diperbarui dalam kontrak korban sampai kontrak penyerang menghabiskan semua dana.

Tingkat keparahan dan biaya eksploitasi reentrancy mengingatkan kebutuhan mendesak untuk melakukan audit kontrak pintar untuk mengesampingkan kemungkinan mengabaikan kesalahan tersebut. 

Tampilan ilustratif dari Reentrancy Attack

Mari kita pahami konsep serangan reentrancy dari ilustrasi sederhana di bawah ini. 

Berikut adalah dua kontrak: Kontrak rentan dan kontrak Peretas

Kontrak peretas membuat panggilan untuk menarik diri dari kontrak rentan. Saat menerima panggilan, kontrak rentan memeriksa dana dalam kontrak peretas dan kemudian mentransfer dana tersebut ke peretas. 

Peretas menerima dana dan menerapkan fungsi fallback, yang memanggil lagi ke dalam kontrak rentan bahkan sebelum saldo diperbarui dalam kontrak rentan. Jadi mengulangi operasi yang sama, peretas menarik dana sepenuhnya dari kontrak yang rentan. 

Bagaimana Menghindari Kontrak Cerdas dari Clutch of Reentrancy Attacks?

Fitur Fungsi Fallback Digunakan Oleh Penyerang 

  • Mereka dapat dipanggil secara eksternal. Yaitu mereka tidak dapat dipanggil dari dalam kontrak yang mereka tulis
  • Fungsi tanpa nama
  • Fungsi fallback tidak menyertakan logika arbitrer di dalamnya
  • Fallback dipicu saat ETH dikirim ke kontrak pintar terlampirnya, dan tidak ada fungsi receiver() yang dideklarasikan.

Menganalisis Serangan Masuk Kembali Dari Pandangan Teknis 

Mari kita ambil contoh kontrak dan pahami bagaimana serangan reentrancy terjadi.

Kontrak Berbahaya

contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value >= 1 ether);
        depositFunds.deposit{value: 1 ether}();
        depositFunds.withdraw();
    }


}

Ini adalah kontrak penyerang di mana penyerang menyetor 2ETH. Penyerang memanggil fungsi penarikan dalam kontrak rentan. Setelah dana diterima dari kontrak rentan, fungsi fallback dipicu. 

Fallback kemudian menjalankan fungsi penarikan dan menguras dana dari kontrak yang rentan. Siklus ini berlangsung sampai dana benar-benar habis dari kontrak yang rentan.

Kontrak Rentan

contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal > 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}

Kontrak rentan memiliki 30ETH. Di sini fungsi withdraw() mengirimkan jumlah yang diminta ke penyerang. Karena saldo tidak diperbarui, token ditransfer ke penyerang berulang kali. 

Jenis Serangan Masuk Kembali

  • Masuk kembali fungsi tunggal 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

msg.sender.call.value(amount)() mentransfer dana setelah fungsi fallback kontrak penyerang memanggil withdraw() lagi sebelum saldo[msg.sender] = 0 diperbarui.

  • Masuk kembali lintas fungsi
function transfer(address to, uint amount) external {
   if (balances[msg.sender] >= amount) {
       balances[to] += amount;
       balances[msg.sender] -= amount;
   }
}
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

Masuk kembali lintas fungsi jauh lebih kompleks untuk diidentifikasi. Perbedaannya di sini adalah bahwa fungsi fallback memanggil transfer, tidak seperti di reentrancy fungsi tunggal, di mana ia memanggil penarikan.

Pencegahan Terhadap Serangan Masuk Kembali

Pola Cek-Efek-Interaksi: Pola cek-efek-interaksi membantu dalam penataan fungsi. 

Program harus dikodekan dengan cara memeriksa kondisi terlebih dahulu. Setelah melewati pemeriksaan, efek pada status kontrak harus diselesaikan, setelah itu fungsi eksternal dapat dipanggil. 

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   require(msg.sender.call.value(amount)());
}

Kode yang ditulis ulang di sini mengikuti pola cek-efek-interaksi. Di sini saldo dibuat nol sebelum melakukan panggilan eksternal. 

Penggunaan pengubah

Pengubah noReentrant yang diterapkan ke fungsi memastikan tidak ada panggilan masuk kembali. 

contract ReEntrancyGuard {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

Pada akhirnya

Langkah paling efektif adalah mengambil audit kontrak pintar dari perusahaan keamanan terkemuka seperti QuillAudits, di mana auditor mengawasi struktur kode dan memeriksa bagaimana fungsi fallback bekerja. Berdasarkan pola yang dipelajari, rekomendasi diberikan untuk merestrukturisasi kode jika tampaknya ada perilaku rentan

Keamanan dana dipastikan tepat sebelum menjadi korban kerugian. 

Pertanyaan Umum (FAQ)

Apa itu serangan reentrancy?

Serangan reentrancy terjadi ketika suatu fungsi dalam kontrak yang rentan membuat panggilan ke kontrak yang tidak tepercaya. Kontrak yang tidak dipercaya akan menjadi kontrak penyerang yang membuat panggilan rekursif ke kontrak yang rentan sampai dana benar-benar habis. 

Apa itu reentrant?

Tindakan masuk kembali berarti mengganggu eksekusi kode dan memulai proses dari awal lagi, yang juga dikenal sebagai masuk kembali.

Apa itu reentrancy guard?

Penjaga reentrancy menggunakan pengubah yang mencegah fungsi dipanggil berulang kali. Baca blog di atas untuk menemukan contoh reentrancy guard.

Apa saja serangan terhadap kontrak pintar?

Kontrak pintar terpapar pada banyak kerentanan, seperti masuk kembali, ketergantungan stempel waktu, luapan aritmatika, serangan DoS, dan sebagainya. Oleh karena itu, audit adalah suatu keharusan untuk memastikan tidak ada bug yang meruntuhkan logika kontrak.

69 views

Stempel Waktu:

Lebih dari Quillhash