skka3134

skka3134

email
telegram

智能合约安全:5.selfdestruct

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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。