xChar

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

Loading comments...