自毁函数 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