智能合约安全：5.selfdestruct

自毁函数 selfdestruct 是智能合约一个具有潜在危险性的功能，黑客可以通过多种手段利用它进行恶意攻击。本文将通过代码实例分析 selfdestruct 攻击方式，以及如何通过安全编码防范这类攻击。

攻击者可以通过调用目标合约的 selfdestruct 函数破坏合约。例如:

Copy
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 的访问权限。例如:

Copy
contract Base {
function selfDestruct() internal {
selfdestruct(msg.sender);
}
}

// 恶意继承
contract Attacker is Base {
function attack() public {
selfDestruct();
}
}

解决办法
对自毁函数加访问控制，只允许所有者调用
不设置公开可调用的自毁函数，避免被恶意合约继承
将危险函数设为内部函数 internal