自毀函數 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