自毀函數 selfdestruct 是智能合約一個具有潛在危險性的功能,黑客可以通過多種手段利用它進行惡意攻擊。本文將通過程式碼實例分析 selfdestruct 攻擊方式,以及如何通過安全編碼防範這類攻擊。
攻擊者可以通過調用目標合約的 selfdestruct 函數破壞合約。例如:
contract Target {
  address owner;
  function selfDestruct() public {
    require(msg.sender == owner);  
    selfdestruct(owner);
  }
}
contract Attacker {
  function attack(Target target) public {
    target.selfDestruct();
  }
}
上例中,攻擊者調用公開的 selfDestruct 函數,如果擁有 owner 權限就可以刪除 Target 合約。
另一個場景是攻擊者通過繼承獲取對 selfdestruct 的訪問權限。例如:
contract Base {
  function selfDestruct() internal {
    selfdestruct(msg.sender);
  }
}
// 惡意繼承
contract Attacker is Base {
  function attack() public {
    selfDestruct();
  }
}
解決辦法
對自毀函數加訪問控制,只允許所有者調用
不設置公開可調用的自毀函數,避免被惡意合約繼承
將危險函數設為內部函數 internal
