漏洞分析
如果这俩情况同时发生在同一函数上,就意味着所有人都可以调用这个函数来获得合约的余额,当然,也不一定是析构函数,其他涉及敏感操作的函数(比如未鉴权的合约所有人转移、初始化等)暴露也会造成严重的后果
代码片段
function destroycontract(address _to){
selfdestruct(_to);
}
这个函数是销毁合约的函数,但是却没有进行修饰,导致任何人都可以调用这个函数来销毁合约
代码调试
https://cn.etherscan.com/address/0xb5c0e43a6330b9eb904ec57ea24d70269ae4652e#code
部署 Zapit 合约
先随便试试,是正常可用的
用第二个账户销毁合约
再看看已经没法用了
漏洞防范
对于敏感操作要严格控制权限,还是要仔细吧。。。
漏洞概述
主要是指依赖时间戳的合约,比如一个抽奖的合约,会根据当前时间戳与一些其他的变量计算出来“幸运数”,如果参与者拥有幸运数相同的编码就可以拿到奖品,那么矿工在挖矿的过程中,可以提前尝试不同的时间戳,把奖品送给自己想送给的人
相关案例
鉴于没法在 remix IDE 中复现,来说个案例,GovernMental 一个“庞氏骗局”合约会在一轮合约内向最后一个加入合约的玩家(需要至少加入一分钟)进行支付,因此,作为矿工的玩家可以调整时间戳,让合约以为该玩家已经加入超过一分钟了